112 lines
3.8 KiB
TypeScript
112 lines
3.8 KiB
TypeScript
import { expect, revealNavigationLinks, test } from "../helpers/serve-dist";
|
|
import {
|
|
environmentChunkPattern,
|
|
installSceneInstrumentation,
|
|
readSceneInstrumentation,
|
|
} from "../helpers/scene-instrumentation";
|
|
|
|
test.beforeEach(async ({ page }) => installSceneInstrumentation(page));
|
|
|
|
test("falls back to one poster and no scene loop when the deferred scene chunk is unavailable", async ({
|
|
page,
|
|
distUrl,
|
|
}) => {
|
|
const pageErrors: string[] = [];
|
|
page.on("pageerror", (error) => pageErrors.push(error.message));
|
|
await page.route(environmentChunkPattern, (route) => route.abort("failed"));
|
|
await page.goto(distUrl, { waitUntil: "domcontentloaded" });
|
|
|
|
await expect(page.locator(".journey-world")).toHaveAttribute(
|
|
"data-scene-state",
|
|
"failed",
|
|
);
|
|
await expect(page.locator(".journey-poster")).toHaveCount(1);
|
|
await expect(page.locator(".journey-canvas")).toHaveCount(0);
|
|
await expect(page.locator("main > section")).toHaveCount(8);
|
|
await revealNavigationLinks(page);
|
|
await expect(page.locator('nav a[href="#contact"]')).toBeVisible();
|
|
await expect(page.locator('#contact :is(a, summary):text-is("Email Me")')).toBeVisible();
|
|
await expect
|
|
.poll(
|
|
async () => (await readSceneInstrumentation(page)).activeAnimationFrames,
|
|
)
|
|
.toBe(0);
|
|
expect((await readSceneInstrumentation(page)).unhandledRejections).toEqual(
|
|
[],
|
|
);
|
|
expect(pageErrors).toEqual([]);
|
|
});
|
|
|
|
test("contains a WebGL initialization failure without hiding the portfolio", async ({
|
|
page,
|
|
distUrl,
|
|
}) => {
|
|
const pageErrors: string[] = [];
|
|
page.on("pageerror", (error) => pageErrors.push(error.message));
|
|
await page.addInitScript(() => {
|
|
const nativeGetContext = HTMLCanvasElement.prototype.getContext;
|
|
Object.defineProperty(HTMLCanvasElement.prototype, "getContext", {
|
|
configurable: true,
|
|
value(
|
|
this: HTMLCanvasElement,
|
|
contextId: string,
|
|
options?: unknown,
|
|
): RenderingContext | null {
|
|
if (
|
|
contextId === "webgl" ||
|
|
contextId === "webgl2" ||
|
|
contextId === "experimental-webgl"
|
|
)
|
|
return null;
|
|
return Reflect.apply(nativeGetContext, this, [
|
|
contextId,
|
|
options,
|
|
]) as RenderingContext | null;
|
|
},
|
|
});
|
|
});
|
|
await page.goto(distUrl, { waitUntil: "domcontentloaded" });
|
|
|
|
await expect(page.locator(".journey-world")).toHaveAttribute(
|
|
"data-scene-state",
|
|
"failed",
|
|
);
|
|
await expect(page.locator(".journey-poster")).toHaveCount(1);
|
|
await expect(page.locator(".journey-canvas")).toHaveCount(0);
|
|
await expect(page.locator("#portfolio-content")).toBeVisible();
|
|
await expect(page.locator('#contact :is(a, summary):text-is("Email Me")')).toBeVisible();
|
|
await expect
|
|
.poll(
|
|
async () => (await readSceneInstrumentation(page)).activeAnimationFrames,
|
|
)
|
|
.toBe(0);
|
|
expect((await readSceneInstrumentation(page)).unhandledRejections).toEqual(
|
|
[],
|
|
);
|
|
expect(pageErrors).toEqual([]);
|
|
});
|
|
|
|
test("allows an explicit Static visitor to re-enable motion when the system permits it", async ({
|
|
page,
|
|
distUrl,
|
|
}) => {
|
|
const requests: string[] = [];
|
|
page.on("request", (request) => requests.push(request.url()));
|
|
await page.goto(distUrl, { waitUntil: "domcontentloaded" });
|
|
await page.getByRole("button", { name: "Drive settings" }).click();
|
|
await page.getByLabel("Quality control").selectOption("static");
|
|
|
|
await expect(
|
|
page.getByRole("button", { name: "Enable motion" }),
|
|
).toBeVisible();
|
|
await expect(page.locator(".journey-canvas")).toHaveCount(0);
|
|
await page.getByRole("button", { name: "Enable motion" }).click();
|
|
|
|
await expect(page.locator(".journey-world")).toHaveAttribute(
|
|
"data-scene-state",
|
|
"running",
|
|
);
|
|
await expect(page.locator(".journey-canvas")).toHaveCount(1);
|
|
expect(requests.some((url) => environmentChunkPattern.test(url))).toBe(true);
|
|
});
|