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