Skip to content

Commit 936de7f

Browse files
committed
Aligning a bit the pre-existing e2e tests with the e2e structure
1 parent fb8151f commit 936de7f

File tree

6 files changed

+139
-134
lines changed

6 files changed

+139
-134
lines changed

packages/web-forms/e2e/page-objects/pages/PreviewPage.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class PreviewPage {
4040
await expect(link).toBeVisible();
4141
await link.click();
4242

43-
// Wait for form to load and verify the form title
43+
// Wait for form to load and verify the form title ensuring the form is ready.
4444
const title = this.page.locator('.form-title').getByRole('heading', { name: formTitle });
4545
await expect(title).toBeVisible();
4646
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import { faker } from '@faker-js/faker';
2+
import { expect, Page, test } from '@playwright/test';
3+
import { PreviewPage } from '../../page-objects/pages/PreviewPage.js';
4+
5+
const expandAllCategories = async (page: Page) => {
6+
await page.evaluate(() => {
7+
const collapsedDetails = document.querySelectorAll<HTMLDetailsElement>('details:not([open])');
8+
9+
collapsedDetails.forEach((details) => {
10+
details.open = true;
11+
});
12+
});
13+
};
14+
15+
test.describe('Preview Form Render', () => {
16+
test('demo forms load', async ({ context, page }) => {
17+
const previewPage = new PreviewPage(page);
18+
await previewPage.goToPage();
19+
20+
const formPreviewLinks = await page.locator('.form-preview-link').all();
21+
22+
expect(formPreviewLinks.length).toBeGreaterThan(0);
23+
24+
for (const link of formPreviewLinks) {
25+
const [formPreviewPage] = await Promise.all([context.waitForEvent('page'), link.click()]);
26+
27+
await formPreviewPage.waitForSelector(
28+
'.form-initialization-status.error, .form-initialization-status.ready',
29+
{
30+
state: 'attached',
31+
}
32+
);
33+
34+
const [failureDialog] = await formPreviewPage.locator('.form-load-failure-dialog').all();
35+
36+
expect(failureDialog).toBeUndefined();
37+
38+
await formPreviewPage.close();
39+
}
40+
});
41+
42+
test('all forms are rendered and there is no console error', async ({ page, browserName }) => {
43+
let consoleErrors = 0;
44+
page.on('console', (msg) => {
45+
if (msg.type() === 'error' || msg.type() === 'warning') {
46+
consoleErrors++;
47+
}
48+
});
49+
50+
const previewPage = new PreviewPage(page);
51+
await previewPage.goToPage();
52+
53+
// this ensures that Vue application is loaded before proceeding forward.
54+
await expect(page.getByText('Demo Forms')).toBeVisible();
55+
56+
// Let's expand all categories, so that Form list is visible
57+
await expandAllCategories(page);
58+
59+
const forms = await page.locator('ul.form-list li a').all();
60+
61+
expect(forms.length).toBeGreaterThan(0);
62+
63+
for (const form of forms) {
64+
await form.click();
65+
66+
// Traverse the form element by element
67+
// if focused element is an editable textbox then fill it
68+
// Exit the loop when focus is on the Send button
69+
while (true) {
70+
const onSendButton = await page.evaluate(() => {
71+
const activeElement = document.activeElement;
72+
return activeElement?.tagName === 'BUTTON' && activeElement.textContent === 'Send';
73+
});
74+
75+
if (onSendButton) {
76+
break;
77+
}
78+
79+
await page.keyboard.press(browserName == 'webkit' ? 'Alt+Tab' : 'Tab');
80+
81+
const inputType = await page.evaluate(() => {
82+
const isInputElement = (
83+
activeElement: Element | null
84+
): activeElement is HTMLInputElement => {
85+
return activeElement?.tagName === 'INPUT';
86+
};
87+
88+
const activeElement = document.activeElement;
89+
90+
if (
91+
!isInputElement(activeElement) ||
92+
activeElement.hasAttribute('readonly') ||
93+
activeElement.hasAttribute('disabled')
94+
) {
95+
return null;
96+
}
97+
98+
return activeElement.type;
99+
});
100+
101+
if (inputType === 'text') {
102+
await page.keyboard.type(faker.internet.displayName());
103+
}
104+
// Select the next option, if the last option is selected by default
105+
// then browser selects the first one.
106+
else if (inputType === 'radio') {
107+
await page.keyboard.press('ArrowDown');
108+
}
109+
// Tab behaviour for checkboxes is different, each Tab press moves the focus
110+
// to the next option. Here we are toggling every checkbox option.
111+
else if (inputType === 'checkbox') {
112+
// Toggle the option
113+
await page.keyboard.press('Space');
114+
}
115+
}
116+
117+
const langChanger = page.locator('.larger-screens .language-changer');
118+
119+
if ((await langChanger.count()) > 0) {
120+
await langChanger.click();
121+
await page.locator('.language-dd-label').last().click();
122+
}
123+
124+
await page.goBack();
125+
await expandAllCategories(page);
126+
}
127+
128+
expect(consoleErrors).toBe(0);
129+
});
130+
});

packages/web-forms/e2e/specs/build/style.test.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { expect, test } from '@playwright/test';
2+
import { PreviewPage } from '../../page-objects/pages/PreviewPage.js';
23

34
test('Build includes component-defined styles', async ({ page }) => {
4-
await page.goto('http://localhost:5174/');
5+
const previewPage = new PreviewPage(page);
6+
await previewPage.goToPage();
57

68
// This ensures that the application is loaded before proceeding forward.
79
await expect(page.getByText('Demo Forms').first()).toBeVisible();

packages/web-forms/e2e/specs/build/vue.test.ts

-101
This file was deleted.

packages/web-forms/e2e/specs/build/wf-preview.test.ts

-26
This file was deleted.

packages/web-forms/e2e/specs/note.test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,19 @@ test.describe('Note Question Type', () => {
3434
await formPage.expectLabelAtIndex('', 2, false);
3535
await formPage.expectHintAtIndex('Hint-only note', 1);
3636

37-
await formPage.expectLabelAtIndex('A note with a default value', 3);
37+
await formPage.expectLabel('A note with a default value');
3838
await formPage.expectNoteAtIndex('A value', 0);
3939

40-
await formPage.expectLabelAtIndex('A note with a calculation', 4);
40+
await formPage.expectLabel('A note with a calculation');
4141
await formPage.expectNoteAtIndex('A value', 1);
4242

43-
await formPage.expectLabelAtIndex('A readonly integer with value', 8);
43+
await formPage.expectLabel('A readonly integer with value');
4444
await formPage.expectNoteAtIndex('3', 2);
4545

46-
await formPage.expectLabelAtIndex('A note with decimal type calculated from int', 9);
46+
await formPage.expectLabel('A note with decimal type calculated from int');
4747
await formPage.expectNoteAtIndex('4.5', 3);
4848

49-
await formPage.expectLabelAtIndex('A note with geopoint type', 10);
49+
await formPage.expectLabel('A note with geopoint type');
5050
await formPage.geopoint.expectGeopointFormattedValue([
5151
'Accuracy: 150m',
5252
'Latitude: 38.253094215699576',

0 commit comments

Comments
 (0)