Skip to content

Commit da40850

Browse files
authored
Improve Playwright tests (#168)
* Added new test that navigates between pages by changing the URL and edits them. One of the pages has a sheet the other has text (covers 3 of the 4 items on https://github.com/adobe/da-live/wiki/TODO-%E2%80%90-Playwright-tests ) * Support for running the tests against a locally running da-collab and da-admin (triggered by setting the env var GITHUB_HEAD_REF=local which now also selects these locally via query param) * Updated the regionaledit test to run in its own unique directory to allow multi browser tests to run concurrently without tripping over each other
1 parent 658dcc0 commit da40850

File tree

5 files changed

+109
-54
lines changed

5 files changed

+109
-54
lines changed

test/e2e/tests/delete.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ test('Delete multiple old pages', async ({ page }, workerInfo) => {
2222
return;
2323
}
2424

25-
test.setTimeout(40000);
25+
test.setTimeout(80000);
2626

2727
// Open the directory listing
2828
await page.goto(`${ENV}/#/da-sites/da-status/tests`);
@@ -57,7 +57,7 @@ test('Delete multiple old pages', async ({ page }, workerInfo) => {
5757

5858
// If we're here the page has to be deleted. We'll tick the checkbox next to it in the page
5959
const checkbox = page.locator('li').filter({ hasText: fileName }).locator('input[type="checkbox"][name="item-selected"]');
60-
console.log('checkboxes:', await checkbox.count());
60+
console.log('To be deleted, checked box:', await checkbox.count());
6161
await checkbox.focus();
6262
await page.keyboard.press(' ');
6363
itemsToDelete = true;
@@ -72,5 +72,5 @@ test('Delete multiple old pages', async ({ page }, workerInfo) => {
7272
await page.getByRole('button', { name: 'Delete' }).click();
7373

7474
// Wait for the delete button to disappear which is when we're done
75-
await expect(page.getByRole('button', { name: 'Delete' })).not.toBeVisible({ timeout: 30000 });
75+
await expect(page.getByRole('button', { name: 'Delete' })).not.toBeVisible({ timeout: 60000 });
7676
});

test/e2e/tests/edit.spec.js

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ test('Update Document', async ({ browser, page }, workerInfo) => {
2323
const enteredText = `[${workerInfo.project.name}] Edited by test ${new Date()}`;
2424
await page.locator('div.ProseMirror').fill(enteredText);
2525

26-
// Wait 3 secs
27-
await page.waitForTimeout(3000);
26+
await page.waitForTimeout(1000);
2827
await page.close();
2928

3029
const newPage = await browser.newPage();
@@ -47,12 +46,12 @@ test('Create Delete Document', async ({ browser, page }, workerInfo) => {
4746
await page.locator('button:text("Create document")').click();
4847
await expect(page.locator('div.ProseMirror')).toBeVisible();
4948
await page.locator('div.ProseMirror').fill('testcontent');
49+
await page.waitForTimeout(1000);
5050

5151
const newPage = await browser.newPage();
5252
await newPage.goto(`${ENV}/#/da-sites/da-status/tests`);
5353

54-
// Wait 1 sec
55-
await newPage.waitForTimeout(4000);
54+
await newPage.waitForTimeout(3000);
5655
await newPage.reload();
5756

5857
await expect(newPage.locator(`a[href="/edit#/da-sites/da-status/tests/${pageName}"]`)).toBeVisible();
@@ -68,3 +67,46 @@ test('Create Delete Document', async ({ browser, page }, workerInfo) => {
6867
await page.waitForTimeout(1000);
6968
await expect(newPage.locator(`a[href="/edit#/da-sites/da-status/tests/${pageName}"]`)).not.toBeVisible();
7069
});
70+
71+
test('Change document by switching anchors', async ({ page }, workerInfo) => {
72+
test.setTimeout(15000);
73+
74+
const url = getTestPageURL('edit3', workerInfo);
75+
const urlA = `${url}A`;
76+
const urlB = `${url}B`;
77+
78+
await page.goto(urlA);
79+
await expect(page.locator('div.ProseMirror')).toBeVisible();
80+
81+
await page.locator('div.ProseMirror').fill('before table');
82+
await page.getByText('Block', { exact: true }).click();
83+
await page.getByText('columns').fill('mytable');
84+
await page.keyboard.press('Tab');
85+
await page.keyboard.press('k');
86+
await page.keyboard.press('Tab');
87+
await page.keyboard.press('v');
88+
await page.getByText('Edit Block').click();
89+
await page.getByText('Insert row after').click();
90+
await page.keyboard.press('Tab');
91+
await page.keyboard.type('k 2');
92+
await page.keyboard.press('Tab');
93+
await page.keyboard.type('v 2');
94+
95+
await page.waitForTimeout(1000);
96+
97+
await page.goto(urlB);
98+
await expect(page.locator('div.ProseMirror')).toBeVisible();
99+
100+
await page.locator('div.ProseMirror').fill('page B');
101+
await page.waitForTimeout(1000);
102+
103+
await page.goto(urlA);
104+
await expect(page.locator('div.ProseMirror')).toBeVisible();
105+
await expect(page.locator('div.ProseMirror')).toContainText('mytable');
106+
await expect(page.locator('div.ProseMirror')).toContainText('k 2');
107+
await expect(page.locator('div.ProseMirror')).toContainText('v 2');
108+
109+
await page.goto(urlB);
110+
await expect(page.locator('div.ProseMirror')).toBeVisible();
111+
await expect(page.locator('div.ProseMirror')).toContainText('page B');
112+
});

test/e2e/tests/regionaledits.spec.js

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,42 @@
11
import { test, expect } from '@playwright/test';
22
import path from 'path';
3-
import ENV from '../utils/env.js';
3+
import { getTestFolderURL } from '../utils/page.js';
44

5-
const deleteTestPage = async () => {
6-
// Delete the document even if the test fails;
7-
const pageName = 'regionaledit.html';
8-
const adminURL = `https://admin.da.live/source/da-sites/da-status/tests/${pageName}`;
9-
await fetch(adminURL, { method: 'DELETE' });
10-
};
11-
12-
test('Regional Edit Document', async ({ page }) => {
5+
test('Regional Edit Document', async ({ page }, workerInfo) => {
136
test.setTimeout(15000);
14-
await deleteTestPage();
15-
16-
try {
17-
await page.goto(`${ENV}/#/da-sites/da-status/tests`);
18-
await page.getByRole('button', { name: 'New' }).click();
19-
await page.getByRole('button', { name: 'Media' }).click();
20-
21-
const [fileChooser] = await Promise.all([
22-
page.waitForEvent('filechooser'),
23-
page.getByText('Select file').click(),
24-
]);
25-
26-
const htmlFile = path.join(__dirname, '/mocks/regionaledit.html');
27-
console.log(htmlFile);
28-
await fileChooser.setFiles([`${htmlFile}`]);
29-
30-
await page.getByRole('button', { name: 'Upload' }).click();
31-
await page.getByRole('link', { name: 'regionaledit' }).click();
32-
33-
await expect(page.locator('div.loc-color-overlay.loc-langstore')).toBeVisible();
34-
await expect(page.locator('div.loc-color-overlay.loc-regional')).toBeVisible();
35-
36-
expect(page.getByText('Deleted H1 Here', { exact: true })).toBeVisible();
37-
expect(page.getByText('Added H1 Here', { exact: true })).toBeVisible();
38-
39-
await page.locator('div.loc-color-overlay.loc-langstore').hover();
40-
await page.locator('da-loc-deleted').getByText('Delete', { exact: true }).click();
41-
await expect(page.getByText('Deleted H1 Here', { exact: true })).not.toBeVisible();
42-
43-
await page.locator('div.loc-color-overlay.loc-regional').hover();
44-
await page.locator('da-loc-added').getByText('Keep', { exact: true }).click();
45-
await expect(page.getByText('Added H1 Here', { exact: true })).toBeVisible();
46-
await expect(page.locator('div.loc-color-overlay.loc-regional')).not.toBeVisible();
47-
} finally {
48-
deleteTestPage();
49-
}
7+
8+
const folderURL = getTestFolderURL('regionaledit', workerInfo);
9+
await page.goto(folderURL);
10+
await page.getByRole('button', { name: 'New' }).click();
11+
await page.getByRole('button', { name: 'Media' }).click();
12+
13+
const [fileChooser] = await Promise.all([
14+
page.waitForEvent('filechooser'),
15+
page.getByText('Select file').click(),
16+
]);
17+
18+
const htmlFile = path.join(__dirname, '/mocks/regionaledit.html');
19+
console.log(htmlFile);
20+
await fileChooser.setFiles([`${htmlFile}`]);
21+
22+
await page.getByRole('button', { name: 'Upload' }).click();
23+
await page.getByRole('link', { name: 'regionaledit', exact: true }).click();
24+
25+
await expect(page.locator('div.loc-color-overlay.loc-langstore')).toBeVisible();
26+
await expect(page.locator('div.loc-color-overlay.loc-regional')).toBeVisible();
27+
28+
expect(page.getByText('Deleted H1 Here', { exact: true })).toBeVisible();
29+
expect(page.getByText('Added H1 Here', { exact: true })).toBeVisible();
30+
31+
await page.locator('div.loc-color-overlay.loc-langstore').hover();
32+
await page.locator('da-loc-deleted').getByText('Delete', { exact: true }).click();
33+
await expect(page.getByText('Deleted H1 Here', { exact: true })).not.toBeVisible();
34+
35+
await page.locator('div.loc-color-overlay.loc-regional').hover();
36+
await page.locator('da-loc-added').getByText('Keep', { exact: true }).click();
37+
await expect(page.getByText('Added H1 Here', { exact: true })).toBeVisible();
38+
await expect(page.locator('div.loc-color-overlay.loc-regional')).not.toBeVisible();
39+
40+
// Note that the test folder will be automatically cleaned up in subsequent runs
41+
// by the delete.spec.js test
5042
});

test/e2e/tests/versions.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ test('Create Version and Restore from it', async ({ page }, workerInfo) => {
6060

6161
// Select 'ver 1' and restore it
6262
await page.getByText('ver 1', { exact: false }).click();
63-
await page.getByRole('button', { name: 'Restore' }).click();
63+
await page.locator('li').filter({ hasText: 'ver 1' }).getByRole('button').click();
6464
await page.locator('div.da-version-action-area').getByText('Restore').click();
6565

6666
// Ensure that the original text is still there

test/e2e/utils/page.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,20 @@
1111
*/
1212
import ENV from './env.js';
1313

14+
function getQuery() {
15+
const { GITHUB_HEAD_REF: branch } = process.env;
16+
if (branch === 'local') {
17+
return '?da-admin=local&da-collab=local';
18+
}
19+
return '';
20+
}
21+
22+
const QUERY = getQuery();
23+
1424
function getTestURL(type, testIdentifier, workerInfo) {
1525
const dateStamp = Date.now().toString(36);
1626
const pageName = `pw-${testIdentifier}-${dateStamp}-${workerInfo.project.name}`;
17-
return `${ENV}/${type}#/da-sites/da-status/tests/${pageName}`;
27+
return `${ENV}/${type}${QUERY}#/da-sites/da-status/tests/${pageName}`;
1828
}
1929

2030
/**
@@ -28,6 +38,17 @@ export function getTestPageURL(testIdentifier, workerInfo) {
2838
return getTestURL('edit', testIdentifier, workerInfo);
2939
}
3040

41+
/**
42+
* Returns a URL for a single-use test folder.
43+
*
44+
* @param {string} testIdentifier - A identifier for the test
45+
* @param {object} workerInfo - workerInfo as passed in by Playwright
46+
* @returns {string} The URL for the test page.
47+
*/
48+
export function getTestFolderURL(testIdentifier, workerInfo) {
49+
return getTestURL('', testIdentifier, workerInfo);
50+
}
51+
3152
/**
3253
* Returns a URL for a single-use test sheet.
3354
*

0 commit comments

Comments
 (0)