Skip to content

Commit e8d57c3

Browse files
authored
Fix flaky Access control test (netbirdio#261)
Fixed flaky test by changing the way to access Access Control Page and add some test ids of Add Rules buttons. Temporary removed tests for Firefox and webkit(safari)
1 parent 0b892c0 commit e8d57c3

7 files changed

+129
-55
lines changed
+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Page, test, expect } from "@playwright/test";
2+
3+
export class AccessControlPage {
4+
private readonly accessControlUrl = 'http://localhost:3000/acls'
5+
private readonly defaulAccessControl = this.page.getByRole('cell', { name: 'Default' })
6+
private readonly deleteButton = this.page.getByRole('button', { name: 'Delete' })
7+
private readonly deleteModal = this.page.getByTestId('confirm-delete-modal-title')
8+
private readonly confirmButton = this.page.getByRole('button', { name: 'OK' })
9+
private readonly addRulesButton = this.page.getByTestId('add-rule-empty-state-button')
10+
11+
constructor(private readonly page: Page) {}
12+
13+
async openAccessControlPage() {
14+
await test.step('Open Access Control page', async () => {
15+
await this.page.goto(this.accessControlUrl);
16+
})
17+
}
18+
19+
async assertDefaultAccessCotrolIsCreated() {
20+
await test.step('Assert that default cotrol access is created', async () => {
21+
await expect(this.defaulAccessControl).toBeVisible();
22+
})
23+
}
24+
25+
async pressDeleteButton() {
26+
await test.step('Press delete button', async () => {
27+
await this.deleteButton.click();
28+
})
29+
}
30+
31+
async assertDeleteModalIsVisibile() {
32+
await test.step('Assert access control deletion modal is visible', async () => {
33+
await expect(this.deleteModal).toBeVisible();
34+
})
35+
}
36+
37+
async pressConfirmButton() {
38+
await test.step('Press confirm button on access control deletion modal', async () => {
39+
await this.confirmButton.click();
40+
})
41+
}
42+
43+
async assertDefaultAccessCotrolIsDeleted() {
44+
await test.step('Assert default access control should be deleted', async () => {
45+
await expect(this.defaulAccessControl).not.toBeVisible();
46+
})
47+
}
48+
49+
async assertAddRuleButtonIsVisile() {
50+
await test.step('Assert Add Rules button is visible', async () => {
51+
await expect(this.addRulesButton).toBeVisible();
52+
})
53+
}
54+
}
55+
56+
export default AccessControlPage;

e2e-tests/pages/login-page.ts

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Page, test, expect} from "@playwright/test";
2+
3+
export class LoginPage {
4+
private readonly localUrl = 'http://localhost:3000/'
5+
private readonly usernameField = this.page.getByPlaceholder('username@domain')
6+
private readonly nextButton = this.page.getByRole('button', { name: 'next' })
7+
private readonly passwordField = this.page.getByLabel('Password')
8+
private readonly skipButton = this.page.getByRole('button', { name: 'skip' });
9+
private readonly netBirdLogo = this.page.getByRole('link', { name: 'logo' })
10+
11+
constructor(private readonly page: Page) {}
12+
13+
async doLogin() {
14+
await test.step('Login to local enviroment', async () => {
15+
await this.page.goto(this.localUrl);
16+
await this.usernameField.fill('admin@localhost');
17+
await this.pressNextButton();
18+
await this.passwordField.fill('testMe123@');
19+
await this.pressNextButton();
20+
if (await this.skipButton.isVisible({ timeout: 300 })) {
21+
await this.skipButton.click();
22+
}
23+
await expect(this.netBirdLogo).toBeVisible();
24+
})
25+
}
26+
27+
async pressNextButton() {
28+
await test.step('Press next button', async () => {
29+
await this.nextButton.click();
30+
})
31+
}
32+
}
33+
34+
export default LoginPage;

e2e-tests/pages/peers-page.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Page, test, expect } from "@playwright/test";
1+
import { Page, test } from "@playwright/test";
22

33
export class PeersPage {
44
private readonly addNewPeerButton = this.page.getByTestId('add-new-peer-button')
+15-26
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,22 @@
1-
import { test, expect } from '@playwright/test';
2-
import {AddPeerModal} from '../pages/modals/add-peer-modal'
3-
import {TopMenu} from '../pages/top-menu';
1+
import { test } from '@playwright/test'
2+
import {LoginPage} from '../pages/login-page'
3+
import {AccessControlPage} from '../pages/access-control-page'
44

5-
const URL = 'https://app.netbird.io/'
6-
const localUrl = 'http://localhost:3000/'
7-
let addPeerModal: AddPeerModal;
8-
let topMenu: TopMenu;
5+
let loginPage: LoginPage
6+
let accessControlPage: AccessControlPage
97

108
test.beforeEach(async ({ page }) => {
11-
addPeerModal = new AddPeerModal(page);
12-
await page.goto(localUrl);
13-
await page.getByPlaceholder('username@domain').fill('admin@localhost');
14-
await page.getByRole('button', { name: 'next' }).click();
15-
await page.getByLabel('Password').fill('testMe123@');
16-
await page.getByRole('button', { name: 'next' }).click();
17-
const skipButton = page.getByRole('button', { name: 'skip' });
18-
if (await skipButton.isVisible({ timeout: 300 })) {
19-
await skipButton.click();
20-
}
21-
await addPeerModal.assertPeerModalIsVisible();
9+
loginPage = new LoginPage(page);
10+
await loginPage.doLogin();
2211
});
2312

2413
test('Confirm that new user has Default access', async ({ page }) => {
25-
topMenu = new TopMenu(page);
26-
await addPeerModal.closeAddPeerModal();
27-
await addPeerModal.assertPeerModalIsNotVisible();
28-
await topMenu.clickOnAccessControlOnTopMenu();
29-
await expect(page.getByRole('cell', { name: 'Default' })).toBeVisible();
30-
await page.getByRole('button', { name: 'Delete' }).click();
31-
await expect(page.getByTestId('confirm-delete-modal-title')).toBeVisible();
32-
await page.getByRole('button', { name: 'Cancel' }).click();
14+
accessControlPage = new AccessControlPage(page);
15+
await accessControlPage.openAccessControlPage();
16+
await accessControlPage.assertDefaultAccessCotrolIsCreated();
17+
await accessControlPage.pressDeleteButton();
18+
await accessControlPage.assertDeleteModalIsVisibile();
19+
await accessControlPage.pressConfirmButton();
20+
await accessControlPage.assertDefaultAccessCotrolIsDeleted();
21+
await accessControlPage.assertAddRuleButtonIsVisile();
3322
});

e2e-tests/tests/peers.test.ts

+12-19
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,41 @@
1-
import { test } from '@playwright/test';
1+
import { test } from '@playwright/test'
22
import {AddPeerModal} from '../pages/modals/add-peer-modal'
33
import {PeersPage} from '../pages/peers-page'
4+
import {LoginPage} from '../pages/login-page'
45

5-
const URL = 'https://app.netbird.io/'
6-
const localUrl = 'http://localhost:3000/'
7-
let addPeerModal: AddPeerModal;
8-
let peersPage: PeersPage;
6+
let addPeerModal: AddPeerModal
7+
let peersPage: PeersPage
8+
let loginPage: LoginPage
99

1010
test.beforeEach(async ({ page }) => {
1111
addPeerModal = new AddPeerModal(page);
12-
await page.goto(localUrl);
13-
await page.getByPlaceholder('username@domain').fill('admin@localhost');
14-
await page.getByRole('button', { name: 'next' }).click();
15-
await page.getByLabel('Password').fill('testMe123@');
16-
await page.getByRole('button', { name: 'next' }).click();
17-
const skipButton = page.getByRole('button', { name: 'skip' });
18-
if (await skipButton.isVisible({ timeout: 300 })) {
19-
await skipButton.click();
20-
}
12+
loginPage = new LoginPage(page);
13+
await loginPage.doLogin();
2114
await addPeerModal.assertPeerModalIsVisible();
2215
});
2316

24-
test('Test Linux tab on a first access add peer modal / @bc', async function ({ }) {
17+
test('Test Linux tab on a first access add peer modal / @bc', async function () {
2518
await addPeerModal.openLinuxTab();
2619
await addPeerModal.assertLinuxTabHasCorrectText();
2720
});
2821

29-
test('Test Windows tab on a first access add peer modal / @bc', async ({ }) => {
22+
test('Test Windows tab on a first access add peer modal / @bc', async () => {
3023
await addPeerModal.openWindowsTab();
3124
await addPeerModal.assertWindowsDownloadButtonHasCorrectLink();
3225
});
3326

34-
test('Test MacOS tab on a first access add peer modal / @bc', async ({ }) => {
27+
test('Test MacOS tab on a first access add peer modal / @bc', async () => {
3528
await addPeerModal.openMacTab();
3629
await addPeerModal.assertIntelDownloadButtonHasCorrectLink();
3730
await addPeerModal.assertM1M2DownloadButtonHasCorrectLink();
3831
});
3932

40-
test('Test Android tab on a first access add peer modal', async ({ }) => {
33+
test('Test Android tab on a first access add peer modal', async () => {
4134
await addPeerModal.openAndroidTab();
4235
await addPeerModal.assertAndroidDownloadButtonHasCorrectLink();
4336
});
4437

45-
test('Test Docker tab on a first access add peer modal', async ({ }) => {
38+
test('Test Docker tab on a first access add peer modal', async () => {
4639
await addPeerModal.openDockerTab();
4740
await addPeerModal.assertDockerDownloadButtonHasCorrectLink();
4841
});

playwright.config.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ export default defineConfig({
3939
use: { channel: 'chrome', },
4040
},
4141

42-
{
43-
name: 'firefox',
44-
use: { browserName: 'firefox', },
45-
},
46-
47-
{
48-
name: 'webkit',
49-
use: { browserName: 'webkit', },
50-
},
42+
// {
43+
// name: 'firefox',
44+
// use: { browserName: 'firefox', },
45+
// },
46+
//
47+
// {
48+
// name: 'webkit',
49+
// use: { browserName: 'webkit', },
50+
// },
5151

5252
/* Test against mobile viewports. */
5353
// {

src/views/AccessControl.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ export const AccessControl = () => {
666666
<Row justify="end">
667667
<Col>
668668
<Button
669+
data-testid="add-rule-main-button"
669670
type="primary"
670671
disabled={savedPolicy.loading}
671672
onClick={onClickAddNewPolicy}
@@ -719,6 +720,7 @@ export const AccessControl = () => {
719720
</a>
720721
</Paragraph>
721722
<Button
723+
data-testid="add-rule-empty-state-button"
722724
size={"middle"}
723725
type="primary"
724726
onClick={() => onClickAddNewPolicy()}

0 commit comments

Comments
 (0)