import { describe, expect, it } from "vitest"; import { deriveTaskStatusFromConfirmedPlatforms, mapPlatformStatusToExecutionStatus, type PlatformRunRecord } from "../src/index"; function createRun( status: PlatformRunRecord["status"], selected = true ): PlatformRunRecord { return { platform: "tmall", searchRequirement: "recommended", status, candidateCount: 1, selectedCandidateIds: selected ? ["candidate-1"] : [], lastUpdatedAt: new Date().toISOString() }; } describe("deriveTaskStatusFromConfirmedPlatforms", () => { it("returns NoSelection when no platform has confirmed links", () => { expect( deriveTaskStatusFromConfirmedPlatforms([createRun("Skipped", false)]) ).toBe("NoSelection"); }); it("returns Completed when all confirmed platforms are completed", () => { expect( deriveTaskStatusFromConfirmedPlatforms([ createRun("Completed"), createRun("Completed") ]) ).toBe("Completed"); }); it("returns PartialCompleted when at least one confirmed platform is completed and another is blocked", () => { expect( deriveTaskStatusFromConfirmedPlatforms([ createRun("Completed"), createRun("Blocked") ]) ).toBe("PartialCompleted"); }); it("returns Blocked when all confirmed platforms are blocked", () => { expect( deriveTaskStatusFromConfirmedPlatforms([createRun("SearchBlocked")]) ).toBe("Blocked"); }); it("returns Failed when all confirmed platforms fail", () => { expect( deriveTaskStatusFromConfirmedPlatforms([createRun("Failed")]) ).toBe("Failed"); }); }); describe("mapPlatformStatusToExecutionStatus", () => { it("maps publishable platform statuses", () => { expect(mapPlatformStatusToExecutionStatus("Completed")).toBe("completed"); expect(mapPlatformStatusToExecutionStatus("SearchBlocked")).toBe("blocked"); expect(mapPlatformStatusToExecutionStatus("Failed")).toBe("failed"); expect(mapPlatformStatusToExecutionStatus("Skipped")).toBe("skipped"); expect(mapPlatformStatusToExecutionStatus("NoResult")).toBe("no_result"); }); it("rejects running states", () => { expect(() => mapPlatformStatusToExecutionStatus("Running")).toThrow( /cannot be published/i ); }); });