Files
auto-virtual-tryon-frontend/tests/app/api/library-uploads-presign.route.test.ts
2026-03-28 13:42:22 +08:00

95 lines
2.5 KiB
TypeScript

import { beforeEach, expect, test, vi } from "vitest";
import { POST } from "../../../app/api/libraries/uploads/presign/route";
const { backendRequestMock } = vi.hoisted(() => ({
backendRequestMock: vi.fn(),
}));
vi.mock("@/lib/http/backend-client", () => ({
backendRequest: backendRequestMock,
}));
beforeEach(() => {
backendRequestMock.mockReset();
});
test("proxies upload presign requests and normalizes the response for the frontend", async () => {
backendRequestMock.mockResolvedValue({
status: 200,
data: {
method: "PUT",
upload_url: "https://s3.example.com/presigned-put",
headers: {
"content-type": "image/png",
},
storage_key: "library/models/2026/ava-original.png",
public_url: "https://images.example.com/library/models/2026/ava-original.png",
},
});
const response = await POST(
new Request("http://localhost/api/libraries/uploads/presign", {
method: "POST",
headers: {
"content-type": "application/json",
},
body: JSON.stringify({
resourceType: "model",
fileRole: "original",
fileName: "ava-original.png",
contentType: "image/png",
}),
}),
);
const payload = await response.json();
expect(response.status).toBe(200);
expect(payload).toEqual({
mode: "proxy",
data: {
method: "PUT",
uploadUrl: "https://s3.example.com/presigned-put",
headers: {
"content-type": "image/png",
},
storageKey: "library/models/2026/ava-original.png",
publicUrl: "https://images.example.com/library/models/2026/ava-original.png",
},
});
expect(backendRequestMock).toHaveBeenCalledWith("/library/uploads/presign", {
method: "POST",
body: JSON.stringify({
resource_type: "model",
file_role: "original",
file_name: "ava-original.png",
content_type: "image/png",
}),
});
});
test("rejects invalid presign payloads before proxying", async () => {
const response = await POST(
new Request("http://localhost/api/libraries/uploads/presign", {
method: "POST",
headers: {
"content-type": "application/json",
},
body: JSON.stringify({
resourceType: "unknown",
fileRole: "original",
fileName: "",
contentType: "image/png",
}),
}),
);
const payload = await response.json();
expect(response.status).toBe(400);
expect(payload).toMatchObject({
error: "VALIDATION_ERROR",
message: "上传参数不合法。",
});
expect(backendRequestMock).not.toHaveBeenCalled();
});