test(FN-5115): complete Step 4 — add completion pause regression tests

Fusion-Task-Id: FN-5115
Fusion-Task-Lineage: 5c3d9d42-9dcd-4ebb-ba10-8a4b14d541dd
This commit is contained in:
Fusion (runfusion.ai)
2026-05-19 05:33:15 -07:00
committed by gsxdsm
parent 07655558f2
commit 63aaadf953

View File

@@ -480,6 +480,78 @@ describe("TaskStore", () => {
});
});
describe("paused state on completion", () => {
const expectPauseFieldsCleared = (task: Awaited<ReturnType<typeof store.getTask>>) => {
expect(task.paused).toBeUndefined();
expect(task.userPaused).toBeUndefined();
expect(task.pausedByAgentId).toBeUndefined();
expect(task.pausedReason).toBeUndefined();
};
it("clears pause fields on moveTask(in-review → done)", async () => {
const task = await createTestTask();
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "in-progress");
await store.moveTask(task.id, "in-review");
await store.updateTask(task.id, {
paused: true,
pausedByAgentId: "agent-x",
pausedReason: "manual-hold",
});
await store.moveTask(task.id, "done");
const doneTask = await store.getTask(task.id);
expectPauseFieldsCleared(doneTask);
});
it("clears pause fields on moveTask(in-progress → done) when userPaused was set", async () => {
const task = await createTestTask();
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "in-progress");
await store.updateTask(task.id, { userPaused: true });
await store.moveTask(task.id, "done");
const doneTask = await store.getTask(task.id);
expectPauseFieldsCleared(doneTask);
});
it("clears pause fields when mergeTask handles an already-done task", async () => {
const task = await createTestTask();
await store.moveTask(task.id, "done");
await store.updateTask(task.id, { paused: true, pausedByAgentId: "agent-x" });
await store.mergeTask(task.id);
const doneTask = await store.getTask(task.id);
expectPauseFieldsCleared(doneTask);
});
it("clears pause fields on unarchiveTask transition to done", async () => {
const task = await createTestTask();
await store.moveTask(task.id, "done");
await store.archiveTask(task.id);
await store.updateTask(task.id, { paused: true, pausedByAgentId: "agent-x", pausedReason: "manual-hold" });
await store.unarchiveTask(task.id);
const restored = await store.getTask(task.id);
expect(restored.column).toBe("done");
expectPauseFieldsCleared(restored);
});
it("remains idempotent across repeated done transitions", async () => {
const task = await createTestTask();
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "done");
await store.moveTask(task.id, "archived");
await store.updateTask(task.id, { paused: true, pausedByAgentId: "agent-x" });
await store.unarchiveTask(task.id);
await store.moveTask(task.id, "archived");
await store.unarchiveTask(task.id);
const doneTask = await store.getTask(task.id);
expectPauseFieldsCleared(doneTask);
});
});
describe("execution timing timestamps", () => {
it("preserves the original executionStartedAt across an internal rerun bounce", async () => {
const task = await store.createTask({ description: "retry bounce timing" });