139 lines
3.7 KiB
TypeScript
139 lines
3.7 KiB
TypeScript
import {
|
|
buildLatestAgentReplacementTaskMap,
|
|
getAgentReplacementTaskResultImageUrl,
|
|
isAgentReplacementTaskInPendingRun,
|
|
resolveAgentReplacementCardStatus,
|
|
type AgentReplacementTaskSnapshot,
|
|
} from "@/lib/agents/replacement-task-status";
|
|
|
|
function expect(condition: boolean, message: string) {
|
|
if (!condition) {
|
|
throw new Error(message);
|
|
}
|
|
}
|
|
|
|
function createTask(
|
|
overrides: Partial<AgentReplacementTaskSnapshot>
|
|
): AgentReplacementTaskSnapshot {
|
|
return {
|
|
id: "task-1",
|
|
modeType: "detail_replacement",
|
|
referenceId: "detail-1",
|
|
messageId: "request-1",
|
|
status: "pending",
|
|
error: null,
|
|
result: null,
|
|
createdAt: "2026-08-01T08:00:00.000Z",
|
|
startedAt: null,
|
|
completedAt: null,
|
|
queueStatus: null,
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
const pendingTask = createTask({ status: "pending" });
|
|
const runningTask = createTask({ status: "running" });
|
|
const failedTask = createTask({ status: "failed", error: "provider timeout" });
|
|
|
|
expect(
|
|
resolveAgentReplacementCardStatus({
|
|
resultUrl: null,
|
|
taskStatus: pendingTask.status,
|
|
isRequestedInPendingRun: true,
|
|
isGenerating: true,
|
|
index: 0,
|
|
generatedCount: 0,
|
|
}) === "queued",
|
|
"a database pending task must display as queued"
|
|
);
|
|
expect(
|
|
resolveAgentReplacementCardStatus({
|
|
resultUrl: null,
|
|
taskStatus: runningTask.status,
|
|
isRequestedInPendingRun: true,
|
|
isGenerating: true,
|
|
index: 0,
|
|
generatedCount: 0,
|
|
}) === "generating",
|
|
"a database running task must display as generating"
|
|
);
|
|
expect(
|
|
resolveAgentReplacementCardStatus({
|
|
resultUrl: null,
|
|
taskStatus: failedTask.status,
|
|
isRequestedInPendingRun: false,
|
|
isGenerating: false,
|
|
index: 0,
|
|
generatedCount: 0,
|
|
}) === "failed",
|
|
"a failed database task must display as failed"
|
|
);
|
|
expect(
|
|
resolveAgentReplacementCardStatus({
|
|
resultUrl: "https://cdn.example.com/previous-result.png",
|
|
taskStatus: failedTask.status,
|
|
isRequestedInPendingRun: false,
|
|
isGenerating: false,
|
|
index: 0,
|
|
generatedCount: 0,
|
|
}) === "failed",
|
|
"a failed rerun must retain the prior image while displaying the failed status"
|
|
);
|
|
expect(
|
|
resolveAgentReplacementCardStatus({
|
|
resultUrl: null,
|
|
taskStatus: null,
|
|
isRequestedInPendingRun: true,
|
|
isGenerating: true,
|
|
index: 0,
|
|
generatedCount: 0,
|
|
}) === "queued",
|
|
"a submitted card must display as queued before its database task is visible"
|
|
);
|
|
|
|
const newerTask = createTask({
|
|
id: "task-2",
|
|
status: "succeeded",
|
|
createdAt: "2026-08-01T08:05:00.000Z",
|
|
completedAt: "2026-08-01T08:06:00.000Z",
|
|
result: {
|
|
images: [
|
|
{
|
|
originalUrl: "https://cdn.example.com/detail-result.png",
|
|
thumbnailUrl: "https://cdn.example.com/detail-result-thumb.png",
|
|
},
|
|
],
|
|
},
|
|
});
|
|
const latestTaskMap = buildLatestAgentReplacementTaskMap({
|
|
tasks: [pendingTask, newerTask],
|
|
modeType: "detail_replacement",
|
|
});
|
|
expect(
|
|
latestTaskMap.get("detail-1")?.id === newerTask.id,
|
|
"the latest task for each detail card must win"
|
|
);
|
|
expect(
|
|
getAgentReplacementTaskResultImageUrl(newerTask.result) ===
|
|
"https://cdn.example.com/detail-result.png",
|
|
"a succeeded task must expose its original result image"
|
|
);
|
|
expect(
|
|
!isAgentReplacementTaskInPendingRun({
|
|
task: pendingTask,
|
|
pendingStartedAt: Date.parse("2026-08-01T08:02:00.000Z"),
|
|
requestMessageId: "request-2",
|
|
}),
|
|
"an old task must not control a newly submitted detail replacement run"
|
|
);
|
|
expect(
|
|
isAgentReplacementTaskInPendingRun({
|
|
task: newerTask,
|
|
pendingStartedAt: Date.parse("2026-08-01T08:04:59.000Z"),
|
|
requestMessageId: "request-1",
|
|
}),
|
|
"the task created for the current run must control its detail card"
|
|
);
|
|
|
|
console.log("agent replacement task status tests passed");
|