Skip to content

Commit 1855ab0

Browse files
authored
Merge pull request #125 from odockal/extensions-redo
chore(tests): repo extensions tests to be aligned with podman-desktop changes
2 parents 7a39cf1 + e65125a commit 1855ab0

File tree

2 files changed

+73
-61
lines changed

2 files changed

+73
-61
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**********************************************************************
2+
* Copyright (C) 2024 Red Hat, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
***********************************************************************/
18+
19+
import type { Page } from '@playwright/test';
20+
21+
import { ExtensionDetailsPage } from '@podman-desktop/tests-playwright';
22+
23+
export class SSOExtensionPage extends ExtensionDetailsPage {
24+
constructor(page: Page) {
25+
super(page, 'Red Hat Authentication Extension');
26+
}
27+
}

tests/src/sso-extension.spec.ts

+46-61
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@
1515
*
1616
* SPDX-License-Identifier: Apache-2.0
1717
***********************************************************************/
18-
import { Page, Locator, expect as playExpect } from '@playwright/test';
19-
import { AuthenticationPage, NavigationBar, PodmanDesktopRunner, RunnerTestContext, SSOExtensionPage, SettingsExtensionsPage, WelcomePage } from '@podman-desktop/tests-playwright';
18+
import { Page, expect as playExpect } from '@playwright/test';
2019
import { afterAll, beforeAll, describe, test, beforeEach } from 'vitest';
20+
import { AuthenticationPage, ExtensionCardPage, NavigationBar, PodmanDesktopRunner, RunnerTestContext, WelcomePage } from '@podman-desktop/tests-playwright';
21+
import { SSOExtensionPage } from './model/pages/sso-extension-page';
2122

2223
let pdRunner: PodmanDesktopRunner;
2324
let page: Page;
2425
let navBar: NavigationBar;
2526
let extensionInstalled = false;
27+
let extensionCard: ExtensionCardPage;
2628
const imageName = 'ghcr.io/redhat-developer/podman-desktop-redhat-account-ext:latest';
27-
const extensionName = 'Red Hat Authentication';
29+
const extensionLabel = 'redhat.redhat-authentication';
2830
const extensionLabelName = 'redhat-authentication';
2931
const authProviderName = 'Red Hat SSO';
30-
const extensionStatusLabel = 'Extension Status Label';
31-
const extensionDetailsLabel = 'Extension Details';
3232
const activeExtensionStatus = 'ACTIVE';
3333
const disabledExtensionStatus = 'DISABLED';
3434

@@ -45,6 +45,7 @@ beforeAll(async () => {
4545
const welcomePage = new WelcomePage(page);
4646
await welcomePage.handleWelcomePage(true);
4747
navBar = new NavigationBar(page);
48+
extensionCard = new ExtensionCardPage(page, extensionLabelName, extensionLabel);
4849
});
4950

5051
afterAll(async () => {
@@ -53,43 +54,41 @@ afterAll(async () => {
5354

5455
describe('Red Hat Authentication extension verification', async () => {
5556

56-
test('Go to settings and check if extension is already installed', async () => {
57-
const settingsBar = await navBar.openSettings();
58-
const extensions = await settingsBar.getCurrentExtensions();
59-
if (await extensionExists(extensions, extensionName)) {
57+
test('Go to extensions and check if extension is already installed', async () => {
58+
const extensions = await navBar.openExtensions();
59+
if (await extensions.extensionIsInstalled(extensionLabel)) {
6060
extensionInstalled = true;
6161
}
6262
});
6363

6464
test.runIf(extensionInstalled)(
6565
'Uninstalled previous version of sso extension',
6666
async () => {
67-
await removeExtension(extensionName);
67+
await removeExtension();
6868
},
6969
60000,
7070
);
7171

7272
test('Extension can be installed using OCI image', async () => {
73-
const settingsBar = await navBar.openSettings();
74-
const settingsExtensionPage = await settingsBar.openTabPage(SettingsExtensionsPage);
75-
await playExpect(settingsExtensionPage.heading).toBeVisible();
76-
await settingsExtensionPage.installExtensionFromOCIImage(imageName);
73+
const extensions = await navBar.openExtensions();
74+
await extensions.installExtensionFromOCIImage(imageName);
75+
await playExpect(extensionCard.card).toBeVisible();
7776
}, 200000);
7877

79-
test('Extension record is added under installed extensions', async () => {
80-
const settingsBar = await navBar.openSettings();
81-
const settingsExtensionPage = await settingsBar.openTabPage(SettingsExtensionsPage);
82-
const extension = settingsExtensionPage.getExtensionRowFromTable(extensionLabelName);
83-
await playExpect(extension).toBeVisible();
84-
await extension.scrollIntoViewIfNeeded();
85-
const extensionDetails = extension.getByRole('cell', { name: extensionDetailsLabel });
86-
await playExpect(extensionDetails.getByLabel(extensionStatusLabel)).toHaveText(activeExtensionStatus);
78+
test('Extension card is present and active', async () => {
79+
const extensions = await navBar.openExtensions();
80+
playExpect(await extensions.extensionIsInstalled(extensionLabel)).toBeTruthy();
81+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
82+
await playExpect(extensionCard.status).toHaveText(activeExtensionStatus);
8783
});
8884

89-
test('Extension appears under Settings bar extensions', async () => {
90-
const settingsBar = await navBar.openSettings();
91-
const extensions = await settingsBar.getCurrentExtensions();
92-
await playExpect.poll(async () => await extensionExists(extensions, extensionName), { timeout: 30000 }).toBeTruthy();
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();
89+
const details = new SSOExtensionPage(page);
90+
await playExpect(details.heading).toBeVisible();
91+
await playExpect(details.status).toHaveText(activeExtensionStatus);
9392
});
9493

9594
test('SSO provider is available in Authentication Page', async () => {
@@ -104,58 +103,44 @@ describe('Red Hat Authentication extension verification', async () => {
104103

105104
describe('Red Hat Authentication extension handling', async () => {
106105
test('Extension can be disabled', async () => {
106+
const extensions = await navBar.openExtensions();
107+
playExpect(await extensions.extensionIsInstalled(extensionLabel)).toBeTruthy();
108+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
109+
await playExpect(extensionCard.status).toHaveText(activeExtensionStatus);
110+
await extensionCard.disableExtension();
111+
await playExpect(extensionCard.status).toHaveText(disabledExtensionStatus);
112+
107113
const settingsBar = await navBar.openSettings();
108-
const settingsExtensionPage = await settingsBar.openTabPage(SettingsExtensionsPage);
109-
const extension = settingsExtensionPage.getExtensionRowFromTable(extensionLabelName);
110-
await extension.scrollIntoViewIfNeeded();
111-
await settingsExtensionPage.getExtensionStopButton(extension).click();
112-
const extensionDetails = extension.getByRole('cell', { name: extensionDetailsLabel });
113-
await playExpect(extensionDetails.getByLabel(extensionStatusLabel)).toHaveText(disabledExtensionStatus);
114-
115-
await navBar.openSettings();
116114
const authPage = await settingsBar.openTabPage(AuthenticationPage);
117115
await playExpect(authPage.heading).toHaveText('Authentication');
118116
const provider = authPage.getProvider(authProviderName);
119117
await playExpect(provider).toHaveCount(0);
120118
});
121119

122120
test('Extension can be re-enabled correctly', async () => {
121+
const extensions = await navBar.openExtensions();
122+
playExpect(await extensions.extensionIsInstalled(extensionLabel)).toBeTruthy();
123+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
124+
await playExpect(extensionCard.status).toHaveText(disabledExtensionStatus);
125+
await extensionCard.enableExtension();
126+
await playExpect(extensionCard.status).toHaveText(activeExtensionStatus);
127+
123128
const settingsBar = await navBar.openSettings();
124-
const settingsExtensionPage = await settingsBar.openTabPage(SettingsExtensionsPage);
125-
const extension = settingsExtensionPage.getExtensionRowFromTable(extensionLabelName);
126-
await extension.scrollIntoViewIfNeeded();
127-
await settingsExtensionPage.getExtensionStartButton(extension).click();
128-
const extensionDetails = extension.getByRole('cell', { name: extensionDetailsLabel });
129-
await playExpect(extensionDetails.getByLabel(extensionStatusLabel)).toHaveText(activeExtensionStatus);
130-
131-
await navBar.openSettings();
132129
const authPage = await settingsBar.openTabPage(AuthenticationPage);
133130
await playExpect(authPage.heading).toHaveText('Authentication');
134131
await playExpect(authPage.getProvider(authProviderName)).toHaveCount(1);
135132
});
136133
});
137134

138135
test('SSO extension can be removed', async () => {
139-
await removeExtension(extensionName);
136+
await removeExtension();
140137
});
141138
});
142139

143-
async function extensionExists(extensionList: Locator[], extensionName: string): Promise<boolean> {
144-
for (const extension of extensionList) {
145-
if ((await extension.getByText(extensionName, { exact: true }).count()) > 0) {
146-
return true;
147-
}
148-
}
149-
return false;
150-
}
151-
152-
async function removeExtension(extensionName: string): Promise<void> {
153-
const settingsBar = await navBar.openSettings();
154-
let extensions = await settingsBar.getCurrentExtensions();
155-
const authPage = await settingsBar.openTabPage(SSOExtensionPage);
156-
const settingsExtensionPage = await authPage.removeExtension();
157-
await playExpect(settingsExtensionPage.heading).toBeVisible();
158-
159-
extensions = await settingsBar.getCurrentExtensions();
160-
await playExpect.poll(async () => await extensionExists(extensions, extensionName), { timeout: 15000 }).toBeFalsy();
140+
async function removeExtension(): Promise<void> {
141+
const extensions = await navBar.openExtensions();
142+
const extensionCard = await extensions.getInstalledExtension(extensionLabelName, extensionLabel);
143+
await extensionCard.disableExtension();
144+
await extensionCard.removeExtension();
145+
await playExpect.poll(async () => await extensions.extensionIsInstalled(extensionLabel), { timeout: 15000 }).toBeFalsy();
161146
}

0 commit comments

Comments
 (0)