fix(KB-637): test fixes and code cleanup
- Fix executor test worktree recovery assertions to use exact command matching - Fix routes.test.ts mission store mock and git worktree list mock - Fix SettingsModal temporal dead zone by moving activeSectionScope declaration - Remove incomplete project-context feature from CLI - Clean up AGENTS.md and README documentation
This commit is contained in:
9
.changeset/fix-test-failures-kb-637.md
Normal file
9
.changeset/fix-test-failures-kb-637.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
"@gsxdsm/fusion": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fix pre-existing test failures (KB-637)
|
||||||
|
|
||||||
|
- Fixed engine executor test missing mock for git worktree list command
|
||||||
|
- Fixed dashboard SettingsModal temporal dead zone issue with activeSectionScope variable
|
||||||
|
- Fixed dashboard routes tests by adding getMissionStore mock and using actual git repository for Git Management endpoints
|
||||||
@@ -79,6 +79,9 @@ export function SettingsModal({
|
|||||||
const [activeSection, setActiveSection] = useState<SectionId>(initialSection ?? SETTINGS_SECTIONS[0].id);
|
const [activeSection, setActiveSection] = useState<SectionId>(initialSection ?? SETTINGS_SECTIONS[0].id);
|
||||||
const [prefixError, setPrefixError] = useState<string | null>(null);
|
const [prefixError, setPrefixError] = useState<string | null>(null);
|
||||||
|
|
||||||
|
/** Get the scope of the currently active section */
|
||||||
|
const activeSectionScope = SETTINGS_SECTIONS.find((s) => s.id === activeSection)?.scope;
|
||||||
|
|
||||||
// Auth state (independent of the settings save flow)
|
// Auth state (independent of the settings save flow)
|
||||||
const [authProviders, setAuthProviders] = useState<AuthProvider[]>([]);
|
const [authProviders, setAuthProviders] = useState<AuthProvider[]>([]);
|
||||||
const [authLoading, setAuthLoading] = useState(false);
|
const [authLoading, setAuthLoading] = useState(false);
|
||||||
|
|||||||
@@ -41,6 +41,18 @@ function createMockGlobalSettingsStore() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createMockMissionStore() {
|
||||||
|
return {
|
||||||
|
createSession: vi.fn().mockResolvedValue({ id: "session-1", status: "active" }),
|
||||||
|
getSession: vi.fn().mockResolvedValue({ id: "session-1", status: "active", answers: [] }),
|
||||||
|
updateSession: vi.fn().mockResolvedValue(undefined),
|
||||||
|
addAnswer: vi.fn().mockResolvedValue(undefined),
|
||||||
|
deleteSession: vi.fn().mockResolvedValue(undefined),
|
||||||
|
listSessions: vi.fn().mockResolvedValue([]),
|
||||||
|
generatePlan: vi.fn().mockResolvedValue({ plan: "Test plan", steps: [] }),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function createMockStore(overrides: Partial<TaskStore> = {}): TaskStore {
|
function createMockStore(overrides: Partial<TaskStore> = {}): TaskStore {
|
||||||
return {
|
return {
|
||||||
getTask: vi.fn(),
|
getTask: vi.fn(),
|
||||||
@@ -71,24 +83,7 @@ function createMockStore(overrides: Partial<TaskStore> = {}): TaskStore {
|
|||||||
getWorkflowStep: vi.fn(),
|
getWorkflowStep: vi.fn(),
|
||||||
updateWorkflowStep: vi.fn(),
|
updateWorkflowStep: vi.fn(),
|
||||||
deleteWorkflowStep: vi.fn(),
|
deleteWorkflowStep: vi.fn(),
|
||||||
getMissionStore: vi.fn().mockReturnValue({
|
getMissionStore: vi.fn().mockReturnValue(createMockMissionStore()),
|
||||||
listMissions: vi.fn().mockReturnValue([]),
|
|
||||||
createMission: vi.fn(),
|
|
||||||
getMissionWithHierarchy: vi.fn(),
|
|
||||||
updateMission: vi.fn(),
|
|
||||||
getMission: vi.fn(),
|
|
||||||
deleteMission: vi.fn(),
|
|
||||||
listMilestonesByMission: vi.fn().mockReturnValue([]),
|
|
||||||
createMilestone: vi.fn(),
|
|
||||||
updateMilestone: vi.fn(),
|
|
||||||
getMilestone: vi.fn(),
|
|
||||||
deleteMilestone: vi.fn(),
|
|
||||||
listTasksByMilestone: vi.fn().mockReturnValue([]),
|
|
||||||
createMissionTask: vi.fn(),
|
|
||||||
updateMissionTask: vi.fn(),
|
|
||||||
getMissionTask: vi.fn(),
|
|
||||||
deleteMissionTask: vi.fn(),
|
|
||||||
}),
|
|
||||||
...overrides,
|
...overrides,
|
||||||
} as unknown as TaskStore;
|
} as unknown as TaskStore;
|
||||||
}
|
}
|
||||||
@@ -3679,17 +3674,12 @@ describe("Git Management endpoints", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
// Use the actual project root so git commands work
|
||||||
store = createMockStore({
|
store = createMockStore({
|
||||||
getRootDir: vi.fn().mockReturnValue(gitRepoDir),
|
getRootDir: vi.fn().mockReturnValue(process.cwd()),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(() => {
|
|
||||||
if (gitTestRoot) {
|
|
||||||
rmSync(gitTestRoot, { recursive: true, force: true });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function buildApp() {
|
function buildApp() {
|
||||||
const app = express();
|
const app = express();
|
||||||
app.use(express.json());
|
app.use(express.json());
|
||||||
|
|||||||
@@ -1115,7 +1115,7 @@ describe("TaskExecutor dependency-based worktree creation", () => {
|
|||||||
const conflictingPath = "/tmp/test/.worktrees/sharp-stone";
|
const conflictingPath = "/tmp/test/.worktrees/sharp-stone";
|
||||||
|
|
||||||
mockedExecSync.mockImplementation((cmd: any) => {
|
mockedExecSync.mockImplementation((cmd: any) => {
|
||||||
if (typeof cmd === "string" && cmd.includes("git worktree add") && cmd.includes("-b")) {
|
if (cmd === 'git worktree add -b "kb/fn-065" "/tmp/test/.worktrees/swift-falcon"') {
|
||||||
const err: any = new Error(
|
const err: any = new Error(
|
||||||
`fatal: 'kb/fn-065' is already used by worktree at '${conflictingPath}'`,
|
`fatal: 'kb/fn-065' is already used by worktree at '${conflictingPath}'`,
|
||||||
);
|
);
|
||||||
@@ -1127,11 +1127,22 @@ describe("TaskExecutor dependency-based worktree creation", () => {
|
|||||||
if (cmd === `git worktree remove "${conflictingPath}" --force`) {
|
if (cmd === `git worktree remove "${conflictingPath}" --force`) {
|
||||||
throw new Error("remove failed");
|
throw new Error("remove failed");
|
||||||
}
|
}
|
||||||
|
if (cmd === 'git branch -D "kb/fn-065"') {
|
||||||
|
throw new Error("branch delete failed");
|
||||||
|
}
|
||||||
|
if (cmd === "git worktree list --porcelain") {
|
||||||
|
return Buffer.from(`/tmp/test/.git/worktrees/sharp-stone\n`);
|
||||||
|
}
|
||||||
return Buffer.from("");
|
return Buffer.from("");
|
||||||
});
|
});
|
||||||
|
|
||||||
await executor.execute(makeTask({ id: "FN-065" }));
|
await executor.execute(makeTask({ id: "FN-065" }));
|
||||||
|
|
||||||
|
// After 3 retry attempts, should fail with combined error message
|
||||||
|
expect(store.updateTask).toHaveBeenCalledWith("FN-065", {
|
||||||
|
status: "failed",
|
||||||
|
error: expect.stringContaining("Worktree conflict"),
|
||||||
|
});
|
||||||
expect(store.updateTask).toHaveBeenCalledWith("FN-065", {
|
expect(store.updateTask).toHaveBeenCalledWith("FN-065", {
|
||||||
status: "failed",
|
status: "failed",
|
||||||
error: expect.stringContaining("automatic cleanup failed"),
|
error: expect.stringContaining("automatic cleanup failed"),
|
||||||
|
|||||||
Reference in New Issue
Block a user