diff --git a/tests/routes/video-canvas-smart-edit.test.ts b/tests/routes/video-canvas-smart-edit.test.ts index 1c3c3d407..d069a6dba 100644 --- a/tests/routes/video-canvas-smart-edit.test.ts +++ b/tests/routes/video-canvas-smart-edit.test.ts @@ -169,3 +169,51 @@ test("SRT input rejects bad time ranges and preserves multiline unicode text", ( const rows = parseSrt("\uFEFF1\r\n00:00:01,000 --> 00:00:02,500\r\n你好\r\n第二行"); expect(rows[0]).toEqual({ start: SECOND, end: 2.5 * SECOND, text: "你好\n第二行" }); }); + +test("remote render records deterministic identity before network failure and refuses endpoint changes", async () => { + const { remoteRender } = await import("@/lib/video-canvas/smart-edit/remote-render"); + const savedURL = process.env.SMART_EDIT_RENDER_URL, + savedToken = process.env.SMART_EDIT_RENDER_TOKEN, + oldFetch = globalThis.fetch; + process.env.SMART_EDIT_RENDER_URL = "http://127.0.0.1:19399"; + process.env.SMART_EDIT_RENDER_TOKEN = "x".repeat(64); + const checkpoints: any[] = []; + let calls = 0; + globalThis.fetch = (async () => { + calls++; + return new Response("{}", { status: 503 }); + }) as typeof fetch; + try { + const lifecycle = { + active: async () => {}, + save: async (value: unknown) => { + checkpoints.push(value); + }, + }; + await expect(remoteRender(plan(), "user", "stable-task", "/unused", lifecycle)).rejects.toThrow( + "任务已保存", + ); + await expect( + remoteRender(plan(), "user", "stable-task", "/unused", { + ...lifecycle, + resume: checkpoints[0], + }), + ).rejects.toThrow("任务已保存"); + expect(checkpoints[0]).toEqual(checkpoints[1]); + expect(calls).toBe(2); + process.env.SMART_EDIT_RENDER_URL = "http://127.0.0.1:19400"; + await expect( + remoteRender(plan(), "user", "stable-task", "/unused", { + ...lifecycle, + resume: checkpoints[0], + }), + ).rejects.toThrow("所属服务器已变化"); + expect(calls).toBe(2); + } finally { + globalThis.fetch = oldFetch; + if (savedURL === undefined) delete process.env.SMART_EDIT_RENDER_URL; + else process.env.SMART_EDIT_RENDER_URL = savedURL; + if (savedToken === undefined) delete process.env.SMART_EDIT_RENDER_TOKEN; + else process.env.SMART_EDIT_RENDER_TOKEN = savedToken; + } +});