118 lines
3.2 KiB
TypeScript
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",
|
|
},
|
|
});
|
|
});
|