From 57120f3d29d7cd1b9bc66a4f6aa62ebec9bf88c2 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sat, 18 Jul 2026 00:57:06 -0700 Subject: [PATCH] test: preserve default getTask mock for DUPLICATE recovery (#2283) ## Summary Follow-up to #2275 review feedback: `getTask` mocks for DUPLICATE recovery tests now return a default current-task fixture for non-canonical IDs instead of `undefined`. ## Context CodeRabbit on #2275 noted that returning `undefined` for every id except the canonical task could break recovery if the subject task is re-fetched mid-path. ## Test plan - [x] `triage-split-into-subtasks-delete.test.ts` - [x] `triage-finalize-duplicate-lineage.test.ts` ## Summary by CodeRabbit * **Tests** * Improved duplicate-resolution test coverage by preserving task data during recovery and re-fetch scenarios. * Added validation for non-canonical task handling to prevent errors when duplicate tasks are resolved or split. --- .../triage-finalize-duplicate-lineage.test.ts | 27 ++++++++++++------- .../triage-split-into-subtasks-delete.test.ts | 16 +++++++---- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/engine/src/__tests__/triage-finalize-duplicate-lineage.test.ts b/packages/engine/src/__tests__/triage-finalize-duplicate-lineage.test.ts index 5d998d3ac6..bdc432295d 100644 --- a/packages/engine/src/__tests__/triage-finalize-duplicate-lineage.test.ts +++ b/packages/engine/src/__tests__/triage-finalize-duplicate-lineage.test.ts @@ -113,11 +113,17 @@ describe("triage finalize duplicate lineage", () => { */ const store = createMockStore({ getSettings: vi.fn().mockResolvedValue({ requirePlanApproval: false, triageDuplicateResolution: "delete" } as Settings), - getTask: vi.fn().mockImplementation(async (id: string) => ( - id === "FN-4894" - ? createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }) - : undefined - )), + /* + FNXC:EngineTests 2026-07-17-18:10: + PR #2275 review: preserve a default current-task mock for non-canonical IDs. + Returning undefined for FN-001 risks NPEs if recovery re-fetches the subject task. + */ + getTask: vi.fn().mockImplementation(async (id: string) => { + if (id === "FN-4894") { + return createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }); + } + return createTask({ id: "FN-001" }); + }), }); await runRecovery(createTask(), "DUPLICATE: FN-4894\n", store); @@ -132,11 +138,12 @@ describe("triage finalize duplicate lineage", () => { it("flags and parks DUPLICATE markers under default prompt resolution", async () => { const store = createMockStore({ - getTask: vi.fn().mockImplementation(async (id: string) => ( - id === "FN-4894" - ? createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }) - : undefined - )), + getTask: vi.fn().mockImplementation(async (id: string) => { + if (id === "FN-4894") { + return createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }); + } + return createTask({ id: "FN-001" }); + }), }); await runRecovery(createTask(), "DUPLICATE: FN-4894\n", store); diff --git a/packages/engine/src/__tests__/triage-split-into-subtasks-delete.test.ts b/packages/engine/src/__tests__/triage-split-into-subtasks-delete.test.ts index 64107d2a9d..071ccdf189 100644 --- a/packages/engine/src/__tests__/triage-split-into-subtasks-delete.test.ts +++ b/packages/engine/src/__tests__/triage-split-into-subtasks-delete.test.ts @@ -165,11 +165,17 @@ describe("triage split/delete lineage forwarding", () => { autoMerge: true, triageDuplicateResolution: "delete", } as Settings), - getTask: vi.fn().mockImplementation(async (id: string) => ( - id === "FN-4894" - ? createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }) - : undefined - )), + /* + FNXC:EngineTests 2026-07-17-18:10: + PR #2275 review: keep the createStore default current-task mock for non-canonical + IDs. Returning undefined risks NPEs if recovery re-fetches FN-001 mid-path. + */ + getTask: vi.fn().mockImplementation(async (id: string) => { + if (id === "FN-4894") { + return createTask({ id: "FN-4894", title: "Canonical", column: "todo", status: null }); + } + return createTask({ attachments: [], comments: [] } as any); + }), deleteTask: vi.fn().mockResolvedValue(undefined), });