ai-chatbot/scripts/test-agent-replacement-task-status.ts

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");