chore: dependências e teste de ponta a ponta
Saem gsap, motion, clsx e tailwind-merge; entram server-only, @playwright/test e @axe-core/playwright. Suíte e2e (rotas, axe, teclado, navegação, sem JS, rolagem) rodável com pnpm test:e2e contra BASE_URL.
This commit is contained in:
1 parent
318a764190
commit
7b633f0f4a
12 files changed
+459
-94
No files matched your search
@@ -0,0 +1,60 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
import { DESKTOP } from "./helpers";
|
||||
|
||||
/**
|
||||
* (d) Clicar em "Cases" no menu e depois num case navega sem recarregar o documento (um marcador em `window`
|
||||
* sobrevive) e cada troca de página dispara uma startViewTransition; a carga inicial, nenhuma.
|
||||
*/
|
||||
|
||||
type Probe = { __marker?: string; __viewTransitions?: number };
|
||||
|
||||
test.use({ viewport: DESKTOP });
|
||||
|
||||
test("menu Cases e depois um case: sem recarregar o documento, uma transição de página por navegação", async ({
|
||||
page,
|
||||
}) => {
|
||||
// conta as chamadas de document.startViewTransition, desde antes do primeiro script da página
|
||||
await page.addInitScript(() => {
|
||||
const probe = window as unknown as Probe;
|
||||
probe.__viewTransitions = 0;
|
||||
const original = document.startViewTransition?.bind(document);
|
||||
if (!original) return;
|
||||
document.startViewTransition = ((...args: Parameters<typeof original>) => {
|
||||
(probe.__viewTransitions as number) += 1;
|
||||
return original(...args);
|
||||
}) as typeof document.startViewTransition;
|
||||
});
|
||||
const transitions = () =>
|
||||
page.evaluate(() => (window as unknown as Probe).__viewTransitions);
|
||||
|
||||
await page.goto("/", { waitUntil: "load" });
|
||||
await page.waitForTimeout(1500);
|
||||
await page.evaluate(() => {
|
||||
(window as unknown as Probe).__marker = "mesmo-documento";
|
||||
});
|
||||
expect(
|
||||
await page.evaluate(() => "startViewTransition" in document),
|
||||
"o navegador precisa ter startViewTransition",
|
||||
).toBe(true);
|
||||
expect(await transitions(), "carga inicial").toBe(0);
|
||||
|
||||
await page
|
||||
.getByRole("navigation", { name: "Navegação principal" })
|
||||
.getByRole("link", { name: "Cases" })
|
||||
.click();
|
||||
await page.waitForURL("**/cases");
|
||||
await expect(page.getByRole("heading", { level: 1 })).toBeVisible();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await transitions(), "depois de Cases").toBe(1);
|
||||
|
||||
await page.getByRole("link", { name: "Ver o case" }).first().click();
|
||||
await page.waitForURL(/\/cases\/[^/]+$/);
|
||||
await expect(page.getByRole("heading", { level: 1 })).toBeVisible();
|
||||
await page.waitForTimeout(500);
|
||||
expect(await transitions(), "depois de abrir um case").toBe(2);
|
||||
|
||||
expect(
|
||||
await page.evaluate(() => (window as unknown as Probe).__marker),
|
||||
"o documento foi recarregado (o marcador sumiu)",
|
||||
).toBe("mesmo-documento");
|
||||
});
|
||||
Reference in new issue
Block a user