import { afterEach, expect, test, vi } from "vitest"; import { GET, POST, } from "../../../app/api/orders/[orderId]/revisions/route"; afterEach(() => { vi.unstubAllEnvs(); vi.unstubAllGlobals(); }); test("proxies manual revision registration and normalizes success data", async () => { vi.stubEnv("BACKEND_BASE_URL", "http://backend.test/api/v1"); const fetchMock = vi.fn().mockResolvedValue( new Response( JSON.stringify({ order_id: 101, workflow_id: "wf-101", asset_id: 501, parent_asset_id: 11, root_asset_id: 11, version_no: 1, review_task_status: "revision_uploaded", latest_revision_asset_id: 501, revision_count: 1, }), { status: 201, headers: { "content-type": "application/json", }, }, ), ); vi.stubGlobal("fetch", fetchMock); const request = new Request("http://localhost/api/orders/101/revisions", { method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify({ parent_asset_id: 11, uploaded_uri: "mock://manual-revision-v1", reviewer_id: 88, comment: "人工修订第一版", }), }); const response = await POST(request, { params: Promise.resolve({ orderId: "101" }), }); const payload = await response.json(); expect(response.status).toBe(201); expect(payload).toEqual({ mode: "proxy", data: { orderId: 101, workflowId: "wf-101", assetId: 501, parentAssetId: 11, rootAssetId: 11, versionNo: 1, reviewTaskStatus: "revision_uploaded", latestRevisionAssetId: 501, revisionCount: 1, }, }); }); test("proxies revision chain lookup and normalizes the item list", async () => { vi.stubEnv("BACKEND_BASE_URL", "http://backend.test/api/v1"); const fetchMock = vi.fn().mockResolvedValue( new Response( JSON.stringify({ order_id: 101, latest_revision_asset_id: 502, revision_count: 2, items: [ { asset_id: 501, order_id: 101, parent_asset_id: 11, root_asset_id: 11, version_no: 1, is_current_version: false, uri: "mock://manual-revision-v1", created_at: "2026-03-27T00:10:00Z", }, { asset_id: 502, order_id: 101, parent_asset_id: 501, root_asset_id: 11, version_no: 2, is_current_version: true, uri: "mock://manual-revision-v2", created_at: "2026-03-27T00:20:00Z", }, ], }), { status: 200, headers: { "content-type": "application/json", }, }, ), ); vi.stubGlobal("fetch", fetchMock); const response = await GET(new Request("http://localhost/api/orders/101/revisions"), { params: Promise.resolve({ orderId: "101" }), }); const payload = await response.json(); expect(response.status).toBe(200); expect(payload).toEqual({ mode: "proxy", data: { orderId: 101, latestRevisionAssetId: 502, revisionCount: 2, items: [ { assetId: 501, orderId: 101, parentAssetId: 11, rootAssetId: 11, versionNo: 1, isCurrentVersion: false, uri: "mock://manual-revision-v1", createdAt: "2026-03-27T00:10:00Z", }, { assetId: 502, orderId: 101, parentAssetId: 501, rootAssetId: 11, versionNo: 2, isCurrentVersion: true, uri: "mock://manual-revision-v2", createdAt: "2026-03-27T00:20:00Z", }, ], }, }); });