Skip to content

Commit 06a3aea

Browse files
odockaldgolovin
andauthored
chore(tests): switch to playwright test runner (#276)
Signed-off-by: Ondrej Dockal <[email protected]> Co-authored-by: Denis Golovin <[email protected]>
1 parent ed30c5b commit 06a3aea

10 files changed

+84
-93
lines changed

.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ scripts
33
builtin/**
44
www
55
*.config.js
6+
*.config.ts
67
types/**/*.ts
78
__mocks__

.github/workflows/e2e-main.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jobs:
110110
- name: Execute pnpm in Red Hat Account Extension
111111
working-directory: ${{ env.REPOSITORY }}
112112
run: |
113-
pnpm install -D @podman-desktop/tests-playwright@1.13.0-202408291153-ccbdd9b
113+
pnpm install -D @podman-desktop/tests-playwright@next
114114
pnpm build
115115
116116
- name: Run All E2E tests in Red Hat Account Extension

.github/workflows/pr-check.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ jobs:
125125
126126
- name: Ensure getting current HEAD version of the test framework
127127
working-directory: ./podman-desktop-redhat-account-ext
128-
run: pnpm add -D @podman-desktop/tests-playwright@1.13.0-202408291153-ccbdd9b
128+
run: pnpm install -D @podman-desktop/tests-playwright@next
129129

130130
- name: Execute pnpm in SSO Extension
131131
working-directory: ./podman-desktop-redhat-account-ext

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ builtin
44
dist
55
node_modules
66
redhat-authentication.cdix
7-
tests/output
7+
tests/**/output
88
test-resources
9+
test-results
910

package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"description": "Login to Red Hat Developers",
55
"version": "1.0.2",
66
"packageManager": "[email protected]+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247",
7+
"type": "module",
78
"icon": "icon.png",
89
"publisher": "redhat",
910
"license": "Apache-2.0",
@@ -33,7 +34,7 @@
3334
}
3435
},
3536
"scripts": {
36-
"build": "vite build && node ./scripts/build.js",
37+
"build": "vite build && node ./scripts/build.cjs",
3738
"watch": "vite build -w",
3839
"format:check": "prettier --end-of-line auto --cache --check \"{src,types,scripts}/**/*.{ts,js}\"",
3940
"format:fix": "prettier --cache --write \"{src,types,scripts}/**/*.{ts,js}\"",
@@ -43,14 +44,15 @@
4344
"test": "vitest run --coverage",
4445
"test:all": "pnpm test && pnpm test:e2e",
4546
"test:e2e:setup": "xvfb-maybe --auto-servernum --server-args='-screen 0 1280x960x24' --",
46-
"test:e2e": "cross-env E2E_TESTS=true pnpm run test:e2e:setup vitest run tests/src/ --pool=threads --poolOptions.threads.singleThread --poolOptions.threads.isolate --no-file-parallelism"
47+
"test:e2e": "cross-env E2E_TESTS=true pnpm run test:e2e:setup npx playwright test tests/src"
4748
},
4849
"dependencies": {
4950
"@podman-desktop/api": "^1.12.0",
5051
"@redhat-developer/rhcra-client": "^0.0.1",
5152
"@redhat-developer/rhsm-client": "^0.0.4",
5253
"axios": "^1.7.7",
5354
"js-yaml": "^4.1.0",
55+
"object-hash": "2.2.0",
5456
"openid-client": "^5.6.5"
5557
},
5658
"devDependencies": {

tests/src/setupFiles/extended-hooks.ts playwright.config.ts

+20-4
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,25 @@
1616
* SPDX-License-Identifier: Apache-2.0
1717
***********************************************************************/
1818

19-
import { type RunnerTestContext,takeScreenshotHook } from '@podman-desktop/tests-playwright';
20-
import { afterEach } from 'vitest';
19+
import { defineConfig, devices } from '@playwright/test';
2120

22-
afterEach(async (context: RunnerTestContext) => {
23-
context.onTestFailed(async () => await takeScreenshotHook(context.pdRunner, context.task.name));
21+
export default defineConfig({
22+
outputDir: 'output/',
23+
workers: 1,
24+
25+
reporter: [
26+
['list'],
27+
['junit', { outputFile: 'output/junit-results.xml' }],
28+
['json', { outputFile: 'output/json-results.json' }],
29+
['html', { open: 'never', outputFolder: 'output/html-results/' }],
30+
],
31+
32+
projects: [
33+
{
34+
name: 'chromium',
35+
use: {
36+
...devices['Desktop Chrome'],
37+
},
38+
},
39+
],
2440
});

pnpm-lock.yaml

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/build.js scripts/build.cjs

File renamed without changes.

tests/src/sso-extension.spec.ts

+51-56
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,8 @@
1616
* SPDX-License-Identifier: Apache-2.0
1717
***********************************************************************/
1818
import type { Page} from '@playwright/test';
19-
import { expect as playExpect } from '@playwright/test';
20-
import type { RunnerTestContext} from '@podman-desktop/tests-playwright';
19+
import { expect as playExpect, test } from '@playwright/test';
2120
import { AuthenticationPage, ExtensionCardPage, NavigationBar, PodmanDesktopRunner, WelcomePage } from '@podman-desktop/tests-playwright';
22-
import { afterAll, beforeAll, beforeEach,describe, test } from 'vitest';
2321

2422
import { SSOExtensionPage } from './model/pages/sso-extension-page';
2523

@@ -36,11 +34,7 @@ const activeExtensionStatus = 'ACTIVE';
3634
const disabledExtensionStatus = 'DISABLED';
3735
const skipInstallation = process.env.SKIP_INSTALLATION ? process.env.SKIP_INSTALLATION : false;
3836

39-
beforeEach<RunnerTestContext>(async ctx => {
40-
ctx.pdRunner = pdRunner;
41-
});
42-
43-
beforeAll(async () => {
37+
test.beforeAll(async () => {
4438
pdRunner = new PodmanDesktopRunner({ customFolder: 'sso-tests-pd', autoUpdate: false, autoCheckUpdate: false });
4539
page = await pdRunner.start();
4640
pdRunner.setVideoAndTraceName('sso-e2e');
@@ -51,63 +45,64 @@ beforeAll(async () => {
5145
extensionCard = new ExtensionCardPage(page, extensionLabelName, extensionLabel);
5246
});
5347

54-
afterAll(async () => {
48+
test.afterAll(async () => {
5549
await pdRunner.close();
5650
});
5751

58-
describe('Red Hat Authentication extension verification', async () => {
59-
60-
test('Go to extensions and check if extension is already installed', async () => {
61-
const extensions = await navBar.openExtensions();
62-
if (await extensions.extensionIsInstalled(extensionLabel)) {
63-
extensionInstalled = true;
64-
}
65-
});
52+
test.describe('Red Hat Authentication extension verification', () => {
53+
test.describe('Red Hat Authentication extension installation', () => {
54+
test('Go to extensions and check if extension is already installed', async () => {
55+
const extensions = await navBar.openExtensions();
56+
if (await extensions.extensionIsInstalled(extensionLabel)) {
57+
extensionInstalled = true;
58+
}
59+
});
6660

67-
// we want to skip removing of the extension when we are running tests from PR check
68-
test.runIf(extensionInstalled && !skipInstallation)(
69-
'Uninstalled previous version of sso extension',
70-
async () => {
61+
// we want to skip removing of the extension when we are running tests from PR check
62+
test('Uninstalle previous version of sso extension', async () => {
63+
test.skip(!extensionInstalled || !!skipInstallation);
64+
test.setTimeout(60000);
7165
await removeExtension();
72-
},
73-
60000,
74-
);
75-
76-
test.runIf(!skipInstallation)('Extension can be installed using OCI image', async () => {
77-
const extensions = await navBar.openExtensions();
78-
await extensions.installExtensionFromOCIImage(imageName);
79-
await playExpect(extensionCard.card).toBeVisible();
80-
}, 200000);
81-
82-
test('Extension card is present and active', async () => {
83-
const extensions = await navBar.openExtensions();
84-
await playExpect.poll(async () =>
85-
await extensions.extensionIsInstalled(extensionLabel), { timeout: 30000 },
86-
).toBeTruthy();
87-
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
88-
await playExpect(extensionCard.status).toHaveText(activeExtensionStatus);
89-
});
66+
});
9067

91-
test('Extension Details show correct status', async () => {
92-
const extensions = await navBar.openExtensions();
93-
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
94-
await extensionCard.openExtensionDetails();
95-
const details = new SSOExtensionPage(page);
96-
await playExpect(details.heading).toBeVisible();
97-
await playExpect(details.status).toHaveText(activeExtensionStatus);
98-
});
68+
test('Extension can be installed using OCI image', async () => {
69+
test.skip(extensionInstalled && !skipInstallation);
70+
test.setTimeout(200000);
71+
const extensions = await navBar.openExtensions();
72+
await extensions.installExtensionFromOCIImage(imageName);
73+
await playExpect(extensionCard.card).toBeVisible();
74+
});
9975

100-
test('SSO provider is available in Authentication Page', async () => {
101-
const settingsBar = await navBar.openSettings();
102-
const authPage = await settingsBar.openTabPage(AuthenticationPage);
103-
await playExpect(authPage.heading).toHaveText('Authentication');
104-
const provider = authPage.getProvider(authProviderName);
105-
await playExpect(provider.getByLabel('Provider Information').getByLabel('Provider Name')).toHaveText(authProviderName);
106-
await playExpect(provider.getByLabel('Provider Information').getByLabel('Provider Status')).toHaveText('Logged out');
107-
await playExpect(provider.getByLabel('Provider Actions').getByRole('button')).toContainText('Sign in');
76+
test('Extension card is present and active', async () => {
77+
const extensions = await navBar.openExtensions();
78+
await playExpect.poll(async () =>
79+
await extensions.extensionIsInstalled(extensionLabel), { timeout: 30000 },
80+
).toBeTruthy();
81+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
82+
await playExpect(extensionCard.status).toHaveText(activeExtensionStatus);
83+
});
84+
85+
test('Extension Details show correct status', async () => {
86+
const extensions = await navBar.openExtensions();
87+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
88+
await extensionCard.openExtensionDetails('Red Hat Authentication');
89+
const details = new SSOExtensionPage(page);
90+
await playExpect(details.heading).toBeVisible();
91+
await playExpect(details.status).toHaveText(activeExtensionStatus);
92+
});
93+
94+
test('SSO provider is available in Authentication Page', async () => {
95+
const settingsBar = await navBar.openSettings();
96+
const authPage = await settingsBar.openTabPage(AuthenticationPage);
97+
await playExpect(authPage.heading).toHaveText('Authentication');
98+
const provider = authPage.getProvider(authProviderName);
99+
await playExpect(provider.getByLabel('Provider Information').getByLabel('Provider Name')).toHaveText(authProviderName);
100+
await playExpect(provider.getByLabel('Provider Information').getByLabel('Provider Status')).toHaveText('Logged out');
101+
await playExpect(provider.getByLabel('Provider Actions').getByRole('button')).toContainText('Sign in');
102+
});
108103
});
109104

110-
describe('Red Hat Authentication extension handling', async () => {
105+
test.describe('Red Hat Authentication extension handling', () => {
111106
test('Extension can be disabled', async () => {
112107
const extensions = await navBar.openExtensions();
113108
playExpect(await extensions.extensionIsInstalled(extensionLabel)).toBeTruthy();

vitest.config.js

+1-28
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,6 @@ function unitTestConfig() {
7171
};
7272
}
7373

74-
function e2eTestConfig() {
75-
return {
76-
globals: true,
77-
globalSetup: './node_modules/@podman-desktop/tests-playwright/src/globalSetup/global-setup.ts',
78-
setupFiles: './tests/src/setupFiles/extended-hooks.ts',
79-
/**
80-
* By default, vitest search test files in all packages.
81-
* For e2e tests have sense search only is project root tests folder
82-
*/
83-
include: ['tests/src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
84-
exclude: excludeArray,
85-
86-
/**
87-
* A default timeout of 5000ms is sometimes not enough for playwright.
88-
*/
89-
testTimeout: 30_000,
90-
hookTimeout: 60_000,
91-
// test reporters - default for all and junit for CI
92-
reporters: process.env.CI ? ['default', 'junit'] : ['verbose'],
93-
outputFile: process.env.CI ? { junit: 'tests/output/junit-e2e-results.xml' } : {},
94-
};
95-
}
96-
97-
export function testConfig() {
98-
return process.env.E2E_TESTS ? e2eTestConfig() : unitTestConfig();
99-
}
100-
10174
/**
10275
* Config for global end-to-end tests
10376
* placed in project root tests folder
@@ -107,7 +80,7 @@ export function testConfig() {
10780

10881
const config = {
10982
test: {
110-
...testConfig(),
83+
...unitTestConfig(),
11184
...coverageConfig(PACKAGE_ROOT, PACKAGE_NAME),
11285
},
11386
resolve: {

0 commit comments

Comments
 (0)