Skip to content

Commit 9fd426b

Browse files
committed
addressed review comments
1 parent 4f5ebd1 commit 9fd426b

7 files changed

Lines changed: 62 additions & 130 deletions

File tree

load-generator/playwright.config.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import { defineConfig, devices } from '@playwright/test';
88
// import path from 'path';
99
// dotenv.config({ path: path.resolve(__dirname, '.env') });
1010

11-
const frontend = (process.env.RHDH_FRONTEND ?? 'ofs').toLowerCase();
11+
const nfs = (process.env.RHDH_FRONTEND ?? 'ofs').toLowerCase() === 'nfs';
1212
const testMatch =
13-
frontend === 'nfs'
14-
? 'guest-login-home-catalog-nfs.spec.ts'
15-
: 'guest-login-home-catalog.spec.ts';
16-
const nfsNavigationTimeout = Number(process.env.NFS_NAVIGATION_TIMEOUT ?? 200_000);
13+
nfs ? 'guest-login-home-catalog-nfs.spec.ts' : 'guest-login-home-catalog.spec.ts';
14+
// NFS (module federation) needs longer waits for remotes to load
1715
const testTimeout = Number(
18-
process.env.PLAYWRIGHT_TEST_TIMEOUT ??
19-
(frontend === 'nfs' ? Math.max(600_000, nfsNavigationTimeout * 3) : 60_000),
16+
process.env.PLAYWRIGHT_TEST_TIMEOUT ?? (nfs ? 120_000 : 30_000),
17+
);
18+
const expectTimeout = Number(
19+
process.env.PLAYWRIGHT_EXPECT_TIMEOUT ?? (nfs ? 120_000 : 20_000),
2020
);
2121

2222
/**
@@ -26,7 +26,7 @@ export default defineConfig({
2626
testMatch,
2727
timeout: testTimeout,
2828
expect: {
29-
timeout: frontend === 'nfs' ? nfsNavigationTimeout : 20_000,
29+
timeout: expectTimeout,
3030
},
3131

3232
testDir: './scenarios',
@@ -49,8 +49,7 @@ export default defineConfig({
4949
/* Base URL to use in actions like `await page.goto('')`. */
5050
baseURL: process.env.RHDH_URL || process.env.PLAYWRIGHT_BASEURL,
5151

52-
navigationTimeout: frontend === 'nfs' ? nfsNavigationTimeout : 30_000,
53-
actionTimeout: frontend === 'nfs' ? nfsNavigationTimeout : undefined,
52+
navigationTimeout: nfs ? 120_000 : 30_000,
5453

5554
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
5655
trace: 'on-first-retry',

load-generator/scenarios/Backstage.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,4 @@ export class Backstage {
2828
sidebarItem(name: string) {
2929
return this.sidebar.getByRole('link', { name, exact: true });
3030
}
31-
32-
sidebarNavItem(name: string) {
33-
return this.sidebar
34-
.locator('span.MuiTypography-subtitle2')
35-
.filter({ hasText: new RegExp(`^${name}$`) });
36-
}
3731
}
Lines changed: 48 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,71 @@
1-
import { test as base, expect, type Page } from '@playwright/test';
1+
import { test as base, expect } from "@playwright/test";
22

3-
import { Backstage } from './Backstage';
3+
import { Backstage } from "./Backstage";
44

55
const test = base.extend<{ backstage: Backstage }>({
66
backstage: ({ page }, use) => use(new Backstage(page)),
77
});
88

99
const loops = Number(process.env.LOOPS ?? 100);
10-
const nfsNavigationTimeout = Number(process.env.NFS_NAVIGATION_TIMEOUT ?? 500_000);
11-
12-
async function isNfsHomeVisible(page: Page): Promise<boolean> {
13-
const noWidgets = page.getByText(/no widgets added/i);
14-
const addWidget = page.getByRole('button', { name: 'Add widget' });
15-
const edit = page.getByRole('button', { name: 'Edit' });
16-
17-
return (
18-
(await noWidgets.isVisible()) ||
19-
(await addWidget.isVisible()) ||
20-
(await edit.isVisible())
21-
);
22-
}
23-
24-
async function expectNfsHomeVisible(page: Page) {
25-
await expect
26-
.poll(() => isNfsHomeVisible(page), { timeout: nfsNavigationTimeout })
27-
.toBe(true);
28-
}
2910

3011
for (let i = 1; i <= loops; i++) {
3112
test(`run ${i} of ${loops}`, async ({ backstage, page }) => {
32-
await test.step('login', async () => {
33-
await page.goto('/', { timeout: nfsNavigationTimeout });
34-
// NFS + many dynamic plugins can take well over 20s on cold load.
35-
await expect(page.getByRole('button', { name: 'Enter' })).toBeVisible({
36-
timeout: nfsNavigationTimeout,
37-
});
13+
await test.step("login", async () => {
14+
await page.goto("/");
15+
await expect(page.getByRole("button", { name: "Enter" })).toBeVisible();
3816
});
3917

40-
await test.step('home', async () => {
41-
await page.getByRole('button', { name: 'Enter' }).click();
42-
await page.waitForURL('/', { timeout: nfsNavigationTimeout });
43-
44-
if (!(await isNfsHomeVisible(page))) {
45-
await backstage.sidebarNavItem('Home').click();
46-
}
47-
48-
await expectNfsHomeVisible(page);
18+
await test.step("home", async () => {
19+
await page.getByRole("button", { name: "Enter" }).click();
20+
await backstage.sidebarItem("Home").click();
21+
await expect(
22+
page.getByRole("heading", {
23+
name: "No widgets added. Start by clicking the 'Add widget' button.",
24+
}),
25+
).toBeVisible();
4926
});
5027

51-
await test.step('catalog', async () => {
52-
await backstage.sidebarItem('Catalog').click();
53-
await expect(page.getByText('Catalog', { exact: true }).first()).toBeVisible();
54-
// await expect(backstage.content.getByText('All Components (1001)')).toBeVisible();
55-
await expect(backstage.content.getByText('All Components (1000)')).toBeVisible();
56-
await expect(backstage.content.getByText('Component 1', { exact: true })).toBeVisible();
28+
await test.step("catalog", async () => {
29+
await backstage.sidebarItem("Catalog").click();
30+
await expect(backstage.pluginHeader.getByText("Catalog")).toBeVisible();
31+
await expect(
32+
backstage.content.getByText("All Components (1000)"),
33+
).toBeVisible();
34+
await expect(
35+
backstage.content.getByText("Component 1", { exact: true }),
36+
).toBeVisible();
5737
});
5838

59-
await test.step('component', async () => {
60-
await backstage.content.getByText('Component 1', { exact: true }).click();
61-
await expect(page.getByText('Component 1', { exact: true }).first()).toBeVisible();
62-
await expect(backstage.content.getByText('About')).toBeVisible();
63-
await expect(backstage.content.getByText('Group 1')).toBeVisible();
64-
await expect(backstage.content.getByText('System 1')).toBeVisible();
65-
await expect(page.getByTestId('header-tab-catalog-tab-1')).toBeVisible();
39+
await test.step("component", async () => {
40+
await backstage.content.getByText("Component 1", { exact: true }).click();
41+
await expect(backstage.header.getByText("Component 1")).toBeVisible();
42+
await expect(backstage.content.getByText("About")).toBeVisible();
43+
await expect(backstage.content.getByText("Group 1")).toBeVisible();
44+
await expect(backstage.content.getByText("System 1")).toBeVisible();
45+
await expect(
46+
backstage.tabs.getByText("Catalog Tab 1", { exact: true }),
47+
).toBeVisible();
6648
});
6749

68-
await test.step('catalog-tab-n', async () => {
69-
await page.getByTestId('header-tab-catalog-tab-1').click();
70-
await expect(page.getByText('Component 1', { exact: true }).first()).toBeVisible();
71-
await expect(page.getByText('Example User List')).toBeVisible({ timeout: 30_000 });
50+
await test.step("catalog-tab-n", async () => {
51+
await backstage.tabs.getByText("Catalog Tab 1", { exact: true }).click();
52+
await expect(backstage.header.getByText("Component 1")).toBeVisible();
53+
await expect(
54+
backstage.content.getByText("Example User List"),
55+
).toBeVisible();
7256
});
7357

74-
await test.step('page-n', async () => {
75-
await backstage.sidebar
76-
.getByRole('link', { name: /^(Page 1|page-1)$/ })
77-
.click();
78-
await expect(page.getByText(/welcome to page-?1!/i)).toBeVisible({ timeout: 30_000 });
79-
await expect(page.getByText('Information card')).toBeVisible();
80-
await expect(page.getByText('Example User List')).toBeVisible();
58+
await test.step("page-n", async () => {
59+
await backstage.sidebarItem("Page 1").click();
60+
await expect(
61+
backstage.header.getByText("Welcome to page-1!"),
62+
).toBeVisible();
63+
await expect(
64+
backstage.content.getByText("Information card"),
65+
).toBeVisible();
66+
await expect(
67+
backstage.content.getByText("Example User List"),
68+
).toBeVisible();
8169
});
8270
});
8371
}

load-generator/scenarios/guest-login-home-catalog.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const test = base.extend<{ backstage: Backstage }>({
66
backstage: ({ page }, use) => use(new Backstage(page)),
77
});
88

9-
const loops = 100; // TODO: use an env var to override this
9+
const loops = Number(process.env.LOOPS ?? 100);
1010

1111
for (let i = 1; i <= loops; i++) {
1212
test(`run ${i} of ${loops}`, async ({ backstage, page }) => {

plugins/backstage-1.49/yarn.lock

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17698,7 +17698,7 @@ __metadata:
1769817698
languageName: node
1769917699
linkType: hard
1770017700

17701-
"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.0, clsx@npm:^1.1.1, clsx@npm:^1.2.1":
17701+
"clsx@npm:^1.0.2, clsx@npm:^1.0.4, clsx@npm:^1.1.0, clsx@npm:^1.2.1":
1770217702
version: 1.2.1
1770317703
resolution: "clsx@npm:1.2.1"
1770417704
checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27
@@ -25213,13 +25213,6 @@ __metadata:
2521325213
languageName: node
2521425214
linkType: hard
2521525215

25216-
"lodash.isequal@npm:^4.0.0":
25217-
version: 4.5.0
25218-
resolution: "lodash.isequal@npm:4.5.0"
25219-
checksum: 10c0/dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f
25220-
languageName: node
25221-
linkType: hard
25222-
2522325216
"lodash.isinteger@npm:^4.0.4":
2522425217
version: 4.0.4
2522525218
resolution: "lodash.isinteger@npm:4.0.4"
@@ -25436,7 +25429,7 @@ __metadata:
2543625429
languageName: node
2543725430
linkType: hard
2543825431

25439-
"luxon@npm:^3.0.0, luxon@npm:^3.2.1, luxon@npm:^3.4.3":
25432+
"luxon@npm:^3.0.0, luxon@npm:^3.2.1":
2544025433
version: 3.7.2
2544125434
resolution: "luxon@npm:3.7.2"
2544225435
checksum: 10c0/ed8f0f637826c08c343a29dd478b00628be93bba6f068417b1d8896b61cb61c6deacbe1df1e057dbd9298334044afa150f9aaabbeb3181418ac8520acfdc2ae2
@@ -29808,19 +29801,6 @@ __metadata:
2980829801
languageName: node
2980929802
linkType: hard
2981029803

29811-
"react-draggable@npm:^4.0.0":
29812-
version: 4.7.0
29813-
resolution: "react-draggable@npm:4.7.0"
29814-
dependencies:
29815-
clsx: "npm:^2.1.1"
29816-
prop-types: "npm:^15.8.1"
29817-
peerDependencies:
29818-
react: ">= 16.3.0"
29819-
react-dom: ">= 16.3.0"
29820-
checksum: 10c0/4bfd46025b6009585a644d17721cafcd7976c058c250086c06c1a952724230c83caa548c54f9b5849c3a148144e3ed6610a1745b2afc6db685c85c56a0b4f775
29821-
languageName: node
29822-
linkType: hard
29823-
2982429804
"react-draggable@npm:^4.5.0":
2982529805
version: 4.5.0
2982629806
resolution: "react-draggable@npm:4.5.0"
@@ -29870,22 +29850,6 @@ __metadata:
2987029850
languageName: node
2987129851
linkType: hard
2987229852

29873-
"react-grid-layout@npm:1.3.4":
29874-
version: 1.3.4
29875-
resolution: "react-grid-layout@npm:1.3.4"
29876-
dependencies:
29877-
clsx: "npm:^1.1.1"
29878-
lodash.isequal: "npm:^4.0.0"
29879-
prop-types: "npm:^15.8.1"
29880-
react-draggable: "npm:^4.0.0"
29881-
react-resizable: "npm:^3.0.4"
29882-
peerDependencies:
29883-
react: ">= 16.3.0"
29884-
react-dom: ">= 16.3.0"
29885-
checksum: 10c0/2c4a9ca1284cf6a618070aeccf8ffb8d2d91798452f7606395a4524bda27fad82ba9c818cb3e420d617fec8aed93c0caaae060c714d21a929c6f5c75727697b7
29886-
languageName: node
29887-
linkType: hard
29888-
2988929853
"react-helmet@npm:6.1.0":
2989029854
version: 6.1.0
2989129855
resolution: "react-helmet@npm:6.1.0"
@@ -30105,19 +30069,6 @@ __metadata:
3010530069
languageName: node
3010630070
linkType: hard
3010730071

30108-
"react-resizable@npm:^3.0.4":
30109-
version: 3.2.0
30110-
resolution: "react-resizable@npm:3.2.0"
30111-
dependencies:
30112-
prop-types: "npm:15.x"
30113-
react-draggable: "npm:^4.5.0"
30114-
peerDependencies:
30115-
react: ">= 16.3"
30116-
react-dom: ">= 16.3"
30117-
checksum: 10c0/b589bca0b1135dc4bf875f09dd677821bfe4b468e5c9ec7e37d91a06ca49281f3dec289d5aa41a7cc0f4603872610b0c5d1d077287c3fef73a5c9339d3216598
30118-
languageName: node
30119-
linkType: hard
30120-
3012130072
"react-resizable@npm:^3.0.5":
3012230073
version: 3.1.3
3012330074
resolution: "react-resizable@npm:3.1.3"

plugins/backstage-1.52/app-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ app:
1414
availableLanguages: ['en', 'de', 'es', 'fr', 'it', 'ja']
1515
defaultLanguage: 'en'
1616
- nav-item:user-settings: false
17-
- nav-item:search: false
17+
- nav-item:search: false
1818
# - nav-item:catalog:
1919
# config:
2020
# title: 'Home'

plugins/backstage-1.52/packages/app-nfs/src/modules/nav/SidebarLogo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const SidebarLogo = () => {
2828

2929
return (
3030
<div className={classes.root}>
31-
<Link to="/home" underline="none" className={classes.link} aria-label="Home">
31+
<Link to="/" underline="none" className={classes.link} aria-label="Home">
3232
{isOpen ? <LogoFull /> : <LogoIcon />}
3333
</Link>
3434
</div>

0 commit comments

Comments
 (0)