From 28200a3ddbe35c6114c13433868e74121e3f79ca Mon Sep 17 00:00:00 2001 From: Jason Kuhrt Date: Mon, 17 Feb 2025 14:52:24 -0500 Subject: [PATCH] chore(tests/e2e): proof of concept playwright e2e test --- .vscode/extensions.json | 3 +- e2e-tests/__helpers__/page/laboratory.ts | 33 +++++++++++ e2e-tests/__helpers__/playwright.ts | 10 ++++ e2e-tests/laboratory/tabs.spec.ts | 56 ++++++++++++++++++ e2e-tests/playwright.config.ts | 22 ++++++++ e2e-tests/playwright.setup.js | 17 ++++++ integration-tests/testkit/seed.ts | 7 ++- package.json | 4 ++ playwright-report/index.html | 71 +++++++++++++++++++++++ pnpm-lock.yaml | 72 +++++++++++++++++++----- test-results/.last-run.json | 4 ++ 11 files changed, 281 insertions(+), 18 deletions(-) create mode 100644 e2e-tests/__helpers__/page/laboratory.ts create mode 100644 e2e-tests/__helpers__/playwright.ts create mode 100644 e2e-tests/laboratory/tabs.spec.ts create mode 100644 e2e-tests/playwright.config.ts create mode 100644 e2e-tests/playwright.setup.js create mode 100644 playwright-report/index.html create mode 100644 test-results/.last-run.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ac9e66f84c..de4ccfd30b 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -5,6 +5,7 @@ "esbenp.prettier-vscode", "thebearingedge.vscode-sql-lit", "hashicorp.hcl", - "GraphQL.vscode-graphql" + "GraphQL.vscode-graphql", + "ms-playwright.playwright" ] } diff --git a/e2e-tests/__helpers__/page/laboratory.ts b/e2e-tests/__helpers__/page/laboratory.ts new file mode 100644 index 0000000000..79d826673a --- /dev/null +++ b/e2e-tests/__helpers__/page/laboratory.ts @@ -0,0 +1,33 @@ +import { expect, Locator } from '@playwright/test'; +import { enhancePageWithHelpers, HelpersConstructor } from '../playwright'; + +export interface LaboratoryHelpers { + graphiql: { + documentEditor: Locator; + documentEditorFill: (text: string) => Promise; + buttonNewTab: Locator; + buttonCloseTab: Locator; + }; +} + +export const createLaboratoryHelpers: HelpersConstructor = page => { + const documentEditor = page.getByRole('region', { name: 'Query Editor' }); + const buttonNewTab = page.getByRole('button', { name: 'New tab' }); + const buttonCloseTab = page.getByRole('button', { name: 'Close Tab' }); + + return { + graphiql: { + documentEditorFill: async (text: string) => { + await documentEditor.click(); + await page.keyboard.press('ControlOrMeta+KeyA'); + await page.keyboard.type(text); + await expect(documentEditor).toContainText(text); // sanity check content changed + }, + documentEditor, + buttonNewTab, + buttonCloseTab, + }, + }; +}; + +export const enhancePageWithLaboratoryHelpers = enhancePageWithHelpers(createLaboratoryHelpers); diff --git a/e2e-tests/__helpers__/playwright.ts b/e2e-tests/__helpers__/playwright.ts new file mode 100644 index 0000000000..f327fb3b32 --- /dev/null +++ b/e2e-tests/__helpers__/playwright.ts @@ -0,0 +1,10 @@ +import { Page } from '@playwright/test'; + +export const enhancePageWithHelpers = + (helpersConstructor: HelpersConstructor) => + (page: Page): page & helpers => { + Object.assign(page, helpersConstructor(page)); + return page as page & helpers; + }; + +export type HelpersConstructor<$Helpers extends object> = (page: Page) => $Helpers; diff --git a/e2e-tests/laboratory/tabs.spec.ts b/e2e-tests/laboratory/tabs.spec.ts new file mode 100644 index 0000000000..d6d9c424c2 --- /dev/null +++ b/e2e-tests/laboratory/tabs.spec.ts @@ -0,0 +1,56 @@ +import { expect, Page, test as testBase } from '@playwright/test'; +import { + enhancePageWithLaboratoryHelpers, + LaboratoryHelpers, +} from '../__helpers__/page/laboratory'; +import { initSeed } from '../../integration-tests/testkit/seed'; + +interface Context { + page: Page & LaboratoryHelpers; +} + +const test = testBase.extend({ + page: async ({ page }, use) => { + const seed = initSeed(); + const owner = await seed.createOwner(); + const org = await owner.createOrg(); + const project = await org.createProject(); + + await page.context().addCookies([ + { + name: 'sRefreshToken', + value: owner.ownerRefreshToken, + domain: 'localhost', + path: '/', + }, + ]); + + await page.goto(`${project.target.path}/laboratory`); + await use(enhancePageWithLaboratoryHelpers(page)); + }, +}); + +test('closing the last tab should reset its state to defaults', async ({ page }) => { + const { documentEditor, buttonNewTab, buttonCloseTab, documentEditorFill } = page.graphiql; + + const content = { + partialDefault: '# Welcome to GraphiQL', + document1: 'query { tab1 }', + document2: 'query { tab2 }', + }; + + // Begins with default content + await expect(documentEditor).toContainText(content.partialDefault); + // Change content + await documentEditorFill(content.document1); + // Open a new tab + await buttonNewTab.click(); + await documentEditorFill(content.document2); + // close tab 2 + await buttonCloseTab.click(); + await expect(documentEditor).toContainText(content.document1); // sanity check tab 1 content unchanged + // close tab 1 + await buttonCloseTab.click(); + // expect a new tab created with default content + await expect(documentEditor).toContainText(content.partialDefault); +}); diff --git a/e2e-tests/playwright.config.ts b/e2e-tests/playwright.config.ts new file mode 100644 index 0000000000..1c675a5f87 --- /dev/null +++ b/e2e-tests/playwright.config.ts @@ -0,0 +1,22 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + globalSetup: './playwright.setup', + testDir: './', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:3000', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); diff --git a/e2e-tests/playwright.setup.js b/e2e-tests/playwright.setup.js new file mode 100644 index 0000000000..d975e917aa --- /dev/null +++ b/e2e-tests/playwright.setup.js @@ -0,0 +1,17 @@ +import * as Path from 'node:path'; +import dotenv from 'dotenv'; + +/** + * @see https://playwright.dev/docs/test-configuration#global-setup + */ +export default async _config => { + const path = process.env.CI + ? Path.join(import.meta.dirname, '../integration-tests/.env') + : Path.join(import.meta.dirname, '../packages/services/server/.env.template'); + + dotenv.config({ path }); + + if (!process.env.CI) { + process.env.RUN_AGAINST_LOCAL_SERVICES = '1'; + } +}; diff --git a/integration-tests/testkit/seed.ts b/integration-tests/testkit/seed.ts index d48dc568dc..3877fbfc3e 100644 --- a/integration-tests/testkit/seed.ts +++ b/integration-tests/testkit/seed.ts @@ -210,9 +210,12 @@ export function initSeed() { ownerToken, ).then(r => r.expectNoGraphQLErrors()); - const targets = projectResult.createProject.ok!.createdTargets; - const target = targets[0]; const project = projectResult.createProject.ok!.createdProject; + const targets = projectResult.createProject.ok!.createdTargets.map(target => ({ + ...target, + path: `/${organization.slug}/${project.slug}/${target.slug}`, + })); + const target = targets[0]; return { project, diff --git a/package.json b/package.json index f5b68dfe7f..042d9ee6a7 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,8 @@ "seed": "tsx scripts/seed-local-env.ts", "start": "pnpm run local:setup", "test": "vitest", + "test:e2e:new": "playwright test --config e2e-tests", + "test:e2e:new:dev": "pnpm test:e2e:new --ui", "test:e2e": "CYPRESS_BASE_URL=$HIVE_APP_BASE_URL cypress run --browser chrome", "test:e2e:local": "CYPRESS_BASE_URL=http://localhost:3000 RUN_AGAINST_LOCAL_SERVICES=1 cypress open --browser chrome", "test:e2e:open": "CYPRESS_BASE_URL=$HIVE_APP_BASE_URL cypress open", @@ -70,6 +72,7 @@ "@manypkg/get-packages": "2.2.2", "@next/eslint-plugin-next": "14.2.23", "@parcel/watcher": "2.5.0", + "@playwright/test": "^1.50.1", "@sentry/cli": "2.40.0", "@swc/core": "1.10.6", "@theguild/eslint-config": "0.12.1", @@ -87,6 +90,7 @@ "gray-matter": "4.0.3", "jest-snapshot-serializer-raw": "2.0.0", "pg": "8.13.1", + "playwright": "^1.50.1", "prettier": "3.4.2", "prettier-plugin-sql": "0.18.1", "prettier-plugin-tailwindcss": "0.6.9", diff --git a/playwright-report/index.html b/playwright-report/index.html new file mode 100644 index 0000000000..0f8d436860 --- /dev/null +++ b/playwright-report/index.html @@ -0,0 +1,71 @@ + + + + + + + + + Playwright Test Report + + + + +
+ + + \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 034adb7913..e20ff9f328 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,6 +117,9 @@ importers: '@parcel/watcher': specifier: 2.5.0 version: 2.5.0 + '@playwright/test': + specifier: ^1.50.1 + version: 1.50.1 '@sentry/cli': specifier: 2.40.0 version: 2.40.0(encoding@0.1.13) @@ -168,6 +171,9 @@ importers: pg: specifier: 8.13.1 version: 8.13.1 + playwright: + specifier: ^1.50.1 + version: 1.50.1 prettier: specifier: 3.4.2 version: 3.4.2 @@ -2071,13 +2077,13 @@ importers: version: 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@theguild/components': specifier: 9.3.3 - version: 9.3.3(@theguild/tailwind-config@0.6.2(postcss-import@16.1.0(postcss@8.4.49))(postcss-lightningcss@1.0.1(postcss@8.4.49))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.7.3))))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.2.0(react@19.0.0)) + version: 9.3.3(@theguild/tailwind-config@0.6.2(postcss-import@16.1.0(postcss@8.4.49))(postcss-lightningcss@1.0.1(postcss@8.4.49))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.7.3))))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.2.0(react@19.0.0)) date-fns: specifier: 4.1.0 version: 4.1.0 next: specifier: 15.1.6 - version: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -2111,7 +2117,7 @@ importers: version: 0.0.32 next-sitemap: specifier: 4.2.3 - version: 4.2.3(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + version: 4.2.3(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) pagefind: specifier: ^1.2.0 version: 1.3.0 @@ -5518,6 +5524,11 @@ packages: resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.50.1': + resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} + engines: {node: '>=18'} + hasBin: true + '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -10288,6 +10299,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -13204,6 +13220,16 @@ packages: pkg-types@1.3.0: resolution: {integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==} + playwright-core@1.50.1: + resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.50.1: + resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -21119,6 +21145,10 @@ snapshots: picocolors: 1.1.1 tslib: 2.8.1 + '@playwright/test@1.50.1': + dependencies: + playwright: 1.50.1 + '@polka/url@1.0.0-next.25': {} '@protobufjs/aspromise@1.1.2': {} @@ -23725,7 +23755,7 @@ snapshots: typescript: 4.9.5 yargs: 16.2.0 - '@theguild/components@9.3.3(@theguild/tailwind-config@0.6.2(postcss-import@16.1.0(postcss@8.4.49))(postcss-lightningcss@1.0.1(postcss@8.4.49))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.7.3))))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.2.0(react@19.0.0))': + '@theguild/components@9.3.3(@theguild/tailwind-config@0.6.2(postcss-import@16.1.0(postcss@8.4.49))(postcss-lightningcss@1.0.1(postcss@8.4.49))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.7.3))))(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(use-sync-external-store@1.2.0(react@19.0.0))': dependencies: '@giscus/react': 3.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@next/bundle-analyzer': 15.1.5 @@ -23735,9 +23765,9 @@ snapshots: '@theguild/tailwind-config': 0.6.2(postcss-import@16.1.0(postcss@8.4.49))(postcss-lightningcss@1.0.1(postcss@8.4.49))(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.6(@swc/helpers@0.5.15))(@types/node@22.10.5)(typescript@5.7.3))) clsx: 2.1.1 fuzzy: 0.1.3 - next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - nextra-theme-docs: 4.0.5(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(use-sync-external-store@1.2.0(react@19.0.0)) + next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + nextra: 4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nextra-theme-docs: 4.0.5(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(use-sync-external-store@1.2.0(react@19.0.0)) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-paginate: 8.2.0(react@19.0.0) @@ -27145,6 +27175,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -30058,20 +30091,20 @@ snapshots: neoip@2.1.0: {} - next-sitemap@4.2.3(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)): + next-sitemap@4.2.3(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes@0.4.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 15.1.6 '@swc/counter': 0.1.3 @@ -30092,18 +30125,19 @@ snapshots: '@next/swc-win32-arm64-msvc': 15.1.6 '@next/swc-win32-x64-msvc': 15.1.6 '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.50.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@4.0.5(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(use-sync-external-store@1.2.0(react@19.0.0)): + nextra-theme-docs@4.0.5(@types/react@18.3.18)(immer@10.1.1)(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(use-sync-external-store@1.2.0(react@19.0.0)): dependencies: '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 - next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next-themes: 0.4.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - nextra: 4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nextra: 4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -30116,7 +30150,7 @@ snapshots: - immer - use-sync-external-store - nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + nextra@4.0.5(next@15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): dependencies: '@formatjs/intl-localematcher': 0.5.5 '@headlessui/react': 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -30137,7 +30171,7 @@ snapshots: mdast-util-gfm: 3.0.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 15.1.6(@babel/core@7.22.9)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-compiler-runtime: 0.0.0-experimental-22c6e49-20241219(react@19.0.0) react-dom: 19.0.0(react@19.0.0) @@ -30904,6 +30938,14 @@ snapshots: mlly: 1.7.4 pathe: 1.1.2 + playwright-core@1.50.1: {} + + playwright@1.50.1: + dependencies: + playwright-core: 1.50.1 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} points-on-curve@0.2.0: {} diff --git a/test-results/.last-run.json b/test-results/.last-run.json new file mode 100644 index 0000000000..cbcc1fbac1 --- /dev/null +++ b/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file