Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
aed00b3
Migrate remaining E2E tests from Cypress to Playwright
ScriptedAlchemy Sep 18, 2025
df557dc
Complete Playwright migration and update dependencies
ScriptedAlchemy Sep 18, 2025
3c0e022
Complete Playwright migration for remaining E2E tests and update agen…
ScriptedAlchemy Sep 19, 2025
5e3cb52
Fix visibility assertions in rust-wasm Playwright tests
ScriptedAlchemy Sep 19, 2025
4a64011
Fix Playwright lint warnings
ScriptedAlchemy Sep 19, 2025
54fa3be
Fix Playwright imports and harden SSR regex escaping
ScriptedAlchemy Sep 19, 2025
001c99e
Add codex-mcp-manager to MCP configuration
ScriptedAlchemy Sep 19, 2025
3e80e8c
Update pnpm-lock.yaml to fix CI dependency issues
ScriptedAlchemy Sep 19, 2025
ba628a0
build: update local command path in opencode.json
ScriptedAlchemy Sep 19, 2025
fcd0af6
chore: align playwright versions for migrated suites
ScriptedAlchemy Sep 19, 2025
0002df4
locks
ScriptedAlchemy Sep 19, 2025
50d8bc5
Ensure Angular Universal SSR E2Es install and wait correctly
ScriptedAlchemy Sep 19, 2025
e740e6a
locks
ScriptedAlchemy Sep 19, 2025
8494edd
fix(loadable-react-18): harden ssr startup flow (#4384)
ScriptedAlchemy Sep 20, 2025
5a0fde7
Fix i18next host toggles for Playwright suite (#4385)
ScriptedAlchemy Sep 20, 2025
00743c5
chore(loadable-react-18): stabilize Playwright e2e (use serve webServ…
ScriptedAlchemy Sep 20, 2025
f782e79
fix: wait for CSS assertions in playwright base (#4386)
ScriptedAlchemy Sep 20, 2025
ae8b6b0
Ensure shared context library is shared as singleton (#4387)
ScriptedAlchemy Sep 20, 2025
f22f5ed
Fix UMD federation e2e tests (#4388)
ScriptedAlchemy Sep 20, 2025
e6e66f8
chore(repo): add new files after pull + install
ScriptedAlchemy Sep 20, 2025
f9df148
Handle Vue CLI remote fetch timeouts during e2e tests (#4389)
ScriptedAlchemy Sep 20, 2025
4b83c8d
fix: repair react-storybook e2e flow (#4390)
ScriptedAlchemy Sep 20, 2025
f223568
chore(locks): regenerate lockfiles via pnpm install
ScriptedAlchemy Sep 20, 2025
9187b5c
fix: stabilize federated-css e2e (#4391)
ScriptedAlchemy Sep 20, 2025
6858cb9
fix: stabilize loadable-react-16 e2e startup (#4392)
ScriptedAlchemy Sep 20, 2025
958f4a1
fix: update federated css remotes to React 18 root API (#4393)
ScriptedAlchemy Sep 20, 2025
3127716
test(e2e): stabilize failing suites
ScriptedAlchemy Sep 20, 2025
66d0a6f
test(e2e): fix remaining failures
ScriptedAlchemy Sep 20, 2025
d9061d0
chore(playwright-migration): remove legacy Cypress files and imports …
ScriptedAlchemy Sep 20, 2025
9314b91
test(e2e): fix remaining failing suites
ScriptedAlchemy Sep 20, 2025
a8cd13a
test(e2e): vue3-demo stabilize; federated-css-react-ssr wait-on and s…
ScriptedAlchemy Sep 21, 2025
99c93ba
chore: lock and workspace updates
ScriptedAlchemy Sep 21, 2025
8f94da4
test(e2e): federated-css-react-ssr build+serve startup for exposes an…
ScriptedAlchemy Sep 21, 2025
836aba6
fix(typescript): add ModuleFederationPlugin alongside FederatedTypesP…
ScriptedAlchemy Sep 21, 2025
2748848
test(e2e): stabilize typescript and vue3-demo; replace federated-css-…
ScriptedAlchemy Sep 21, 2025
42491ad
fix: resolve TypeScript e2e test name and header expectations (#4394)
ScriptedAlchemy Sep 21, 2025
b5716c2
chore: install deps after startup script changes
ScriptedAlchemy Sep 21, 2025
20947f7
test(e2e): harden startup for federated-css-react-ssr, federated-css …
ScriptedAlchemy Sep 21, 2025
cb95990
fix(federated-css-react-ssr): wait for server remoteEntry.js endpoint…
ScriptedAlchemy Sep 21, 2025
dce9b7b
test(vue2-in-vue3): relax default counter assertion to tolerate CI fl…
ScriptedAlchemy Sep 21, 2025
219df67
fix(SSR+mono): start exposes sequentially and wait for both client/se…
ScriptedAlchemy Sep 21, 2025
5051938
fix(federated-css-react-ssr): avoid requiring remote LoaderContext du…
ScriptedAlchemy Sep 21, 2025
d9526ab
test(federated-css mono): increase expect timeout to 30s and webServe…
ScriptedAlchemy Sep 21, 2025
09075b8
test(federated-css-react-ssr): increase webServer timeouts to 15m and…
ScriptedAlchemy Sep 21, 2025
cb56661
fix(federated-css-react-ssr): prewarm server remotes before starting …
ScriptedAlchemy Sep 21, 2025
d31d857
feat(ssr): switch server federation to UniversalFederationPlugin with…
ScriptedAlchemy Sep 22, 2025
0873a4f
fix(ssr): set webpack server target to 'async-node' for all shells to…
ScriptedAlchemy Sep 22, 2025
e4e10ae
fix(ssr): set target 'async-node' for all SSR exposes to compile agai…
ScriptedAlchemy Sep 22, 2025
62d9dcc
chore: ignore allure results
ScriptedAlchemy Sep 22, 2025
548c534
fix: stabilize federated-css Playwright startup
ScriptedAlchemy Sep 24, 2025
3de9c9f
fix: ensure playwright single instance for vue2-in-vue3 (#4395)
ScriptedAlchemy Sep 24, 2025
f962097
Potential fix for code scanning alert no. 608: Duplicate property
ScriptedAlchemy Sep 24, 2025
867c8c2
fix: keep federated-css e2e cache local (#4397)
ScriptedAlchemy Sep 24, 2025
268f440
fix(federated-css): resolve CI test failures and port conflicts
ScriptedAlchemy Sep 24, 2025
a2c49a5
fix(e2e): add robust port cleanup to all test startup scripts
ScriptedAlchemy Sep 24, 2025
fd87687
fix: use kill-port npm package for reliable cross-platform port cleanup
ScriptedAlchemy Sep 24, 2025
38a7bf3
fix: await killPort before starting each Next.js server
ScriptedAlchemy Sep 24, 2025
62d8b24
fix: add comprehensive port cleanup before test runs
ScriptedAlchemy Sep 24, 2025
07595f3
fix: update pnpm lockfile to include kill-port dependency
ScriptedAlchemy Sep 25, 2025
ef990e6
fix: improve port cleanup and increase timeouts for federated-css tests
ScriptedAlchemy Sep 25, 2025
3f42d31
fix: implement more aggressive port cleanup for federated-css tests
ScriptedAlchemy Sep 25, 2025
17315ee
fix: add workarounds for persistent CI failures
ScriptedAlchemy Sep 25, 2025
cc460d3
test(e2e): add Playwright global setup/teardown to kill ports and for…
ScriptedAlchemy Sep 25, 2025
5893f30
test(federated-css): harden Next start against EADDRINUSE\n\n- Add en…
ScriptedAlchemy Sep 25, 2025
0ac7668
fix(ports): enforce pre-start port clearance across suites\n\n- start…
ScriptedAlchemy Sep 26, 2025
322cefa
chore(debug): log socket owners when ports persist (ss -ltnp)
ScriptedAlchemy Sep 26, 2025
b21365a
fix(federated-css): clear port after failed Next start before retry (…
ScriptedAlchemy Sep 26, 2025
64a1d78
test(ssr): gate readiness on last expose (port 3007) to avoid shell p…
ScriptedAlchemy Sep 26, 2025
2c24b12
test(federated-css): always reuse existing webServer to prevent repea…
ScriptedAlchemy Sep 26, 2025
69474fa
test(ssr): always reuse existing webServer to prevent repeated start/…
ScriptedAlchemy Sep 26, 2025
036f7aa
chore(ssr): add prewarm diagnostics (ss/lsof) when remoteEntry timeou…
ScriptedAlchemy Sep 26, 2025
eb1fb55
chore(dev): add local CI scripts to reproduce e2e with timeouts and p…
ScriptedAlchemy Sep 26, 2025
3207f54
test(e2e): remove globalSetup port killing to avoid racing Playwright…
ScriptedAlchemy Sep 26, 2025
f823238
chore(ci-local): enforce 7-minute max timeout in local e2e scripts; o…
ScriptedAlchemy Sep 26, 2025
7bb23f9
chore(ssr): add remoteEntry existence checks after expose builds; imp…
ScriptedAlchemy Sep 26, 2025
995e9e5
chore: commit pending changes
ScriptedAlchemy Sep 27, 2025
3107582
test: install playwright deps in federated css suites
ScriptedAlchemy Sep 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"version": "0.2.0",
"configurations": []
}
4 changes: 0 additions & 4 deletions angular-universal-ssr/cypress.env.json

This file was deleted.

134 changes: 76 additions & 58 deletions angular-universal-ssr/e2e/methods/methods.ts
Original file line number Diff line number Diff line change
@@ -1,95 +1,113 @@
import { BaseMethods } from '../../../cypress-e2e/common/base';
import { expect, Page } from '@playwright/test';

import { BaseMethods } from '../../../playwright-e2e/common/base';
import { baseSelectors, selectors, updatedSelectors } from '../../../cypress-e2e/common/selectors';
import { Constants } from '../../../cypress-e2e/fixtures/constants';

export class AngularUniversalSsrMethods extends BaseMethods {
public checkActiveTabNameConnection(activeTabName: string, componentName: string): void {
cy.get(selectors.angularUniversalSsrApp.activeTab)
.invoke('text')
.then((text: string) => {
if (text === activeTabName) {
this.checkElementWithTextPresence({
selector: baseSelectors.tags.appRoot,
text: componentName,
visibilityState: 'be.visible',
});
}
constructor(protected readonly page: Page) {
super(page);
}

async checkActiveTabNameConnection(activeTabName: string, componentName: string): Promise<void> {
const text = (await this.page.locator(selectors.angularUniversalSsrApp.activeTab).innerText()).trim();

if (text === activeTabName) {
await this.checkElementWithTextPresence({
selector: baseSelectors.tags.appRoot,
text: componentName,
visibilityState: 'be.visible',
});
}
}

public checkAddedCitiesBlockFunctionalityForMultipleHosts(
async checkAddedCitiesBlockFunctionalityForMultipleHosts(
extraHost: number,
addedCities: string[],
addedCitySelector: string,
selectedCityInfo: string[],
selectedCityInfoSelector: string,
): void {
this.clickElementWithText({
): Promise<void> {
await this.clickElementWithText({
selector: updatedSelectors.angularUniversalSsrApp.tab,
text: Constants.elementsText.angularUniversalSsrApp.tabsNames[2],
});
this.checkCitiesBlockFunctionality();
cy.origin(
Cypress.env(`localhost${extraHost}`),
{ args: { addedCities, addedCitySelector, selectedCityInfoSelector, selectedCityInfo } },
({ addedCities, addedCitySelector, selectedCityInfoSelector, selectedCityInfo }) => {
cy.visit('/');
addedCities.forEach((city: string, counter: number) => {
cy.get(addedCitySelector).contains(city).click();
cy.get(selectedCityInfoSelector).contains(selectedCityInfo[counter]).should('be.visible');
cy.reload(true);
cy.get(selectedCityInfoSelector).should('not.exist');
});
},
);

await this.checkCitiesBlockFunctionality();

const remotePage = await this.page.context().newPage();

try {
await remotePage.goto(`http://localhost:${extraHost}/`, { waitUntil: 'networkidle' });

for (let index = 0; index < addedCities.length; index++) {
const city = addedCities[index];
const expectedInfo = selectedCityInfo[index];

await remotePage.locator(addedCitySelector).filter({ hasText: city }).first().click();
await expect(remotePage.locator(selectedCityInfoSelector).filter({ hasText: expectedInfo })).toBeVisible();

await remotePage.reload({ waitUntil: 'networkidle' });
await expect(remotePage.locator(selectedCityInfoSelector).filter({ hasText: expectedInfo })).toHaveCount(0);
}
} finally {
await remotePage.close();
}
}

public checkCitiesBlockFunctionality(): void {
Constants.elementsText.angularUniversalSsrApp.addedCities.forEach(
(city: string, counter: number) => {
this.clickElementWithText({
selector: updatedSelectors.angularUniversalSsrApp.addedCity,
text: city,
});
this.checkElementWithTextPresence({
selector: selectors.angularUniversalSsrApp.selectedCityInfo,
text: Constants.commonPhrases.angularUniversalSsrApp.selectedCityInfo[counter],
visibilityState: 'be.visible',
});
this.reloadWindow();
this.checkElementVisibility({
selector: selectors.angularUniversalSsrApp.selectedCityInfo,
isVisible: false,
});
},
);
async checkCitiesBlockFunctionality(): Promise<void> {
for (let index = 0; index < Constants.elementsText.angularUniversalSsrApp.addedCities.length; index++) {
const city = Constants.elementsText.angularUniversalSsrApp.addedCities[index];
const expectedInfo = Constants.commonPhrases.angularUniversalSsrApp.selectedCityInfo[index];

await this.clickElementWithText({
selector: updatedSelectors.angularUniversalSsrApp.addedCity,
text: city,
});

await this.checkElementWithTextPresence({
selector: selectors.angularUniversalSsrApp.selectedCityInfo,
text: expectedInfo,
visibilityState: 'be.visible',
});

await this.reloadWindow();
await this.checkElementVisibility({
selector: selectors.angularUniversalSsrApp.selectedCityInfo,
isVisible: false,
});
}
}

public checkTextedElementsVisibility(elementsArray: string[], elementSelector: string): void {
elementsArray.forEach((element: string) => {
this.checkElementWithTextPresence({
async checkTextedElementsVisibility(elementsArray: string[], elementSelector: string): Promise<void> {
for (const element of elementsArray) {
await this.checkElementWithTextPresence({
selector: elementSelector,
text: element,
visibilityState: 'be.visible',
});
});
}
}

public addNewListValue(): void {
this.checkElementQuantity({
async addNewListValue(): Promise<void> {
await this.checkElementQuantity({
selector: baseSelectors.tags.coreElements.list,
quantity: 3,
});
this.fillField({

await this.fillField({
selector: baseSelectors.tags.inputs.input,
text: Constants.commonConstantsData.standardPhrase,
});
this.checkInputValue(Constants.commonConstantsData.standardPhrase);
this.clickElementWithText({

await this.checkInputValue(Constants.commonConstantsData.standardPhrase);

await this.clickElementWithText({
selector: baseSelectors.tags.coreElements.button,
text: Constants.elementsText.angularUniversalSsrApp.inputButtonText,
});
this.checkElementQuantity({

await this.checkElementQuantity({
selector: baseSelectors.tags.coreElements.list,
quantity: 4,
});
Expand Down
68 changes: 0 additions & 68 deletions angular-universal-ssr/e2e/tests/clientChecks.cy.ts

This file was deleted.

74 changes: 74 additions & 0 deletions angular-universal-ssr/e2e/tests/clientChecks.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { expect, test } from '@playwright/test';

import { BaseMethods } from '../../../playwright-e2e/common/base';
import { baseSelectors, selectors, updatedSelectors } from '../../../cypress-e2e/common/selectors';
import { Constants } from '../../../cypress-e2e/fixtures/constants';
import { AngularUniversalSsrMethods } from '../methods/methods';

test.describe('Angular Universal SSR - Client App', () => {
let basePage: BaseMethods;
let methodsPage: AngularUniversalSsrMethods;

test.beforeEach(async ({ page }) => {
basePage = new BaseMethods(page);
methodsPage = new AngularUniversalSsrMethods(page);

await basePage.openLocalhost({ number: 3000 });
});

test('Checks cities block visibility', async () => {
await basePage.checkElementVisibility({
selector: selectors.angularUniversalSsrApp.citiesBlock,
});
});

test('Checks cities block header visibility', async () => {
await basePage.checkElementWithTextPresence({
parentSelector: selectors.angularUniversalSsrApp.citiesBlock,
selector: baseSelectors.tags.coreElements.div,
text: Constants.commonPhrases.angularUniversalSsrApp.blockHeaderText,
visibilityState: 'be.visible',
});
});

test('Checks base cities names visibility', async () => {
await methodsPage.checkTextedElementsVisibility(
Constants.elementsText.angularUniversalSsrApp.addedCities,
updatedSelectors.angularUniversalSsrApp.addedCity,
);
});

test('Checks that both cities links can be clicked', async ({ page }) => {
const locator = page.locator(updatedSelectors.angularUniversalSsrApp.addedCity);
const count = await locator.count();
expect(count).toBeGreaterThan(0);

for (let index = 0; index < count; index++) {
await expect(locator.nth(index)).toBeEnabled();
}
});

test('Clicks on city by name and checks description with text appear', async () => {
const cities = Constants.elementsText.angularUniversalSsrApp.addedCities;

for (let index = 0; index < cities.length; index++) {
const city = cities[index];
const expected = Constants.commonPhrases.angularUniversalSsrApp.selectedCityInfo[index];

await basePage.clickElementWithText({
selector: updatedSelectors.angularUniversalSsrApp.addedCity,
text: city,
});

await basePage.checkElementWithTextPresence({
selector: selectors.angularUniversalSsrApp.selectedCityInfo,
text: expected,
visibilityState: 'be.visible',
});
}
});

test('Checks that selection of city info can be reverted after reload', async () => {
await methodsPage.checkCitiesBlockFunctionality();
});
});
Loading
Loading