import { test, expect } from "@playwright/test"; const PREVIEW = "http://127.0.0.1:4173/"; // Playwright's WebKit does not run service workers; Chromium covers them. test.beforeEach(({ browserName }) => test.skip( browserName !== "chromium", "Service workers run in Chromium here.", ), ); test("the production build installs its shell and opens offline", async ({ page, context, }) => { const errors: string[] = []; page.on("pageerror", (error) => errors.push(error.message)); await page.goto(PREVIEW); const manifest = await page .locator('link[rel="manifest"]') .getAttribute("href"); const response = await page.request.get(new URL(manifest!, PREVIEW).href); expect(response.ok()).toBe(true); expect(await response.json()).toMatchObject({ display: "standalone", start_url: "./", }); // The worker installs, then controls the page after a reload. await page.evaluate(() => navigator.serviceWorker.ready); await page.reload(); expect( await page.evaluate(() => Boolean(navigator.serviceWorker.controller)), ).toBe(true); await context.setOffline(true); await page.reload(); await expect(page.locator("#status")).toContainText("Choose your ROM"); await expect(page.locator("#rom-file")).toBeAttached(); // The Savegames tab describes installation and storage. await page.locator("#tab-saves").click(); await expect(page.locator("#install-status")).not.toBeEmpty(); await expect(page.locator("#storage-status")).not.toHaveText(/Checking/); await context.setOffline(false); expect(errors).toEqual([]); }); test("the development server registers no service worker", async ({ page }) => { await page.goto("/"); await page.waitForTimeout(500); expect( await page.evaluate( async () => (await navigator.serviceWorker.getRegistrations()).length, ), ).toBe(0); });