Files

118 lines
3.2 KiB
TypeScript

import {
adaptWorkflowDetail,
adaptWorkflowLookupItem,
} from "@/lib/adapters/workflows";
import type { WorkflowStatusResponseDto } from "@/lib/types/backend";
const WORKFLOW_BASE: WorkflowStatusResponseDto = {
order_id: 101,
workflow_id: "wf-101",
workflow_type: "mid_end",
workflow_status: "running",
current_step: "fusion",
current_revision_asset_id: null,
current_revision_version: null,
latest_revision_asset_id: null,
latest_revision_version: null,
revision_count: 0,
review_task_status: null,
pending_manual_confirm: false,
steps: [],
created_at: "2026-03-27T00:00:00Z",
updated_at: "2026-03-27T00:10:00Z",
};
test("keeps an empty workflow timeline as a business-empty state", () => {
const viewModel = adaptWorkflowDetail(WORKFLOW_BASE);
expect(viewModel.steps).toEqual([]);
expect(viewModel.stepTimelineState.kind).toBe("business-empty");
});
test("tags nested mock asset uris found in workflow step payloads", () => {
const viewModel = adaptWorkflowDetail({
...WORKFLOW_BASE,
steps: [
{
id: 1,
workflow_run_id: 9001,
step_name: "fusion",
step_status: "failed",
input_json: null,
output_json: {
preview_uri: "mock://fusion-preview-1",
nested: {
asset_uri: "mock://fusion-asset-1",
duplicate_asset_uri: "mock://fusion-asset-1",
},
ignored_text: "mock://should-not-be-collected",
},
error_message: "fusion failed",
started_at: "2026-03-27T00:08:00Z",
ended_at: null,
},
],
});
expect(viewModel.statusMeta).toEqual({
label: "处理中",
tone: "info",
});
expect(viewModel.currentStepLabel).toBe("融合");
expect(viewModel.steps[0].containsMockAssets).toBe(true);
expect(viewModel.steps[0].isCurrent).toBe(true);
expect(viewModel.steps[0].isFailed).toBe(true);
expect(viewModel.steps[0].mockAssetUris).toEqual([
"mock://fusion-preview-1",
"mock://fusion-asset-1",
]);
expect(viewModel.failureCount).toBe(1);
});
test("extracts a step preview uri from standard output uri fields", () => {
const viewModel = adaptWorkflowDetail({
...WORKFLOW_BASE,
current_step: "scene",
steps: [
{
id: 2,
workflow_run_id: 9001,
step_name: "scene",
step_status: "succeeded",
input_json: null,
output_json: {
uri: "https://images.example.com/orders/101/scene/generated.jpg",
},
error_message: null,
started_at: "2026-03-27T00:08:00Z",
ended_at: "2026-03-27T00:09:00Z",
},
],
});
expect(viewModel.steps[0].previewUri).toBe(
"https://images.example.com/orders/101/scene/generated.jpg",
);
expect(viewModel.steps[0].containsMockAssets).toBe(false);
});
test("maps workflow lookup status and current step labels", () => {
const viewModel = adaptWorkflowLookupItem(WORKFLOW_BASE);
expect(viewModel).toMatchObject({
orderId: 101,
workflowId: "wf-101",
workflowType: "mid_end",
status: "running",
currentStep: "fusion",
currentStepLabel: "融合",
failureCount: 0,
revisionCount: 0,
pendingManualConfirm: false,
statusMeta: {
label: "处理中",
tone: "info",
},
});
});