test(FN-4653): complete Step 2 — cover mixed blocker sweep handoff

Fusion-Task-Id: FN-4653
Fusion-Task-Lineage: b1bc9bd0-0270-412b-bb63-fb32ea5f44d0
This commit is contained in:
Fusion
2026-05-15 12:32:12 -07:00
committed by gsxdsm
parent 208753fb88
commit 875b322664

View File

@@ -105,4 +105,55 @@ describe("soft-blocker auto-finalize reliability interactions (real git)", () =>
rmSync(dir, { recursive: true, force: true });
}
});
it("preserves hard blockers, then finalizes via recoverMergedReviewTasks when blocker clears", async () => {
const dir = mkdtempSync(join(tmpdir(), "fn-4653-ri-hard-handoff-"));
try {
git(dir, "git init -b main");
git(dir, 'git config user.email "test@example.com"');
git(dir, 'git config user.name "Test"');
git(dir, "git commit --allow-empty -m init");
seedLandedContent(dir, "fusion/fn-4653-hard", "FN-4653-HARD", "hard.txt");
const task = makeTask({
id: "FN-4653-HARD",
branch: "fusion/fn-4653-hard",
steps: [{ name: "Step 1", status: "pending" }],
});
const auditEvents: unknown[] = [];
const store = makeStore(task, auditEvents);
const manager = new SelfHealingManager(store, { rootDir: dir, getExecutingTaskIds: () => new Set() });
const firstSweep = await manager.recoverAlreadyMergedReviewTasks();
expect(firstSweep).toBe(0);
expect(task.column).toBe("in-review");
expect(task.paused).toBe(true);
expect(task.status).toBe("failed");
expect(task.error).toContain("task has incomplete steps");
expect(task.mergeDetails?.mergeConfirmed).toBe(true);
expect(
auditEvents.some((event: any) => event?.mutationType === "task:auto-recover-finalize-already-on-main"),
).toBe(false);
task.steps = [];
task.error = "stale failure";
const secondSweep = await manager.recoverMergedReviewTasks();
expect(secondSweep).toBe(1);
expect(task.column).toBe("done");
expect(task.paused).toBe(false);
expect(task.status).toBeNull();
expect(task.error).toBeNull();
expect(
auditEvents.some((event: any) => event?.mutationType === "task:auto-recover-finalize-already-on-main"),
).toBe(true);
manager.stop();
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
});