import { test, expect } from "@playwright/test"; const routes = ["/", "/services", "/a-propos", "/temoignages", "/nous-joindre", "/confidentialite"]; test.describe("navigation et liens", () => { test("toutes les pages répondent 200 avec un H1 unique", async ({ page }) => { for (const r of routes) { const res = await page.goto(r); expect(res?.status(), r).toBe(200); await expect(page.locator("h1")).toHaveCount(1); } }); test("aucun lien interne mort sur l'accueil", async ({ page, request }) => { await page.goto("/"); const hrefs = await page .locator("a[href^='/']") .evaluateAll((as) => Array.from( new Set( as .map((a) => (a as HTMLAnchorElement).getAttribute("href")!.split("#")[0]) .filter(Boolean), ), ), ); expect(hrefs.length).toBeGreaterThan(5); for (const h of hrefs) { const res = await request.get(h); expect(res.status(), h).toBeLessThan(400); } }); test("le lien actif est signalé par aria-current", async ({ page, isMobile }) => { test.skip(isMobile, "navigation desktop"); await page.goto("/services"); await expect( page .getByRole("navigation", { name: "Navigation principale" }) .getByRole("link", { name: "Nos services" }), ).toHaveAttribute("aria-current", "page"); }); test("les CTA mènent aux bonnes pages", async ({ page }) => { await page.goto("/"); await page.getByRole("link", { name: /Découvrir nos services/ }).click(); await expect(page).toHaveURL(/\/services$/); await page.goto("/"); await page .getByRole("link", { name: /^Nous joindre/ }) .last() .click(); await expect(page).toHaveURL(/\/nous-joindre$/); }); test("sitemap, robots, manifest et icônes sont servis", async ({ request }) => { for (const p of [ "/sitemap.xml", "/robots.txt", "/manifest.webmanifest", "/icon.svg", "/apple-icon.png", "/opengraph-image", ]) { const res = await request.get(p); expect(res.status(), p).toBe(200); } const icon = await request.get("/icon.svg"); expect(await icon.text()).toContain(' { const res = await request.get("/"); const h = res.headers(); expect(h["content-security-policy"]).toContain("frame-ancestors 'none'"); expect(h["x-content-type-options"]).toBe("nosniff"); expect(h["x-powered-by"]).toBeUndefined(); }); test("page 404 personnalisée", async ({ page }) => { const res = await page.goto("/page-inexistante"); expect(res?.status()).toBe(404); await expect(page.getByRole("heading", { level: 1 })).toContainText("n’existe pas"); }); });