37 lines
1.9 KiB
TypeScript
37 lines
1.9 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import { unwrapEnvelope, videoTaskId } from "../src/services/api/video-response";
|
|
import { isPublicMediaUrl, normalizeVideoResolution, normalizeVideoSeconds, normalizeVideoSize } from "../src/services/api/video-validation";
|
|
|
|
describe("video API response contracts", () => {
|
|
test("解包裸响应和后端 envelope", () => {
|
|
expect(unwrapEnvelope({ id: "task-1" }, "缺少任务")).toEqual({ id: "task-1" });
|
|
expect(unwrapEnvelope({ code: 0, data: { id: "task-2" }, msg: "ok" }, "缺少任务")).toEqual({ id: "task-2" });
|
|
expect(videoTaskId({ request_id: "request-1" })).toBe("request-1");
|
|
});
|
|
|
|
test("业务失败和空数据不会被静默转换为成功", () => {
|
|
expect(() => unwrapEnvelope({ code: 401, data: null, msg: "未授权" }, "缺少任务")).toThrow("未授权");
|
|
expect(() => unwrapEnvelope({ code: 0, data: null, msg: "ok" }, "缺少任务")).toThrow("缺少任务");
|
|
});
|
|
});
|
|
|
|
describe("video request normalization", () => {
|
|
test("规范化时长、比例尺寸和分辨率", () => {
|
|
expect(normalizeVideoSeconds("0")).toBe("6");
|
|
expect(normalizeVideoSeconds("8.9")).toBe("8");
|
|
expect(normalizeVideoSize("16:9")).toBe("1280x720");
|
|
expect(normalizeVideoSize("auto")).toBeNull();
|
|
expect(normalizeVideoResolution("low")).toBe("480p");
|
|
expect(normalizeVideoResolution("2k")).toBe("1440p");
|
|
});
|
|
|
|
test("只把 HTTP(S) 地址视为公网媒体地址", () => {
|
|
expect(isPublicMediaUrl("https://cdn.example.com/video.mp4")).toBe(true);
|
|
expect(isPublicMediaUrl("http://localhost/video.mp4")).toBe(true);
|
|
expect(isPublicMediaUrl("asset://resource-1")).toBe(false);
|
|
expect(isPublicMediaUrl("data:video/mp4;base64,AAAA")).toBe(false);
|
|
expect(isPublicMediaUrl("/resources/video.mp4")).toBe(false);
|
|
});
|
|
});
|