Files
cloudflare__vinext/tests/e2e/pages-router-prod/interactive.spec.ts
James Anderson 89036154cc fix(pages-router): unify client asset bootstrap (#2378)
* fix(pages-router): hydrate worker-backed dev pages

* refactor(pages-router): unify client asset bootstrap

* fix(app): preinitialize bootstrap dependencies

* test(app): distinguish preinit scripts from bootstrap

* fix(app): root-anchor bootstrap preinit modules

* test(app): cover bootstrap preinitialization in browsers

* fix(app): share client assets with nested SSR modules

* test(app): verify bootstrap preinit CSP nonces

* test(app): serve CSP nonce in worker fixture

* fix(test): read CSP script nonce property

* fix(cloudflare): emit client assets beside final workers

* fix(build): resolve pages client assets from source

* fix(app): register client assets in ssr graph

* fix(pages-router): harden client bootstrap resolution

* fix(build): emit client assets for node outputs

* fix(build): package client assets in standalone output

* test(app): reference worker nonce fixture explicitly

* fix(build): preserve client assets across environments

* refactor(build): unify client asset outputs

* fix(build): stabilize custom client asset outputs

* fix(build): finalize client assets after app builds

* fix(build): reuse client assets in hybrid builds

* fix(build): scope hybrid client assets metadata

* test(e2e): colocate Cloudflare worker fixture
2026-06-26 19:48:26 +01:00

101 lines
3.9 KiB
TypeScript

import { test, expect } from "@playwright/test";
const BASE = "http://localhost:4175";
test.describe("Pages Router Production — Interactive", () => {
test("counter page hydrates in production", async ({ page }) => {
await page.goto(`${BASE}/counter`);
await expect(page.locator('[data-testid="count"]')).toHaveText("Count: 0");
await page.locator('[data-testid="increment"]').click();
await expect(page.locator('[data-testid="count"]')).toHaveText("Count: 1");
});
test("Link click navigates to correct page", async ({ page }) => {
await page.goto(`${BASE}/`);
await expect(page.locator("h1")).toHaveText("Hello, vinext!");
await page.click('a[href="/about"]');
await expect(page.locator("h1")).toHaveText("About");
expect(page.url()).toBe(`${BASE}/about`);
});
test("browser back button works after navigation", async ({ page }) => {
await page.goto(`${BASE}/`);
await expect(page.locator("h1")).toHaveText("Hello, vinext!");
await page.click('a[href="/about"]');
await expect(page.locator("h1")).toHaveText("About");
await page.goBack();
await expect(page.locator("h1")).toHaveText("Hello, vinext!");
expect(page.url()).toBe(`${BASE}/`);
});
test("SSR page has fresh data on each request", async ({ page }) => {
await page.goto(`${BASE}/ssr`);
const ts1 = await page.locator('[data-testid="timestamp"]').textContent();
await page.waitForTimeout(100);
await page.goto(`${BASE}/ssr`);
const ts2 = await page.locator('[data-testid="timestamp"]').textContent();
expect(ts1).not.toBe(ts2);
});
test("middleware redirect works in production", async ({ page }) => {
await page.goto(`${BASE}/old-page`);
// Middleware redirects /old-page to /about
expect(page.url()).toBe(`${BASE}/about`);
await expect(page.locator("h1")).toHaveText("About");
});
test("middleware rewrite works in production", async ({ page }) => {
await page.goto(`${BASE}/rewritten`);
// Middleware rewrites /rewritten to /ssr
await expect(page.locator("h1")).toHaveText("Server-Side Rendered");
await expect(page.locator('[data-testid="message"]')).toHaveText(
"Hello from getServerSideProps",
);
});
test("dynamic route renders with params in production", async ({ page }) => {
await page.goto(`${BASE}/posts/42`);
await expect(page.locator('[data-testid="post-title"]')).toHaveText("Post: 42");
});
test("catch-all route renders in production", async ({ page }) => {
await page.goto(`${BASE}/docs/guides/setup`);
await expect(page.locator('[data-testid="docs-title"]')).toHaveText("Docs");
await expect(page.locator('[data-testid="docs-slug"]')).toHaveText("Path: guides/setup");
});
test("navigating between pages preserves _app wrapper", async ({ page }) => {
await page.goto(`${BASE}/`);
await expect(page.locator('[data-testid="app-wrapper"]')).toBeVisible();
await page.click('a[href="/about"]');
await expect(page.locator("h1")).toHaveText("About");
await expect(page.locator('[data-testid="app-wrapper"]')).toBeVisible();
await page.click('a[href="/"]');
await expect(page.locator("h1")).toHaveText("Hello, vinext!");
await expect(page.locator('[data-testid="app-wrapper"]')).toBeVisible();
});
});
test.describe("Pages Router Production — API", () => {
test("dynamic API route returns user data", async ({ request }) => {
const response = await request.get(`${BASE}/api/users/42`);
expect(response.status()).toBe(200);
const body = await response.json();
expect(body).toEqual({ user: { id: "42", name: "User 42" } });
});
test("API route with different id", async ({ request }) => {
const response = await request.get(`${BASE}/api/users/alice`);
expect(response.status()).toBe(200);
const body = await response.json();
expect(body).toEqual({ user: { id: "alice", name: "User alice" } });
});
});