import { defineConfig, devices } from '@playwright/test' /** * Sprint 16: regression suite playwright config. * * Запуск: * pnpm test # все: flows + visual * pnpm test:flows # только flows * pnpm test:visual # только visual * pnpm test:smoke # tagged @smoke (быстрый прогон) * pnpm test:update-snapshots # обновить visual baseline * * Env: * E2E_ADMIN_URL — base URL (default https://test.admin.food-market.kz) * CI=1 — retries=1, fail-fast=false * WORKERS — override default workers (4 на CI, 2 локально) */ const baseURL = process.env.E2E_ADMIN_URL ?? 'https://test.admin.food-market.kz' const isCI = !!process.env.CI const workers = process.env.WORKERS ? Number(process.env.WORKERS) : (isCI ? 4 : 2) export default defineConfig({ testDir: '.', testMatch: /(flows|visual)\/.*\.spec\.ts$/, // Параллелизм — каждый flow создаёт свою org через factory, поэтому // shared state нет. Workers ограничены чтобы не перегрузить stage'е // signup rate-limit. fullyParallel: true, forbidOnly: isCI, retries: isCI ? 1 : 0, workers, timeout: 60_000, expect: { timeout: 10_000, // Sprint 16: visual diff threshold — 0.2% pixel-level. Font-rendering // antialiasing чуть «гуляет» между виртуалками; 0.2% даёт устойчивость // и ловит реальные визуальные изменения. Animations отключаем на снапшоте. toHaveScreenshot: { maxDiffPixelRatio: 0.002, animations: 'disabled', }, }, reporter: [ ['list'], ['json', { outputFile: 'reports/results.json' }], ['html', { outputFolder: 'reports/playwright-html', open: 'never' }], ], use: { baseURL, headless: true, ignoreHTTPSErrors: true, locale: 'ru-RU', viewport: { width: 1280, height: 800 }, actionTimeout: 15_000, navigationTimeout: 30_000, screenshot: 'only-on-failure', trace: 'retain-on-failure', video: 'retain-on-failure', }, outputDir: 'reports/playwright-artifacts', // {projectName} разделяет desktop и mobile snapshot'ы в подкаталогах, // иначе обновление одного проекта затирало бы другой. snapshotPathTemplate: '{testDir}/__screenshots__/{projectName}/{testFileName}/{arg}{ext}', projects: [ { name: 'desktop-chromium', use: { ...devices['Desktop Chrome'], viewport: { width: 1280, height: 800 }, }, }, { name: 'mobile-chromium', testMatch: /visual\/.*\.spec\.ts$/, // mobile только для visual use: { ...devices['Pixel 5'], viewport: { width: 375, height: 667 }, }, }, ], })