Files
workinf_Blender_Wasm/web/tests/e2e/render-routing.spec.ts
mes123456 0fe8d2bb56
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance M8-M11 parity workflows
2026-08-17 04:37:07 -04:00

44 lines
3.0 KiB
TypeScript

import { expect, test } from "@playwright/test";
import fs from "node:fs";
import path from "node:path";
const root = path.resolve(import.meta.dirname, "../../..");
const blend = fs.readFileSync(path.join(root, "tests/files/web/m11_render_reference.blend"));
const golden = JSON.parse(fs.readFileSync(path.join(root, "tests/golden/M11-05/render-routing.json"), "utf8"));
test("M11-05 exposes fail-closed render routing for Web, server and hardware capabilities", async ({ page }) => {
await page.goto("/");
const result = await page.evaluate(async (input) => {
const { routeRenderExecution } = await import("/src/three-adapter/render-routing.ts");
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
const client = new WebEngineClient({ timeoutMs: 30_000 });
try {
const opened = await client.openBlend(Uint8Array.from(input).buffer);
const sourceRenderEngine = opened.snapshot.scenes[0]?.renderEngine;
if (sourceRenderEngine !== "BLENDER_EEVEE" && sourceRenderEngine !== "BLENDER_EEVEE_NEXT") throw new Error(`Unexpected fixture render engine: ${sourceRenderEngine}`);
const base = { schemaVersion: 1 as const, renderEngine: sourceRenderEngine, backend: "WEBGL2" as const, complexity: "BOUNDED" as const };
const bounded = routeRenderExecution(base);
const cycles = routeRenderExecution({ ...base, renderEngine: "BLENDER_CYCLES", backend: "CYCLES" });
const complex = routeRenderExecution({ ...base, backend: "EEVEE_COMPLEX", complexity: "COMPLEX" });
const hardware = routeRenderExecution({ ...base, hardwareBackend: "OPTIX" });
const availableServer = routeRenderExecution({ ...base, renderEngine: "BLENDER_CYCLES", backend: "CYCLES" }, { serverRenderAvailable: true });
const unavailableGpu = routeRenderExecution({ ...base, backend: "WEBGPU" });
const unknownEngine = routeRenderExecution({ ...base, renderEngine: "UNKNOWN_ENGINE" });
return { sourceRenderEngine, bounded, cycles, complex, hardware, availableServer, unavailableGpu, unknownEngine };
}
finally { client.terminate(); }
}, Array.from(blend));
expect(result.sourceRenderEngine).toBe("BLENDER_EEVEE");
expect(result.bounded).toMatchObject(golden.boundedEevee);
for (const serverResult of [result.cycles, result.complex, result.hardware]) {
expect(serverResult).toMatchObject({ target: "SERVER_JOB", status: "BLOCKED" });
expect(serverResult.issues[0].code).toBe("SERVER_JOB_UNAVAILABLE");
}
expect(result.availableServer).toMatchObject({ target: golden.cycles.target, ...golden.cycles.withEndpoint });
expect(result.unavailableGpu).toMatchObject({ target: golden.webgpu.target, status: golden.webgpu.status });
expect(result.unavailableGpu.issues[0].code).toBe(golden.webgpu.code);
expect(result.unknownEngine).toMatchObject({ target: golden.unknownEngine.target, status: golden.unknownEngine.status, capability: golden.unknownEngine.capability });
expect(result.unknownEngine.issues[0].code).toBe(golden.unknownEngine.code);
});