import { test, expect } from "@playwright/test" const { describe, beforeEach, skip, use } = test function webkitOnly() { beforeEach(async ({ browserName }) => { if (browserName !== "webkit") skip() }) } describe("when user is on iOS", () => { webkitOnly() describe("version 16.4 or higher", () => { use({ userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1", }) test("and tack up now is not running as a PWA, they are instructed to install tack up now", async ({ page }) => { await page.goto("/") const installText = await page.getByText(/Install Tack Up Now!/) await expect(installText).toBeAttached() }) describe("and tack up now is running as a PWA", () => { beforeEach(async ({ page }) => { await page.addInitScript(() => (window.navigator as any)["standalone"] = true) }) test("and notifications aren't enabled, they are asked to enable notifications", async ({ page, browser }) => { await page.addInitScript(() => (Object.defineProperty(window.Notification, "permission", {value: "default", writable: true }))) await page.goto("/") const notificationText = await page.getByText(/Enable notifications/) await expect(notificationText).toBeAttached() }) describe("and notifications are enabled", () => { beforeEach(async ({ page }) => { await page.addInitScript(() => { window.Notification = window.Notification ?? {} Object.defineProperty(window.Notification, "permission", {value: "granted", writable: true }) }) }) test("they aren't asked to enable notifications", async ({ page }) => { await page.goto("/") await page.evaluate(async () => await navigator.serviceWorker.ready) const notificationText = await page.getByText(/Enable notifications/) await expect(notificationText).not.toBeAttached() }) }) }) }) describe("version 16.3 and under", () => { use({ userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1", }) test("version 16.3 and under they are informed that their iOS version isn't supported", async ({ page }) => { await page.goto("/") const sorryText = await page.getByText(/Sorry/) await expect(sorryText).toBeVisible() }) }) })