ai-chatbot/tests/routes/model3d-style-pro-regressions.test.ts

69 lines
2.5 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
function readSource(path: string) {
return readFileSync(resolve(process.cwd(), path), "utf8");
}
test.describe("3D workspace and Style Pro regressions", () => {
test("opens World splats in first-person mode without the debug HUD", () => {
const page = readSource("app/canvas/[id]/model3d/page.tsx");
const viewer = readSource(
"components/canvas/world3d/World3DViewer.tsx"
);
expect(page).toContain(
'workspaceMode === "world" && worldViewportMode === "splat"'
);
expect(page).toContain("showInfoOverlay={false}");
expect(viewer).toContain("showInfoOverlay = !minimalFrame");
expect(viewer).toContain("showInfoOverlay={showInfoOverlay}");
});
test("keeps each GLB viewer material instance isolated and texture-aware", () => {
const viewer = readSource(
"components/canvas/model3d/Model3DViewer.tsx"
);
expect(viewer).toContain("cloneSceneWithIndependentMaterials");
expect(viewer).toContain("const clonedMaterial = material.clone()");
expect(viewer).toContain(
"configureMaterialTextures(clonedMaterial, node.geometry)"
);
});
test("uses the same hidden-model access rule in Style Pro as canvas", () => {
const route = readSource("app/api/style-pro/model-options/route.ts");
const canvasModelsRoute = readSource("app/(chat)/api/models/route.ts");
expect(route).toContain("getUserById");
expect(route).toContain("canAccessHiddenAiModels");
expect(route).toContain("databaseUserRole: currentUser?.role");
expect(route).toContain("includeHidden: allowHiddenModels");
expect(route).toContain('"Cache-Control": "private, no-store, max-age=0"');
expect(canvasModelsRoute).toContain("canAccessHiddenAiModels");
expect(canvasModelsRoute).toContain("databaseUserRole: currentUser?.role");
});
test("refreshes Style Pro models after an administrator changes the catalog", () => {
const workspace = readSource(
"components/style-pro/StyleProWorkspace.tsx"
);
expect(workspace).toContain("refreshInterval: 30_000");
expect(workspace).toContain("revalidateOnFocus: true");
expect(workspace).toContain("revalidateOnReconnect: true");
});
test("opens the canvas conversation panel by default", () => {
const page = readSource(
"app/canvas/[id]/CanvasEditorLegacyPageClient.tsx"
);
expect(page).toContain(
"const [isPanelOpen, setIsPanelOpen] = useState(true)"
);
});
});