diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 0000000..041160c --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,27 @@ +name: Playwright Tests +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.gitignore b/.gitignore index ada9878..9bf7af0 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,8 @@ storybook-static # vscode .vscode/find-unused-exports.json + +#playwright +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/__tests__/.gitkeep b/__tests__/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/__tests__/flights.playwright.ts b/__tests__/flights.playwright.ts new file mode 100644 index 0000000..d5b5522 --- /dev/null +++ b/__tests__/flights.playwright.ts @@ -0,0 +1,9 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Flights', () => { + test(`should match snapshot`, async ({ page }) => { + await page.goto(`http://localhost:3000/flights`, { waitUntil: 'networkidle' }); + + expect(await page.screenshot({ fullPage: true })).toMatchSnapshot(`flights.png`, { threshold: 50 }); + }); +}); diff --git a/__tests__/flights.playwright.ts-snapshots/flights-Mobile-Chrome-darwin.png b/__tests__/flights.playwright.ts-snapshots/flights-Mobile-Chrome-darwin.png new file mode 100644 index 0000000..a9dc3cc Binary files /dev/null and b/__tests__/flights.playwright.ts-snapshots/flights-Mobile-Chrome-darwin.png differ diff --git a/__tests__/flights.playwright.ts-snapshots/flights-Tablet-Safari-darwin.png b/__tests__/flights.playwright.ts-snapshots/flights-Tablet-Safari-darwin.png new file mode 100644 index 0000000..3ef83a4 Binary files /dev/null and b/__tests__/flights.playwright.ts-snapshots/flights-Tablet-Safari-darwin.png differ diff --git a/__tests__/flights.playwright.ts-snapshots/flights-chromium-darwin.png b/__tests__/flights.playwright.ts-snapshots/flights-chromium-darwin.png new file mode 100644 index 0000000..d4f90d3 Binary files /dev/null and b/__tests__/flights.playwright.ts-snapshots/flights-chromium-darwin.png differ diff --git a/__tests__/home.playwright.ts b/__tests__/home.playwright.ts new file mode 100644 index 0000000..19b99b8 --- /dev/null +++ b/__tests__/home.playwright.ts @@ -0,0 +1,9 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Home', () => { + test(`should match snapshot`, async ({ page }) => { + await page.goto(`http://localhost:3000`, { waitUntil: 'networkidle' }); + + expect(await page.screenshot({ fullPage: true })).toMatchSnapshot(`home.png`, { threshold: 50 }); + }); +}); diff --git a/__tests__/home.playwright.ts-snapshots/home-Mobile-Chrome-darwin.png b/__tests__/home.playwright.ts-snapshots/home-Mobile-Chrome-darwin.png new file mode 100644 index 0000000..45982b1 Binary files /dev/null and b/__tests__/home.playwright.ts-snapshots/home-Mobile-Chrome-darwin.png differ diff --git a/__tests__/home.playwright.ts-snapshots/home-Tablet-Safari-darwin.png b/__tests__/home.playwright.ts-snapshots/home-Tablet-Safari-darwin.png new file mode 100644 index 0000000..aa84932 Binary files /dev/null and b/__tests__/home.playwright.ts-snapshots/home-Tablet-Safari-darwin.png differ diff --git a/__tests__/home.playwright.ts-snapshots/home-chromium-darwin.png b/__tests__/home.playwright.ts-snapshots/home-chromium-darwin.png new file mode 100644 index 0000000..eeedebc Binary files /dev/null and b/__tests__/home.playwright.ts-snapshots/home-chromium-darwin.png differ diff --git a/package-lock.json b/package-lock.json index f22e211..5486fc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "@infinum/plop-next-ts-generators": "~1.0.2", "@next/bundle-analyzer": "~13.0.6", "@next/eslint-plugin-next": "~13.0.6", + "@playwright/test": "~1.28.1", "@storybook/addon-a11y": "~6.5.14", "@storybook/addon-actions": "~6.5.14", "@storybook/addon-essentials": "~6.5.14", @@ -5780,6 +5781,22 @@ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "node_modules/@playwright/test": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.1.tgz", + "integrity": "sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.28.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -6517,9 +6534,9 @@ "dev": true }, "node_modules/@storybook/builder-webpack4/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/builder-webpack4/node_modules/@webassemblyjs/ast": { @@ -7839,9 +7856,9 @@ } }, "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/channel-postmessage": { @@ -8132,9 +8149,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/core-common/node_modules/@webassemblyjs/ast": { @@ -8951,9 +8968,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/core-server/node_modules/@webassemblyjs/ast": { @@ -9805,9 +9822,9 @@ "dev": true }, "node_modules/@storybook/manager-webpack4/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/manager-webpack4/node_modules/@webassemblyjs/ast": { @@ -11130,9 +11147,9 @@ } }, "node_modules/@storybook/manager-webpack5/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/manager-webpack5/node_modules/ansi-styles": { @@ -11565,9 +11582,9 @@ } }, "node_modules/@storybook/react/node_modules/@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "node_modules/@storybook/react/node_modules/is-plain-object": { @@ -14155,9 +14172,9 @@ } }, "node_modules/axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", + "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==", "engines": { "node": ">=4" } @@ -18682,9 +18699,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -22093,11 +22110,11 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -26295,9 +26312,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/type-fest": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.3.0.tgz", - "integrity": "sha512-gezeeOIZyQLGW5uuCeEnXF1aXmtt2afKspXz3YqoOcZ3l/YMJq1pujvgT+cz/Nw1O/7q/kSav5fihJHsC/AOUg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.4.0.tgz", + "integrity": "sha512-PEPg6RHlB9cFwoTMNENNrQFL0cXX04voWr2UPwQBJ3pVs7Mt8Y1oLWdUeMdGEwZE8HFFlujq8gS9enmyiQ8pLg==", "dev": true, "engines": { "node": ">=14.16" @@ -28934,9 +28951,9 @@ } }, "node_modules/node-plop/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -28965,9 +28982,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", + "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -30148,6 +30165,18 @@ "node": ">=10" } }, + "node_modules/playwright-core": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.1.tgz", + "integrity": "sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==", + "dev": true, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/plop": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", @@ -40810,6 +40839,16 @@ } } }, + "@playwright/test": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.1.tgz", + "integrity": "sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==", + "dev": true, + "requires": { + "@types/node": "*", + "playwright-core": "1.28.1" + } + }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -41248,9 +41287,9 @@ "dev": true }, "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "@webassemblyjs/ast": { @@ -42308,9 +42347,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true } } @@ -42521,9 +42560,9 @@ } }, "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "@webassemblyjs/ast": { @@ -43201,9 +43240,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "@webassemblyjs/ast": { @@ -43912,9 +43951,9 @@ "dev": true }, "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "@webassemblyjs/ast": { @@ -44970,9 +45009,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "ansi-styles": { @@ -45194,9 +45233,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.8.tgz", - "integrity": "sha512-TrpoNiaPvBH5h8rQQenMtVsJXtGsVBRJrcp2Ik6oEt99jHfGvDLh20VTTq3ixTbjYujukYz1IlY4N8a8yfY0jA==", + "version": "16.18.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.9.tgz", + "integrity": "sha512-nhrqXYxiQ+5B/tPorWum37VgAiefi/wmfJ1QZKGKKecC8/3HqcTTJD0O+VABSPwtseMMF7NCPVT9uGgwn0YqsQ==", "dev": true }, "is-plain-object": { @@ -47320,9 +47359,9 @@ "dev": true }, "axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", + "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==" }, "axobject-query": { "version": "2.2.0", @@ -50959,9 +50998,9 @@ }, "dependencies": { "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -53469,11 +53508,11 @@ } }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -56682,9 +56721,9 @@ } }, "type-fest": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.3.0.tgz", - "integrity": "sha512-gezeeOIZyQLGW5uuCeEnXF1aXmtt2afKspXz3YqoOcZ3l/YMJq1pujvgT+cz/Nw1O/7q/kSav5fihJHsC/AOUg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.4.0.tgz", + "integrity": "sha512-PEPg6RHlB9cFwoTMNENNrQFL0cXX04voWr2UPwQBJ3pVs7Mt8Y1oLWdUeMdGEwZE8HFFlujq8gS9enmyiQ8pLg==", "dev": true } } @@ -58611,9 +58650,9 @@ }, "dependencies": { "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "dev": true, "requires": { "dir-glob": "^3.0.1", @@ -58632,9 +58671,9 @@ } }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", + "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==" }, "normalize-package-data": { "version": "2.5.0", @@ -59536,6 +59575,12 @@ "find-up": "^5.0.0" } }, + "playwright-core": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.1.tgz", + "integrity": "sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==", + "dev": true + }, "plop": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", diff --git a/package.json b/package.json index 05f5dcd..5c8a5ff 100644 --- a/package.json +++ b/package.json @@ -4,25 +4,26 @@ "private": true, "scripts": { "dev": "PROXY_ENV=development next dev", - "build": "next build", - "postbuild": "next-sitemap", - "start": "next start", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.d.ts", - "lint:next": "next lint", - "test": "jest", - "test:coverage": "jest --coverage", - "test:watch": "jest --watch --coverage", - "storybook": "start-storybook -p 6006", - "build-storybook": "build-storybook", - "analyze": "ANALYZE=true yarn build", - "analyze:sourcemap": "source-map-explorer .next/static/**/*.js", - "prepare": "husky install", - "gen:theme-typings": "chakra-cli tokens ./src/styles/theme/index.ts --strict-component-types --strict-token-types", - "gen:theme-typings:watch": "chakra-cli tokens ./src/styles/theme/index.ts --strict-component-types --strict-token-types --watch", - "i18n:generate": "node ./scripts/i18next-cli.js", - "gen:component": "plop component", - "gen:theme": "plop theme", - "postinstall": "npm run gen:theme-typings" + "build": "next build", + "postbuild": "next-sitemap", + "start": "next start", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.d.ts", + "lint:next": "next lint", + "test": "jest", + "test:coverage": "jest --coverage", + "test:watch": "jest --watch --coverage", + "test:playwright": "playwright test", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook", + "analyze": "ANALYZE=true yarn build", + "analyze:sourcemap": "source-map-explorer .next/static/**/*.js", + "prepare": "husky install", + "gen:theme-typings": "chakra-cli tokens ./src/styles/theme/index.ts --strict-component-types --strict-token-types", + "gen:theme-typings:watch": "chakra-cli tokens ./src/styles/theme/index.ts --strict-component-types --strict-token-types --watch", + "i18n:generate": "node ./scripts/i18next-cli.js", + "gen:component": "plop component", + "gen:theme": "plop theme", + "postinstall": "npm run gen:theme-typings" }, "dependencies": { "@bugsnag/js": "~7.18.0", @@ -60,6 +61,7 @@ "@infinum/plop-next-ts-generators": "~1.0.2", "@next/bundle-analyzer": "~13.0.6", "@next/eslint-plugin-next": "~13.0.6", + "@playwright/test": "~1.28.1", "@storybook/addon-a11y": "~6.5.14", "@storybook/addon-actions": "~6.5.14", "@storybook/addon-essentials": "~6.5.14", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..c399f6b --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,119 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +const config: PlaywrightTestConfig = { + testDir: './__tests__', + testMatch: '**/*.playwright.ts', + /* Maximum time one test can run for. */ + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000, + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + { + name: 'Mobile Chrome', + use: { + ...devices['Pixel 5'], + }, + }, + { + name: 'Tablet Safari', + use: { + ...devices['iPad (gen 7)'], + }, + }, + // { + // name: 'firefox', + // use: { + // ...devices['Desktop Firefox'], + // }, + // }, + + // { + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { + // ...devices['Pixel 5'], + // }, + // }, + // { + // name: 'Mobile Safari', + // use: { + // ...devices['iPhone 12'], + // }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { + // channel: 'msedge', + // }, + // }, + // { + // name: 'Google Chrome', + // use: { + // channel: 'chrome', + // }, + // }, + ], + + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ + // outputDir: 'test-results/', + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // port: 3000, + // }, +}; + +export default config;