feat(graph): Implement Graph View with Dagre Layout and Epic Scope (bb-18e)
This commit is contained in:
parent
7ab23448f0
commit
8490cb1d8c
33 changed files with 4936 additions and 38 deletions
87
tests/lib/project-scope.test.ts
Normal file
87
tests/lib/project-scope.test.ts
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
import { resolveProjectScope, type ProjectScopeRegistryEntry } from '../../src/lib/project-scope';
|
||||
|
||||
const REGISTRY: ProjectScopeRegistryEntry[] = [
|
||||
{ path: 'D:/Repos/Alpha' },
|
||||
{ path: 'D:/Repos/Beta' },
|
||||
];
|
||||
|
||||
test('resolveProjectScope defaults to local when query key is missing', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: REGISTRY,
|
||||
});
|
||||
|
||||
assert.equal(scope.mode, 'single');
|
||||
assert.equal(scope.selected.source, 'local');
|
||||
assert.equal(scope.selected.root, 'C:\\Users\\Zenchant\\codex\\beadboard');
|
||||
assert.equal(scope.selected.key, 'local');
|
||||
assert.deepEqual(scope.readRoots, ['C:\\Users\\Zenchant\\codex\\beadboard']);
|
||||
assert.equal(scope.options[0].key, 'local');
|
||||
assert.equal(scope.options.length, 3);
|
||||
});
|
||||
|
||||
test('resolveProjectScope selects registry project when key matches', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: REGISTRY,
|
||||
requestedProjectKey: 'd:\\repos\\beta',
|
||||
});
|
||||
|
||||
assert.equal(scope.selected.source, 'registry');
|
||||
assert.equal(scope.selected.root, 'D:\\Repos\\Beta');
|
||||
assert.equal(scope.selected.key, 'd:\\repos\\beta');
|
||||
assert.deepEqual(scope.readRoots, ['D:\\Repos\\Beta']);
|
||||
});
|
||||
|
||||
test('resolveProjectScope falls back to local when query key is unknown', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: REGISTRY,
|
||||
requestedProjectKey: 'd:\\repos\\missing',
|
||||
});
|
||||
|
||||
assert.equal(scope.selected.source, 'local');
|
||||
assert.equal(scope.selected.key, 'local');
|
||||
assert.deepEqual(scope.readRoots, ['C:\\Users\\Zenchant\\codex\\beadboard']);
|
||||
});
|
||||
|
||||
test('resolveProjectScope deduplicates registry entries by normalized key', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: [{ path: 'D:/Repos/Alpha/' }, { path: 'd:\\repos\\alpha' }],
|
||||
});
|
||||
|
||||
assert.equal(scope.options.length, 2);
|
||||
assert.equal(scope.options.filter((option) => option.source === 'registry').length, 1);
|
||||
});
|
||||
|
||||
test('resolveProjectScope supports aggregate mode and reads all roots', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: REGISTRY,
|
||||
requestedProjectKey: 'd:\\repos\\alpha',
|
||||
requestedMode: 'aggregate',
|
||||
});
|
||||
|
||||
assert.equal(scope.mode, 'aggregate');
|
||||
assert.equal(scope.selected.key, 'd:\\repos\\alpha');
|
||||
assert.deepEqual(scope.readRoots, [
|
||||
'C:\\Users\\Zenchant\\codex\\beadboard',
|
||||
'D:\\Repos\\Alpha',
|
||||
'D:\\Repos\\Beta',
|
||||
]);
|
||||
});
|
||||
|
||||
test('resolveProjectScope falls back to single mode for unknown mode values', () => {
|
||||
const scope = resolveProjectScope({
|
||||
currentProjectRoot: 'C:/Users/Zenchant/codex/beadboard',
|
||||
registryProjects: REGISTRY,
|
||||
requestedMode: 'invalid-mode',
|
||||
});
|
||||
|
||||
assert.equal(scope.mode, 'single');
|
||||
assert.deepEqual(scope.readRoots, ['C:\\Users\\Zenchant\\codex\\beadboard']);
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue