import { expect, test } from "bun:test"; import { renderToStaticMarkup } from "react-dom/server"; import { ModelCapabilityEditor } from "../src/components/model-capability-editor"; import { defaultModelCapabilityConfig, modelCapabilityConfigFor, normalizeModelCapabilityConfig, normalizeVideoValue } from "../src/lib/model-capabilities"; import type { ModelProtocolWorkflow } from "../src/lib/model-protocols"; import { resolveWorkflowVideoScreenSpec, updateWorkflowVideoScreenSpec } from "../src/lib/video-screen-specs"; const workflow: ModelProtocolWorkflow = { id: "minimax_h3_zm_u24", label: "H3 ZM U24", providerId: "autodl-comfyui", capability: "video", parameters: [{ name: "resolution", mapping: "resolution", type: "string", values: ["480p竖", "768p竖", "480p横", "768p横", "480p(1:1)", "768p(1:1)"] }], defaults: { resolution: "768p竖" }, }; const initial = () => resolveWorkflowVideoScreenSpec(defaultModelCapabilityConfig("autodl-comfyui", workflow.id).video!, workflow); test("removed switch and draft cannot replace the effective six choices", () => { for (const customSizeEnabled of [false, true]) { const original = Object.assign(initial(), { customSizeEnabled, customScreenSpec: { ratios: ["2:3"], defaultRatio: "2:3", resolutions: ["invalid"], defaultResolution: "missing" }, }); const resolved = resolveWorkflowVideoScreenSpec(original, workflow); expect(resolved.resolutions).toEqual(workflow.parameters[0]!.values!); expect(resolved.defaultResolution).toBe("768p竖"); expect(resolved.ratios).toEqual([]); expect(resolved.duration).toEqual(original.duration); expect(resolved.references).toEqual(original.references); expect(resolved.operations).toEqual(original.operations); } }); test("selected presets and default remain active after saving and reloading", () => { const profile = updateWorkflowVideoScreenSpec(initial(), workflow, { resolutions: [" 480p横 ", "768p(1:1)", "480P横", ""], defaultResolution: " 768P(1:1) " }); const reloaded = normalizeModelCapabilityConfig(JSON.parse(JSON.stringify({ version: 1, video: profile }))).video!; expect(reloaded.resolutions).toEqual(["480p横", "768p(1:1)"]); expect(reloaded.defaultResolution).toBe("768p(1:1)"); expect(normalizeVideoValue(reloaded, { seconds: "6", ratio: "16:9", resolution: "768p(1:1)" })).toEqual({ seconds: "6", ratio: "", resolution: "768p(1:1)" }); expect(updateWorkflowVideoScreenSpec(profile, workflow, { resolutions: [], defaultResolution: "" }).resolutions).toEqual([]); }); test("creation and canvas use configured choices and replace stale cached selections", () => { const profile = updateWorkflowVideoScreenSpec(initial(), workflow, { resolutions: ["480p横", "768p(1:1)"], defaultResolution: "768p(1:1)" }); const config = { channels: [{ id: "autodl", models: [workflow.id], modelCosts: [{ model: workflow.id, protocol: "autodl-comfyui", capabilityConfig: { version: 1, video: profile } }] }] }; const selected = modelCapabilityConfigFor(config, `autodl::${workflow.id}`).video!; expect(normalizeVideoValue(selected, { seconds: "6", ratio: "16:9", resolution: "768p竖" })).toEqual({ seconds: "6", ratio: "", resolution: "768p(1:1)" }); expect(normalizeVideoValue(selected, { resolution: "480p横" }).resolution).toBe("480p横"); }); test("switching workflows refreshes the available presets without carrying foreign labels", () => { const previous = updateWorkflowVideoScreenSpec(initial(), workflow, { resolutions: ["480p横"], defaultResolution: "480p横" }); const next = resolveWorkflowVideoScreenSpec(previous, { ...workflow, id: "z0901", parameters: [{ name: "resolution", type: "string", values: ["768p竖(768*1344)"] }], defaults: { resolution: "768p竖(768*1344)" } }); expect(next.resolutions).toEqual(["768p竖(768*1344)"]); expect(next.defaultResolution).toBe("768p竖(768*1344)"); }); test("real editor keeps enabled fields and original card copy without switch or explanation", () => { for (const section of ["all", "protocol"] as const) { const html = renderToStaticMarkup(); expect(html).not.toContain("自定义比例分辨率"); expect(html).not.toContain("画幅由完整分辨率标签"); expect(html).not.toContain("使用当前工作流的插件预设"); expect(html).toContain("768p(1:1)"); expect(html).toContain('aria-label="输出分辨率"'); expect(html).toContain('aria-label="默认分辨率"'); expect(html).not.toContain("ant-select-disabled"); expect(html).not.toContain("支持比例"); expect(html).not.toContain("默认比例"); if (section === "protocol") { expect(html).toContain("画面规格"); expect(html).toContain("控制比例、分辨率及默认输出"); } } }); test("other video protocols keep their existing settings and controls", () => { const profile = defaultModelCapabilityConfig("minimax-video").video!; expect(resolveWorkflowVideoScreenSpec(profile)).toBe(profile); const html = renderToStaticMarkup(); expect(html).not.toContain("自定义比例分辨率"); expect(html).toContain("支持比例"); });