Skip to content

Commit 8292b24

Browse files
committed
Test: merge incorrectly split tests, improve speed
This merges test that were incorrectly split into multiple and substitutes the separation with more steps. Also make a small change to navigation helpers to hopefully make them a little faster.
1 parent 34aee3d commit 8292b24

File tree

5 files changed

+118
-121
lines changed

5 files changed

+118
-121
lines changed

_playwright-tests/UI/GPG_keys.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ test.describe('Test GPG keys', () => {
3838
await expect(page.getByRole('button', { name: 'Save', exact: true })).toBeDisabled();
3939
await page.getByText('Package verification only').click();
4040
// Save button would be disabled for bad or incorrect gpg key
41-
await expect(page.getByRole('button', { name: 'Save', exact: true })).toBeEnabled;
41+
await expect(page.getByRole('button', { name: 'Save', exact: true })).toBeEnabled();
4242
await page.getByPlaceholder('Paste GPG key or URL here').fill('I am not a GPG Key');
4343
await expect(
4444
page.getByText('Error loading GPG Key: no gpg key was found. Is this a valid GPG Key?'),

_playwright-tests/UI/IntrospectRepo.spec.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
import { test, expect } from '@playwright/test';
22
import { navigateToRepositories } from './helpers/navHelpers';
33
import { deleteAllRepos } from './helpers/deleteRepositories';
4-
import {
5-
closePopupsIfExist,
6-
getRowByNameOrUrl,
7-
getRowCellByHeader,
8-
waitForTaskPickup,
9-
} from './helpers/helpers';
4+
import { closePopupsIfExist, getRowByNameOrUrl, getRowCellByHeader } from './helpers/helpers';
105

116
test.describe('Introspect Repositories', () => {
127
const repoName = 'introspection-test';
@@ -18,17 +13,17 @@ test.describe('Introspect Repositories', () => {
1813
const testPackage = 'cheetah';
1914

2015
test.beforeEach(async ({ page }) => {
16+
await test.step('Cleanup repository, if using the same url', async () => {
17+
await deleteAllRepos(page, `&url=${repoUrl}`);
18+
});
19+
2120
await test.step('Navigate to the repository page', async () => {
2221
await navigateToRepositories(page);
2322
await closePopupsIfExist(page);
2423
});
2524
});
2625

27-
test('Create an introspection repository', async ({ page }) => {
28-
await test.step('Cleanup repository, if using the same url', async () => {
29-
await deleteAllRepos(page, `&url=${repoUrl}`);
30-
});
31-
26+
test('Create and delete an introspection repository', async ({ page }) => {
3227
await test.step('Open the add repository modal', async () => {
3328
await page.getByRole('button', { name: 'Add repositories' }).first().click();
3429
await expect(page.getByText('Add custom repositories')).toBeVisible();
@@ -51,13 +46,10 @@ test.describe('Introspect Repositories', () => {
5146
});
5247

5348
await test.step('Wait for status to be "Valid"', async () => {
54-
await waitForTaskPickup(page, repoUrl, 'introspect');
5549
const row = await getRowByNameOrUrl(page, repoName);
56-
await expect(row.getByText('Valid')).toBeVisible({ timeout: 60_000 });
50+
await expect(row.getByText('Valid')).toBeVisible({ timeout: 180_000 });
5751
});
58-
});
5952

60-
test('Check introspected repository packages', async ({ page }) => {
6153
await test.step('Open the packages modal', async () => {
6254
const row = await getRowByNameOrUrl(page, repoName);
6355
await row.getByRole('gridcell', { name: repoPackageCount, exact: true }).locator('a').click();
@@ -79,11 +71,10 @@ test.describe('Introspect Repositories', () => {
7971
).toBeVisible(),
8072
expect((await getRowCellByHeader(page, row, 'Arch')).getByText(repoArch)).toBeVisible(),
8173
]);
74+
await page.getByRole('button', { name: 'close' }).first().click();
8275
});
83-
});
8476

85-
test('Delete introspected repository', async ({ page }) => {
86-
await test.step('Delete created repository', async () => {
77+
await test.step('Delete the created repository', async () => {
8778
const row = await getRowByNameOrUrl(page, repoName);
8879
await row.getByLabel('Kebab toggle').click();
8980
await row.getByRole('menuitem', { name: 'Delete' }).click();

_playwright-tests/UI/RedHatRepo.spec.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { test, expect } from '@playwright/test';
22
import { navigateToRepositories } from './helpers/navHelpers';
3-
import { closePopupsIfExist } from './helpers/helpers';
3+
import { closePopupsIfExist, getRowByNameOrUrl } from './helpers/helpers';
44

55
test.describe('Red Hat Repositories', () => {
66
const smallRHRepo = 'Red Hat CodeReady Linux Builder for RHEL 9 ARM 64 (RPMs)';
@@ -16,24 +16,13 @@ test.describe('Red Hat Repositories', () => {
1616
});
1717
});
1818

19-
test('Wait for repository status to be "Valid"', async ({ page }) => {
20-
const status = page
21-
.getByRole('row')
22-
.filter({ hasText: smallRHRepo })
23-
.getByRole('gridcell')
24-
.filter({ hasText: 'Valid' });
25-
26-
await test.step('Filter repos by name', async () => {
27-
await page.getByPlaceholder('Filter by name/url').fill(smallRHRepo);
28-
});
29-
30-
await test.step('Wait for a valid status', async () => {
31-
await status.waitFor({ state: 'visible', timeout: 600_000 });
19+
test('Verify snapshotting of Red Hat repositories', async ({ page }) => {
20+
await test.step('Wait for status to be "Valid"', async () => {
21+
const row = await getRowByNameOrUrl(page, smallRHRepo);
22+
await expect(row.getByText('Valid')).toBeVisible({ timeout: 600_000 });
3223
});
33-
});
3424

35-
test('Check repository snapshots', async ({ page }) => {
36-
await test.step('Open the snapshots list modal', async () => {
25+
await test.step('Check repository snapshots', async () => {
3726
await page
3827
.getByRole('row')
3928
.filter({ hasText: smallRHRepo })

_playwright-tests/UI/UploadRepo.spec.ts

Lines changed: 86 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -7,97 +7,100 @@ import { deleteAllRepos } from './helpers/deleteRepositories';
77
const uploadRepoName = 'Upload Repo!';
88

99
test.describe('Upload Repositories', () => {
10-
test('Clean - Delete any current repos that exist', async ({ page }) => {
11-
await deleteAllRepos(page, `&search=${uploadRepoName}`);
12-
});
13-
14-
test('Create upload repository', async ({ page }) => {
15-
await closePopupsIfExist(page);
16-
await navigateToRepositories(page);
17-
18-
// Click 'Add repositories' button
19-
await page.getByRole('button', { name: 'Add repositories' }).first().click();
20-
21-
// Wait for the modal to be visible
22-
await expect(page.locator('div[id^="pf-modal-part"]').first()).toBeVisible();
23-
24-
// Fill in the 'Enter name' input
25-
const nameInput = page.getByPlaceholder('Enter name');
26-
await nameInput.click();
27-
await nameInput.fill(uploadRepoName);
28-
29-
// Check the 'Upload' checkbox
30-
await page.getByLabel('Upload', { exact: true }).check();
10+
test('Upload repo creation and deletion', async ({ page }) => {
11+
await test.step('Clean - Delete any current repos that exist', async () => {
12+
await deleteAllRepos(page, `&search=${uploadRepoName}`);
13+
});
3114

32-
// Filter by architecture
33-
await page.getByRole('button', { name: 'filter architecture' }).click();
34-
await page.getByRole('option', { name: 'x86_64' }).click();
15+
await test.step('Create upload repository', async () => {
16+
await closePopupsIfExist(page);
17+
await navigateToRepositories(page);
3518

36-
// Filter by version
37-
const versionFilterButton = page.getByRole('button', { name: 'filter version' });
38-
await versionFilterButton.click();
39-
await page.getByRole('menuitem', { name: 'el9' }).locator('label').click();
40-
await page.getByRole('menuitem', { name: 'el8' }).locator('label').click();
41-
await versionFilterButton.click(); // Close the filter dropdown
19+
// Click 'Add repositories' button
20+
await page.getByRole('button', { name: 'Add repositories' }).first().click();
4221

43-
// Wait for the successful API call
44-
const errorElement = page.locator('.pf-v5-c-helper-text__item.pf-m-error');
22+
// Wait for the modal to be visible
23+
await expect(page.locator('div[id^="pf-modal-part"]').first()).toBeVisible();
4524

46-
if (await errorElement.isVisible()) {
47-
throw new Error('Error message in element is visible');
48-
}
25+
// Fill in the 'Enter name' input
26+
const nameInput = page.getByPlaceholder('Enter name');
27+
await nameInput.click();
28+
await nameInput.fill(uploadRepoName);
4929

50-
// Click 'Save and upload content'
51-
await Promise.all([
52-
page.getByRole('button', { name: 'Save and upload content' }).click(),
53-
page.waitForResponse(
54-
(resp) =>
55-
resp.url().includes('/bulk_create/') && resp.status() >= 200 && resp.status() < 300,
56-
),
57-
]);
30+
// Check the 'Upload' checkbox
31+
await page.getByLabel('Upload', { exact: true }).check();
5832

59-
const dragBoxSelector = page.locator('#pf-modal-part-1 > div');
33+
// Filter by architecture
34+
await page.getByRole('button', { name: 'filter architecture' }).click();
35+
await page.getByRole('option', { name: 'x86_64' }).click();
6036

61-
// Handle the file chooser and upload the file
62-
await dragBoxSelector
63-
.locator('input[type=file]')
64-
.setInputFiles(path.join(__dirname, './fixtures/libreOffice.rpm'));
37+
// Filter by version
38+
const versionFilterButton = page.getByRole('button', { name: 'filter version' });
39+
await versionFilterButton.click();
40+
await page.getByRole('menuitem', { name: 'el9' }).locator('label').click();
41+
await page.getByRole('menuitem', { name: 'el8' }).locator('label').click();
42+
await versionFilterButton.click(); // Close the filter dropdown
6543

66-
// Verify the upload completion message
67-
await expect(page.getByText('All uploads completed!')).toBeVisible();
68-
69-
// Confirm changes
70-
await page.getByRole('button', { name: 'Confirm changes' }).click();
71-
72-
// There might be many rows at this point, we need to ensure that we filter the repo
73-
const row = await getRowByNameOrUrl(page, uploadRepoName);
74-
// Verify the 'In progress' status
75-
await expect(row.getByText('In progress')).toBeVisible();
76-
});
77-
78-
test('Delete one upload repository', async ({ page }) => {
79-
await navigateToRepositories(page);
80-
await closePopupsIfExist(page);
81-
const row = await getRowByNameOrUrl(page, uploadRepoName);
82-
// Check if the 'Kebab toggle' button is disabled
83-
await row.getByLabel('Kebab toggle').click();
84-
await row.getByRole('menuitem', { name: 'Delete' }).click();
85-
86-
// Click on the 'Remove' button
87-
await Promise.all([
88-
// Verify the 'Remove repositories?' dialog is visible
89-
expect(page.getByText('Remove repositories?')).toBeVisible(),
9044
// Wait for the successful API call
91-
page.waitForResponse(
92-
(resp) => resp.url().includes('bulk_delete') && resp.status() >= 200 && resp.status() < 300,
93-
),
94-
// Click the 'Remove' button
95-
page.getByRole('button', { name: 'Remove' }).click(),
96-
await expect(row).not.toBeVisible(),
97-
]);
98-
});
99-
100-
test('Clean - Double check upload repo for deletion', async ({ page }) => {
101-
await deleteAllRepos(page, `&search=${uploadRepoName}`);
45+
const errorElement = page.locator('.pf-v5-c-helper-text__item.pf-m-error');
46+
47+
if (await errorElement.isVisible()) {
48+
throw new Error('Error message in element is visible');
49+
}
50+
51+
// Click 'Save and upload content'
52+
await Promise.all([
53+
page.getByRole('button', { name: 'Save and upload content' }).click(),
54+
page.waitForResponse(
55+
(resp) =>
56+
resp.url().includes('/bulk_create/') && resp.status() >= 200 && resp.status() < 300,
57+
),
58+
]);
59+
60+
const dragBoxSelector = page.locator('#pf-modal-part-1 > div');
61+
62+
// Handle the file chooser and upload the file
63+
await dragBoxSelector
64+
.locator('input[type=file]')
65+
.setInputFiles(path.join(__dirname, './fixtures/libreOffice.rpm'));
66+
67+
// Verify the upload completion message
68+
await expect(page.getByText('All uploads completed!')).toBeVisible();
69+
70+
// Confirm changes
71+
await page.getByRole('button', { name: 'Confirm changes' }).click();
72+
73+
// There might be many rows at this point, we need to ensure that we filter the repo
74+
const row = await getRowByNameOrUrl(page, uploadRepoName);
75+
// Verify the 'In progress' status
76+
await expect(row.getByText('In progress')).toBeVisible();
77+
});
78+
79+
await test.step('Delete one upload repository', async () => {
80+
await navigateToRepositories(page);
81+
await closePopupsIfExist(page);
82+
const row = await getRowByNameOrUrl(page, uploadRepoName);
83+
// Check if the 'Kebab toggle' button is disabled
84+
await row.getByLabel('Kebab toggle').click();
85+
await row.getByRole('menuitem', { name: 'Delete' }).click();
86+
87+
// Click on the 'Remove' button
88+
await Promise.all([
89+
// Verify the 'Remove repositories?' dialog is visible
90+
expect(page.getByText('Remove repositories?')).toBeVisible(),
91+
// Wait for the successful API call
92+
page.waitForResponse(
93+
(resp) =>
94+
resp.url().includes('bulk_delete') && resp.status() >= 200 && resp.status() < 300,
95+
),
96+
// Click the 'Remove' button
97+
page.getByRole('button', { name: 'Remove' }).click(),
98+
await expect(row).not.toBeVisible(),
99+
]);
100+
});
101+
102+
await test.step('Clean - Double check upload repo for deletion', async () => {
103+
await deleteAllRepos(page, `&search=${uploadRepoName}`);
104+
});
102105
});
103106
});

_playwright-tests/UI/helpers/navHelpers.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,15 @@ const navigateToRepositoriesFunc = async (page: Page) => {
2626
};
2727

2828
export const navigateToRepositories = async (page: Page) => {
29-
await retry(page, navigateToRepositoriesFunc);
29+
try {
30+
const repositoriesNavLink = page
31+
.getByRole('navigation')
32+
.getByRole('link', { name: 'Repositories' });
33+
await repositoriesNavLink.waitFor({ state: 'visible', timeout: 1500 });
34+
await repositoriesNavLink.click();
35+
} catch {
36+
await retry(page, navigateToRepositoriesFunc, 5);
37+
}
3038
};
3139

3240
const navigateToTemplatesFunc = async (page: Page) => {
@@ -39,5 +47,11 @@ const navigateToTemplatesFunc = async (page: Page) => {
3947
};
4048

4149
export const navigateToTemplates = async (page: Page) => {
42-
await retry(page, navigateToTemplatesFunc);
50+
try {
51+
const templatesNavLink = page.getByRole('navigation').getByRole('link', { name: 'Templates' });
52+
await templatesNavLink.waitFor({ state: 'visible', timeout: 1500 });
53+
await templatesNavLink.click();
54+
} catch {
55+
await retry(page, navigateToTemplatesFunc, 5);
56+
}
4357
};

0 commit comments

Comments
 (0)