Skip to content

Commit 2ec013a

Browse files
authored
Add e2e to marketplace plugin with i18n and accessibility checks (#1734)
1 parent 3764e8e commit 2ec013a

10 files changed

Lines changed: 862 additions & 36 deletions

File tree

workspaces/marketplace/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ site
5252

5353
# E2E test reports
5454
e2e-test-report/
55+
test-results/

workspaces/marketplace/packages/app/e2e-tests/app.test.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
/*
2+
* Copyright 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+
17+
import { test, expect, Page, type BrowserContext } from '@playwright/test';
18+
import { Extensions } from './pages/extensions';
19+
import { runAccessibilityTests } from './utils/accessibility';
20+
import { ExtensionHelper } from './utils/helper';
21+
import { MarketplaceMessages, getTranslations } from './utils/translations';
22+
23+
test.describe('Admin > Extensions', () => {
24+
let extensions: Extensions;
25+
let extensionHelper: ExtensionHelper;
26+
let translations: MarketplaceMessages;
27+
let sharedPage: Page;
28+
let sharedContext: BrowserContext;
29+
30+
async function switchToLocale(page: Page, locale: string): Promise<void> {
31+
await page.getByRole('link', { name: 'Settings' }).click();
32+
await page.getByRole('button', { name: 'English' }).click();
33+
await page.getByRole('option', { name: locale }).click();
34+
await page.locator('a').filter({ hasText: 'Home' }).click();
35+
}
36+
37+
test.beforeAll(async ({ browser }) => {
38+
sharedContext = await browser.newContext();
39+
sharedPage = await sharedContext.newPage();
40+
const currentLocale = await sharedPage.evaluate(
41+
() => globalThis.navigator.language.split('-')[0],
42+
);
43+
await sharedPage.goto('/');
44+
await sharedPage.getByRole('button', { name: 'Enter' }).click();
45+
await switchToLocale(sharedPage, currentLocale);
46+
translations = getTranslations(currentLocale);
47+
extensions = new Extensions(sharedPage, translations);
48+
extensionHelper = new ExtensionHelper(sharedPage, translations);
49+
await extensions.navigateToExtensions(translations.header.extensions);
50+
});
51+
52+
test.afterAll(async () => {
53+
await sharedContext.close();
54+
});
55+
56+
test.describe('Extensions > Catalog', () => {
57+
test('Verify search bar in extensions', async ({ browser: _browser }) => {
58+
await extensionHelper.searchInputPlaceholder('Bulk import');
59+
await extensionHelper.verifyHeading('Bulk import');
60+
});
61+
62+
test('Verify category and author filters in extensions', async ({
63+
browser: _browser,
64+
}, testInfo) => {
65+
await extensionHelper.verifyHeading(/Plugins \(\d+\)/);
66+
await runAccessibilityTests(sharedPage, testInfo);
67+
await extensionHelper.clickTab(translations.header.catalog);
68+
await extensions.selectDropdown(translations.search.category);
69+
await extensionHelper.clickButton('CI/CD');
70+
await sharedPage.keyboard.press(`Escape`);
71+
await extensions.selectDropdown(translations.search.author);
72+
await extensions.toggleOption('Red Hat');
73+
await sharedPage.keyboard.press(`Escape`);
74+
await extensionHelper.verifyHeading('APIs with 3scale');
75+
await extensionHelper.verifyTextInLocator(
76+
'',
77+
`${translations.metadata.by} Red Hat`,
78+
true,
79+
);
80+
81+
await extensionHelper.clickHeading('APIs with 3scale');
82+
// Following translated lines are commented due to bug with the translations
83+
// await extensionHelper.verifyTableHeadingAndRows([
84+
// translations.table.packageName,
85+
// translations.table.version,
86+
// translations.table.role,
87+
// 'Backstage compatibility version',
88+
// translations.table.status,
89+
// ]);
90+
await extensionHelper.verifyTableHeadingAndRows([
91+
'Package name',
92+
'Version',
93+
'Role',
94+
'Backstage compatibility version',
95+
'Status',
96+
]);
97+
await extensionHelper.verifyHeading(translations.metadata.versions);
98+
await extensionHelper.closeBar('Close');
99+
100+
await extensionHelper.clickLink(translations.common.readMore);
101+
await extensionHelper.closeBar('Close');
102+
await extensions.selectDropdown(`${translations.search.author}`);
103+
await extensions.toggleOption('Red Hat');
104+
await extensions.notChecked('Red Hat');
105+
await extensions.emptyCategoryComboBox();
106+
await sharedPage.keyboard.press(`Escape`);
107+
});
108+
109+
test('Verify support type filters in extensions', async ({
110+
browser: _browser,
111+
}) => {
112+
await extensions.selectDropdown(`${translations.search.supportType}`);
113+
await extensions.supportFilters();
114+
await extensions.emptyCategoryComboBox();
115+
});
116+
117+
test('Verify certified badge in extensions', async ({
118+
browser: _browser,
119+
}) => {
120+
await extensions.selectDropdown(`${translations.search.supportType}`);
121+
await extensions.toggleOption(translations.badges.certified);
122+
await sharedPage.keyboard.press(`Escape`);
123+
await extensionHelper.verifyHeading('Certified Plugin ');
124+
await expect(extensions.badge.first()).toBeVisible();
125+
await extensions.badge.first().hover();
126+
await extensionHelper.verifyHeading('Certified Plugin ');
127+
await extensionHelper.clickHeading('Certified Plugin ');
128+
await extensionHelper.closeBar('Close');
129+
await extensionHelper.clickLink(translations.common.readMore);
130+
await extensionHelper.verifyTextInLocator(
131+
'',
132+
translations.metadata.about,
133+
true,
134+
);
135+
await extensionHelper.verifyHeading(translations.metadata.versions);
136+
// Following translated lines are commented due to bug with the translations
137+
// await extensionHelper.verifyTableHeadingAndRows([
138+
// translations.table.packageName,
139+
// translations.table.version,
140+
// translations.table.role,
141+
// 'Backstage compatibility version',
142+
// translations.table.status,
143+
// ]);
144+
await extensionHelper.verifyTableHeadingAndRows([
145+
'Package name',
146+
'Version',
147+
'Role',
148+
'Backstage compatibility version',
149+
'Status',
150+
]);
151+
await extensionHelper.closeBar('Close');
152+
await extensions.resetSupportTypeFilter(translations.badges.certified);
153+
});
154+
155+
test('Verify Generally available badge in extensions', async ({
156+
browser: _browser,
157+
}) => {
158+
await extensions.selectSupportTypeFilter(
159+
translations.badges.generallyAvailable,
160+
);
161+
162+
await expect(extensions.badge.first()).toBeVisible();
163+
await extensions.badge.first().hover();
164+
await extensions.tooltipView(
165+
translations.badges.gaAndSupportedBy.replace(
166+
'{{provider}}',
167+
'A provider',
168+
),
169+
sharedPage,
170+
);
171+
await extensionHelper.clickLink({ href: '/support-generally-available' });
172+
173+
await extensionHelper.labelTextContentVisible(
174+
translations.badges.productionReady,
175+
translations.badges.generallyAvailable,
176+
);
177+
178+
await extensionHelper.closeBar('Close');
179+
await extensions.resetSupportTypeFilter(
180+
translations.badges.generallyAvailable,
181+
);
182+
});
183+
184+
test('Verify custom plugin badge in extensions', async ({
185+
browser: _browser,
186+
}) => {
187+
await extensions.selectSupportTypeFilter(
188+
translations.badges.customPlugin,
189+
);
190+
await expect(extensions.badge.first()).toBeVisible();
191+
await extensions.badge.first().hover();
192+
await extensions.tooltipView(
193+
translations.badges.customPlugin,
194+
sharedPage,
195+
);
196+
await extensions.clickReadMoreByPluginTitle(
197+
'Pre-installed False',
198+
sharedPage,
199+
);
200+
await extensionHelper.labelTextContentVisible(
201+
translations.badges.addedByAdmin,
202+
translations.badges.customPlugin,
203+
);
204+
205+
await extensionHelper.closeBar('Close');
206+
await extensions.resetSupportTypeFilter(translations.badges.customPlugin);
207+
});
208+
209+
test('Verify tech preview badge in extensions', async ({
210+
browser: _browser,
211+
}) => {
212+
await extensions.verifySupportTypeBadge({
213+
supportType: translations.badges.techPreview,
214+
pluginName: 'Bulk Import',
215+
badgeLabel: translations.badges.pluginInDevelopment,
216+
badgeText: translations.badges.techPreview,
217+
tooltipText: '',
218+
searchTerm: 'Bulk Import',
219+
includeTable: true,
220+
includeAbout: false,
221+
});
222+
});
223+
224+
test('Verify dev preview badge in extensions', async () => {
225+
await extensions.selectSupportTypeFilter(translations.badges.devPreview);
226+
await extensionHelper.verifyHeading('Marketplace');
227+
228+
await extensions.verifyPluginDetails({
229+
pluginName: 'Marketplace',
230+
badgeLabel: translations.badges.earlyStageExperimental,
231+
badgeText: translations.badges.devPreview,
232+
includeTable: true,
233+
includeAbout: false,
234+
});
235+
236+
await extensions.resetSupportTypeFilter(translations.badges.devPreview);
237+
});
238+
239+
test('Verify community plugin badge in extensions', async ({
240+
browser: _browser,
241+
}) => {
242+
await extensions.selectSupportTypeFilter(
243+
translations.badges.communityPlugin,
244+
);
245+
246+
await extensions.clickReadMoreByPluginTitle('Support Community');
247+
248+
await extensionHelper.verifyTextInLocator(
249+
'',
250+
translations.metadata.about,
251+
true,
252+
);
253+
await extensionHelper.closeBar('Close');
254+
await extensions.resetSupportTypeFilter(
255+
translations.badges.communityPlugin,
256+
);
257+
});
258+
});
259+
260+
test.describe('Extensions > Installed Plugin', () => {
261+
test('Installed packages page', async ({ browser: _browser }, testInfo) => {
262+
await extensionHelper.clickTab(translations.header.installedPackages);
263+
await extensionHelper.verifyHeading(
264+
new RegExp(`${translations.header.installedPackages} \\(\\d+\\)`),
265+
);
266+
await runAccessibilityTests(sharedPage, testInfo);
267+
await extensionHelper.verifyTableHeadings([
268+
translations.installedPackages.table.columns.name,
269+
translations.installedPackages.table.columns.packageName,
270+
translations.installedPackages.table.columns.role,
271+
translations.installedPackages.table.columns.version,
272+
translations.installedPackages.table.columns.actions,
273+
]);
274+
await extensions.tableRowMoversVisible();
275+
});
276+
});
277+
});

0 commit comments

Comments
 (0)