import path from "node:path"; import { defineConfig, devices } from "@playwright/test"; const devPort = Number(process.env.PLAYWRIGHT_DEV_PORT || 5173); const devHost = process.env.PLAYWRIGHT_DEV_HOST || "127.0.0.1"; const baseURL = process.env.PLAYWRIGHT_BASE_URL || `http://${devHost}:${devPort}`; const isCI = !!process.env.CI; const artifactNamespace = (process.env.PLAYWRIGHT_ARTIFACT_NAMESPACE || "").trim(); const artifactRoot = artifactNamespace ? path.join("output", "playwright", artifactNamespace) : path.join("output", "playwright"); const htmlReportOutputFolder = path.join(artifactRoot, "report"); const configuredWorkers = Number(process.env.PLAYWRIGHT_WORKERS || 2); const workers = Number.isFinite(configuredWorkers) && configuredWorkers > 0 ? configuredWorkers : 2; const reporterMode = (process.env.PLAYWRIGHT_REPORTER_MODE || "").trim(); const configuredVideoMode = (process.env.PLAYWRIGHT_VIDEO_MODE || "retain-on-failure").trim(); const allowedVideoModes = new Set(["off", "on", "retain-on-failure", "on-first-retry"]); const videoMode = allowedVideoModes.has(configuredVideoMode) ? configuredVideoMode : "retain-on-failure"; const reporter = reporterMode === "line-html" ? [["line"], ["html", { open: "never", outputFolder: htmlReportOutputFolder }]] : [["list"], ["html", { open: "never", outputFolder: htmlReportOutputFolder }]]; function buildProject(name: string, browserName: "chromium" | "firefox" | "webkit", deviceName: keyof typeof devices) { const { defaultBrowserType: _defaultBrowserType, ...device } = devices[deviceName]; const use = { browserName, ...device, }; if (browserName === "firefox") { delete use.isMobile; } return { name, use, }; } export default defineConfig({ testDir: "./tests/e2e", testIgnore: ["**/release/**", "**/quarantine/**"], snapshotPathTemplate: "{snapshotDir}/{testFileDir}/{testFileName}-snapshots/{arg}{-projectName}-win32{ext}", timeout: 60_000, fullyParallel: true, forbidOnly: isCI, retries: isCI ? 2 : 0, expect: { timeout: 15_000, }, workers, ...(process.env.PLAYWRIGHT_BASE_URL ? {} : { globalSetup: "./playwright.global-setup.mjs", globalTeardown: "./playwright.global-teardown.mjs", }), reporter, outputDir: path.join(artifactRoot, "test-results"), use: { baseURL, trace: "retain-on-failure", screenshot: "only-on-failure", video: videoMode, }, projects: [ buildProject("chromium-mobile", "chromium", "Pixel 5"), buildProject("chromium-desktop", "chromium", "Desktop Chrome"), buildProject("chromium-tablet", "chromium", "iPad Mini"), buildProject("webkit-mobile", "webkit", "iPhone 12"), buildProject("webkit-desktop", "webkit", "Desktop Safari"), buildProject("webkit-tablet", "webkit", "iPad Mini"), buildProject("firefox-mobile", "firefox", "Pixel 5"), buildProject("firefox-desktop", "firefox", "Desktop Firefox"), buildProject("firefox-tablet", "firefox", "iPad Mini"), ], });