diff --git a/basic-host-remote/cypress.env.json b/basic-host-remote/cypress.env.json deleted file mode 100644 index c65e6cd032e..00000000000 --- a/basic-host-remote/cypress.env.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "allure": true, - "allureResultsPath": "../cypress-e2e/results/allure-results" -} diff --git a/basic-host-remote/e2e/checkApplications.cy.ts b/basic-host-remote/e2e/checkApplications.cy.ts deleted file mode 100644 index f0f2623a26f..00000000000 --- a/basic-host-remote/e2e/checkApplications.cy.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { BaseMethods } from '../../cypress-e2e/common/base'; -import { baseSelectors } from '../../cypress-e2e/common/selectors'; -import { Constants } from '../../cypress-e2e/fixtures/constants'; - -const basePage: BaseMethods = new BaseMethods(); - -let appsData = [ - { - headerSelector: baseSelectors.tags.headers.h1, - subHeaderSelector: baseSelectors.tags.headers.h2, - buttonSelector: baseSelectors.tags.coreElements.button, - headerText: Constants.commonConstantsData.basicComponents.basicHostRemote, - appNameText: Constants.commonConstantsData.commonCountAppNames.app1, - buttonNameText: Constants.updatedConstantsData.commonAppWithButton.app2, - host: 3001, - }, - { - headerSelector: baseSelectors.tags.headers.h1, - subHeaderSelector: baseSelectors.tags.headers.h2, - buttonSelector: baseSelectors.tags.coreElements.button, - headerText: Constants.commonConstantsData.basicComponents.basicHostRemote, - appNameText: Constants.commonConstantsData.commonCountAppNames.app2, - buttonNameText: Constants.updatedConstantsData.commonAppWithButton.app2, - host: 3002, - }, -]; - -appsData.forEach(function (property: { - headerSelector: string; - subHeaderSelector: string; - buttonSelector: string; - headerText: string; - appNameText: string; - buttonNameText: string; - host: number; -}) { - let host = property.host === 3002 ? appsData[1].host : appsData[0].host; - let appName = property.host === 3002 ? appsData[1].appNameText : appsData[0].appNameText; - - describe('Basic Host remote', () => { - context(`Check ${appName}`, () => { - it(`Check ${appName} built and running`, () => { - basePage.openLocalhost({ - number: host, - }); - basePage.checkElementWithTextPresence({ - selector: property.headerSelector, - text: property.headerText, - }); - basePage.checkElementWithTextPresence({ - selector: property.subHeaderSelector, - text: `${appName}`, - }); - }); - - it(`Check buttons in ${appName} exist`, () => { - basePage.openLocalhost({ - number: host, - }); - basePage.checkElementWithTextPresence({ - selector: property.buttonSelector, - text: property.buttonNameText, - }); - }); - }); - }); -}); diff --git a/basic-host-remote/e2e/checkApplications.spec.ts b/basic-host-remote/e2e/checkApplications.spec.ts new file mode 100644 index 00000000000..8b34d9117bb --- /dev/null +++ b/basic-host-remote/e2e/checkApplications.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from '@playwright/test'; + +const apps = [ + { port: 3001, name: 'App 1' }, + { port: 3002, name: 'App 2' }, +]; + +apps.forEach(({ port, name }) => { + test.describe(`Check ${name}`, () => { + test(`Check ${name} built and running`, async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await expect(page.getByRole('heading', { level: 1 })).toContainText('Basic Host-Remote'); + await expect(page.getByRole('heading', { level: 2, name })).toBeVisible(); + }); + + test(`Check buttons in ${name} exist`, async ({ page }) => { + await page.goto(`http://localhost:${port}`); + await expect(page.getByRole('button')).toHaveText('App 2 Button!!!!'); + }); + }); +}); + diff --git a/basic-host-remote/package.json b/basic-host-remote/package.json index 9ca83030022..5952f0155a9 100644 --- a/basic-host-remote/package.json +++ b/basic-host-remote/package.json @@ -12,10 +12,15 @@ "build": "pnpm --filter basic-host-remote_* run build", "serve": "pnpm --filter basic-host-remote_* run serve", "clean": "pnpm --filter basic-host-remote_* run reset", - "e2e:ci": "pnpm build && pnpm serve & sleep 60 && npx cypress run --config-file ../cypress-e2e/config/cypress.config.ts --config '{\"supportFile\": \"../cypress-e2e/support/e2e.ts\"}' --spec \"./e2e/*.cy.ts\" --browser=chrome" + "test:e2e": "npx playwright test", + "test:e2e:ui": "npx playwright test --ui", + "test:e2e:debug": "npx playwright test --debug", + "e2e:ci": "pnpm build && npx playwright install --with-deps && npx playwright test --reporter=list" }, "devDependencies": { "concurrently": "8.2.2", - "wait-on": "7.2.0" + "wait-on": "7.2.0", + "@playwright/test": "^1.54.2", + "playwright": "^1.54.2" } } diff --git a/basic-host-remote/playwright.config.ts b/basic-host-remote/playwright.config.ts new file mode 100644 index 00000000000..238afa96053 --- /dev/null +++ b/basic-host-remote/playwright.config.ts @@ -0,0 +1,47 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './e2e', + timeout: 60000, + expect: { + timeout: 15000, + }, + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: [ + ['html', { outputFolder: 'playwright-report', open: 'never' }], + ['list'], + ], + use: { + baseURL: 'http://localhost:3001', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + video: 'retain-on-failure', + viewport: { width: 1920, height: 1080 }, + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + + webServer: [ + { + command: 'cd app1 && pnpm serve', + port: 3001, + reuseExistingServer: !process.env.CI, + timeout: 120000, + }, + { + command: 'cd app2 && pnpm serve', + port: 3002, + reuseExistingServer: !process.env.CI, + timeout: 120000, + }, + ], +}); + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b902c6eb51..b36983cf0bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -876,9 +876,15 @@ importers: basic-host-remote: devDependencies: + '@playwright/test': + specifier: ^1.54.2 + version: 1.54.2 concurrently: specifier: 8.2.2 version: 8.2.2 + playwright: + specifier: ^1.54.2 + version: 1.54.2 wait-on: specifier: 7.2.0 version: 7.2.0 @@ -5875,7 +5881,7 @@ importers: version: 2.57.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@module-federation/modern-js': specifier: 0.17.1 - version: 0.17.1(@rsbuild/core@1.4.12)(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@4.9.5)(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.17))) + version: 0.17.1(@rsbuild/core@1.0.1-beta.3)(@rspack/core@1.4.11(@swc/helpers@0.5.11))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@4.9.5)(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19)) react: specifier: ~18.3.0 version: 18.3.1 @@ -5888,7 +5894,7 @@ importers: version: 2.57.0(typescript@4.9.5) '@modern-js/app-tools': specifier: 2.57.0 - version: 2.57.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@swc/core@1.11.31(@swc/helpers@0.5.17))(@types/webpack@5.28.0(@swc/core@1.11.31(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.28.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(ts-node@10.9.2(@swc/core@1.11.31(@swc/helpers@0.5.17))(@types/node@16.18.101)(typescript@4.9.5))(tsconfig-paths@4.2.0)(type-fest@2.19.0)(typescript@4.9.5)(webpack-dev-server@4.15.2(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) + version: 2.57.0(@rspack/core@1.4.11(@swc/helpers@0.5.11))(@swc/core@1.11.31(@swc/helpers@0.5.11))(@types/webpack@5.28.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19))(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(ts-node@10.9.2(@swc/core@1.11.31(@swc/helpers@0.5.11))(@types/node@16.18.101)(typescript@4.9.5))(tsconfig-paths@4.2.0)(type-fest@2.19.0)(typescript@4.9.5)(webpack-dev-server@4.15.2(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19)))(webpack-hot-middleware@2.26.1) '@modern-js/eslint-config': specifier: 2.57.0 version: 2.57.0(typescript@4.9.5) @@ -5930,7 +5936,7 @@ importers: version: 2.57.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@module-federation/modern-js': specifier: 0.17.1 - version: 0.17.1(@rsbuild/core@1.0.1-beta.3)(@rspack/core@1.4.11(@swc/helpers@0.5.11))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@4.9.5)(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19)) + version: 0.17.1(@rsbuild/core@1.4.12)(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.30.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(typescript@4.9.5)(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.17))) react: specifier: ^18.2.0 version: 18.3.1 @@ -5943,7 +5949,7 @@ importers: version: 2.57.0(typescript@4.9.5) '@modern-js/app-tools': specifier: 2.57.0 - version: 2.57.0(@rspack/core@1.4.11(@swc/helpers@0.5.11))(@swc/core@1.11.31(@swc/helpers@0.5.11))(@types/webpack@5.28.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19))(encoding@0.1.13)(eslint@8.57.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(ts-node@10.9.2(@swc/core@1.11.31(@swc/helpers@0.5.11))(@types/node@16.18.101)(typescript@4.9.5))(tsconfig-paths@4.2.0)(type-fest@2.19.0)(typescript@4.9.5)(webpack-dev-server@4.15.2(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.11))(esbuild@0.17.19)))(webpack-hot-middleware@2.26.1) + version: 2.57.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(@swc/core@1.11.31(@swc/helpers@0.5.17))(@types/webpack@5.28.0(@swc/core@1.11.31(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.6.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.28.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(ts-node@10.9.2(@swc/core@1.11.31(@swc/helpers@0.5.17))(@types/node@16.18.101)(typescript@4.9.5))(tsconfig-paths@4.2.0)(type-fest@2.19.0)(typescript@4.9.5)(webpack-dev-server@4.15.2(webpack@5.101.0(@swc/core@1.11.31(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) '@modern-js/eslint-config': specifier: 2.57.0 version: 2.57.0(typescript@4.9.5) @@ -42928,7 +42934,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.24.7) '@vanilla-extract/babel-plugin-debug-ids': 1.2.2 '@vanilla-extract/css': 1.17.4(babel-plugin-macros@3.1.0) - esbuild: 0.17.6 + esbuild: 0.18.20 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 @@ -49782,7 +49788,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1