hub-delete-vault.test.mjs
107 lines 3.7 KB
Raw
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd feat(calendar): enforce agent context tiers in retrieval AP… Human minor ⚠ breaking 1 day ago
1 /**
2 * Self-hosted Hub delete vault orchestration (hub/hub-delete-vault.mjs).
3 */
4 import { describe, it, before, after } from 'node:test';
5 import assert from 'node:assert';
6 import path from 'path';
7 import fs from 'fs';
8 import { fileURLToPath } from 'url';
9 import { writeHubVaults } from '../lib/hub-vaults.mjs';
10 import { writeVaultAccess } from '../hub/hub_vault_access.mjs';
11 import { writeScope } from '../hub/hub_scope.mjs';
12 import { createProposal } from '../hub/proposals-store.mjs';
13 import { deleteSelfHostedVault } from '../hub/hub-delete-vault.mjs';
14
15 const __dirname = path.dirname(fileURLToPath(import.meta.url));
16 const root = path.join(__dirname, 'fixtures', 'tmp-delete-vault-root');
17
18 describe('hub-delete-vault (self-hosted)', () => {
19 before(() => {
20 if (fs.existsSync(root)) fs.rmSync(root, { recursive: true });
21 fs.mkdirSync(root, { recursive: true });
22 });
23
24 after(() => {
25 if (fs.existsSync(root)) {
26 try {
27 fs.rmSync(root, { recursive: true });
28 } catch (_) {}
29 }
30 });
31
32 it('rejects deleting default vault id', async () => {
33 const dataDir = path.join(root, 'd1', 'data');
34 fs.mkdirSync(dataDir, { recursive: true });
35 const vDefault = path.join(root, 'd1', 'vault-default');
36 const vWork = path.join(root, 'd1', 'vault-work');
37 fs.mkdirSync(vDefault, { recursive: true });
38 fs.mkdirSync(vWork, { recursive: true });
39 writeHubVaults(
40 dataDir,
41 [
42 { id: 'default', path: vDefault },
43 { id: 'work', path: vWork },
44 ],
45 path.join(root, 'd1'),
46 );
47 await assert.rejects(
48 () =>
49 deleteSelfHostedVault({
50 dataDir,
51 projectRoot: path.join(root, 'd1'),
52 vaultId: 'default',
53 config: { vector_store: 'sqlite-vec', data_dir: dataDir },
54 }),
55 /Cannot delete the default vault/,
56 );
57 });
58
59 it('removes vault directory, yaml entry, access, scope, and proposals', async () => {
60 const base = path.join(root, 'd2');
61 const dataDir = path.join(base, 'data');
62 fs.mkdirSync(dataDir, { recursive: true });
63 const vDefault = path.join(base, 'vault-default');
64 const vWork = path.join(base, 'vault-work');
65 fs.mkdirSync(vDefault, { recursive: true });
66 fs.mkdirSync(vWork, { recursive: true });
67 fs.writeFileSync(path.join(vWork, 'note.md'), '# hi\n', 'utf8');
68 writeHubVaults(
69 dataDir,
70 [
71 { id: 'default', path: vDefault },
72 { id: 'work', path: vWork },
73 ],
74 base,
75 );
76 writeVaultAccess(dataDir, { 'github:1': ['default', 'work'] });
77 writeScope(dataDir, { 'github:1': { work: { projects: ['p'], folders: [] } } });
78 createProposal(dataDir, { path: 'inbox/x.md', vault_id: 'work', body: 'b' });
79
80 const out = await deleteSelfHostedVault({
81 dataDir,
82 projectRoot: base,
83 vaultId: 'work',
84 config: { vector_store: 'sqlite-vec', data_dir: dataDir },
85 });
86 assert.strictEqual(out.ok, true);
87 assert.strictEqual(out.deleted_vault_id, 'work');
88
89 assert.strictEqual(fs.existsSync(vWork), false);
90 const { readHubVaults } = await import('../lib/hub-vaults.mjs');
91 const list = readHubVaults(dataDir, base);
92 assert.strictEqual(list.length, 1);
93 assert.strictEqual(list[0].id, 'default');
94
95 const { readVaultAccess } = await import('../hub/hub_vault_access.mjs');
96 const acc = readVaultAccess(dataDir);
97 assert.deepStrictEqual(acc['github:1'], ['default']);
98
99 const { readScope } = await import('../hub/hub_scope.mjs');
100 const sc = readScope(dataDir);
101 assert.strictEqual(Object.keys(sc).length, 0);
102
103 const { listProposals } = await import('../hub/proposals-store.mjs');
104 const props = listProposals(dataDir, { limit: 100 });
105 assert.strictEqual(props.proposals.length, 0);
106 });
107 });
File History 2 commits
sha256:65ccb454656ea5acdea0a10e559b78bcde1eb6ff753ecc2911bc99d1c3d7cadd feat(calendar): enforce agent context tiers in retrieval AP… Human minor 1 day ago
sha256:9103f98c89257ed2b01c237cea895dabb3e85ea337dccb1161c175e4422355b6 docs: accept Calendar Events v0 spec with Phase 0 security … Human 2 days ago