Skip to content

Commit 3b935a7

Browse files
author
Jarosław Żołnowski
authored
feat(test): add playwright configuration and e2e tests (#6)
- add tests for status, chats, chat detail, and account pages - add postinstall script - add console.log error test
1 parent 0ce2edb commit 3b935a7

18 files changed

+431
-5
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,7 @@ npm-debug.log*
2828
/node_modules
2929
/platforms
3030
/plugins
31+
32+
/test-results/
33+
/playwright-report/
34+
/playwright/.cache/

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ now.
4242

4343
`npm run start:ios`
4444

45+
### Start e2e tests on Desktop Chrome
46+
47+
`npm run e2e`
48+
4549
## Questions?
4650

4751
Check out our [GitHub Discussions](https://github.com/xlts-dev/angularjs-ionic-v1/discussions) section to

e2e/pages/account-page.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export class AccountPage {
2+
page;
3+
header;
4+
enableFriends;
5+
6+
constructor(page) {
7+
this.page = page;
8+
this.header = page.locator('ion-nav-bar').getByText('Account');
9+
this.enableFriends = page.getByRole('checkbox');
10+
}
11+
}

e2e/pages/chat-detail-page.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export class ChatDetailPage {
2+
page;
3+
header;
4+
image;
5+
description
6+
7+
constructor(page) {
8+
this.page = page;
9+
this.header = page.locator('ion-nav-bar').getByText('Ben Sparrow');
10+
this.image = page.getByRole('img').first();
11+
this.description = page.getByRole('paragraph').first();
12+
}
13+
14+
async clickOnBackButton() {
15+
await this.page.getByRole('button').click();
16+
}
17+
}

e2e/pages/chats-page.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export class ChatsPage {
2+
page;
3+
header;
4+
links;
5+
6+
constructor(page) {
7+
this.page = page;
8+
this.header = page.locator('ion-nav-bar').getByText('Chats');
9+
this.links = page.getByRole('link')
10+
}
11+
12+
async clickOnUser() {
13+
await this.links.first().click();
14+
}
15+
}

e2e/pages/dashboard-page.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export class DashboardPage {
2+
page;
3+
header;
4+
5+
constructor(page) {
6+
this.page = page;
7+
this.header = page.getByText('Dashboard');
8+
}
9+
10+
async clickOnIonicMarketLink() {
11+
await this.page.getByTestId('ionic-market-link').click();
12+
}
13+
14+
async clickOnIonicForumLink() {
15+
await this.page.getByTestId('ionic-forum-link').click();
16+
}
17+
}

e2e/pages/tabs-page.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export class TabsPage {
2+
page;
3+
4+
constructor(page) {
5+
this.page = page;
6+
}
7+
8+
async clickOnStatusTab() {
9+
await this.page.locator('a').filter({hasText: 'Status'}).click();
10+
}
11+
12+
async clickOnChatsTab() {
13+
await this.page.locator('a').filter({hasText: 'Chats'}).click();
14+
}
15+
16+
async clickOnAccountTab() {
17+
await this.page.locator('a').filter({hasText: 'Account'}).click();
18+
}
19+
}

e2e/tests/account.e2e.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {expect, test} from '@playwright/test';
2+
import {AccountPage} from '../pages/account-page';
3+
import {TabsPage} from '../pages/tabs-page';
4+
import {PageErrorCollector} from '../utils/page-error-collector';
5+
6+
test.describe('account', () => {
7+
let pageErrorCollector;
8+
9+
test.beforeEach(async ({page}) => {
10+
pageErrorCollector = new PageErrorCollector(page)
11+
pageErrorCollector.listenForConsoleAndPageErrors(page);
12+
13+
await page.goto('');
14+
const tabsPage = new TabsPage(page);
15+
await tabsPage.clickOnAccountTab();
16+
});
17+
18+
test.afterEach(async ({ page }) => {
19+
expect(pageErrorCollector.errorLogs).toStrictEqual([]);
20+
});
21+
22+
test('TopNav', async ({page}) => {
23+
const accountPage = new AccountPage(page);
24+
25+
await expect(accountPage.header).toHaveText('Account');
26+
});
27+
28+
test('Enable Friends checkbox', async ({page}) => {
29+
const accountPage = new AccountPage(page);
30+
accountPage.enableFriends.check();
31+
await expect(accountPage.enableFriends.isChecked()).toBeTruthy();
32+
33+
await accountPage.enableFriends.click();
34+
await expect(accountPage.enableFriends).toHaveAttribute('aria-checked', 'false');
35+
36+
await accountPage.enableFriends.click();
37+
await expect(accountPage.enableFriends).toHaveAttribute('aria-checked', 'true');
38+
});
39+
})

e2e/tests/chat-details.e2e.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {expect, test} from '@playwright/test';
2+
import {ChatDetailPage} from '../pages/chat-detail-page';
3+
import {ChatsPage} from '../pages/chats-page';
4+
import {TabsPage} from '../pages/tabs-page';
5+
import {PageErrorCollector} from '../utils/page-error-collector';
6+
7+
test.describe('chat detail', () => {
8+
let pageErrorCollector;
9+
10+
test.beforeEach(async ({page}) => {
11+
pageErrorCollector = new PageErrorCollector(page)
12+
pageErrorCollector.listenForConsoleAndPageErrors(page);
13+
14+
await page.goto('');
15+
const tabsPage = new TabsPage(page);
16+
await tabsPage.clickOnChatsTab();
17+
const chatsPage = new ChatsPage(page);
18+
await chatsPage.clickOnUser();
19+
});
20+
21+
test.afterEach(async ({ page }) => {
22+
expect(pageErrorCollector.errorLogs).toStrictEqual([]);
23+
});
24+
25+
test('details', async ({page}) => {
26+
const chatDetail = new ChatDetailPage(page);
27+
28+
await expect(chatDetail.header).toHaveText('Ben Sparrow');
29+
await expect(chatDetail.image).toHaveAttribute('src', 'img/ben.png');
30+
await expect(chatDetail.description).toHaveText('You on your way?');
31+
});
32+
33+
test('back to chats', async ({page}) => {
34+
const chatDetail = new ChatDetailPage(page);
35+
36+
await chatDetail.clickOnBackButton();
37+
await expect(page.url()).toContain('tab/chats');
38+
});
39+
})

e2e/tests/chats.e2e.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {expect, test} from '@playwright/test';
2+
import {ChatsPage} from '../pages/chats-page';
3+
import {TabsPage} from '../pages/tabs-page';
4+
import {PageErrorCollector} from '../utils/page-error-collector';
5+
6+
test.describe('chats', () => {
7+
let pageErrorCollector;
8+
9+
test.beforeEach(async ({page}) => {
10+
pageErrorCollector = new PageErrorCollector(page)
11+
pageErrorCollector.listenForConsoleAndPageErrors(page);
12+
13+
await page.goto('');
14+
const tabsPage = new TabsPage(page);
15+
await tabsPage.clickOnChatsTab();
16+
});
17+
18+
test.afterEach(async ({ page }) => {
19+
expect(pageErrorCollector.errorLogs).toStrictEqual([]);
20+
});
21+
22+
test('topnav', async ({page}) => {
23+
const chatsPage = new ChatsPage(page);
24+
25+
await expect(chatsPage.header).toHaveText('Chats');
26+
});
27+
})

0 commit comments

Comments
 (0)