Skip to content

Commit d7d08a3

Browse files
fix quill loading
1 parent 6a3cd89 commit d7d08a3

File tree

17 files changed

+153
-75
lines changed

17 files changed

+153
-75
lines changed

e2e/testcafe-devextreme/helpers/testPageUtils.ts

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,71 +51,112 @@ export async function clearTestPage(testController: TestController): Promise<voi
5151
}
5252

5353
export async function loadAxeCore(t: TestController): Promise<void> {
54-
await t.eval(() => new Promise<void>((resolve, reject) => {
54+
const loadAxeCoreFn = ClientFunction(() => new Promise<void>((resolve, reject) => {
5555
// @ts-expect-error ts-error
5656
if (window.axe) {
5757
resolve();
5858
return;
5959
}
6060

6161
const script = document.createElement('script');
62+
script.id = 'axe-core-script';
6263
script.src = '../../../node_modules/axe-core/axe.min.js';
6364
// @ts-expect-error ts-error
6465
script.onload = resolve;
6566
script.onerror = reject;
6667
document.head.appendChild(script);
6768
}));
69+
70+
await loadAxeCoreFn.with({ boundTestRun: t })();
6871
}
6972

7073
export async function loadQuill(t: TestController): Promise<void> {
71-
await t.eval(() => new Promise<void>((resolve, reject) => {
74+
const loadQuillFn = ClientFunction(() => new Promise<void>((resolve, reject) => {
7275
// @ts-expect-error ts-error
7376
if (window.Quill) {
7477
resolve();
7578
return;
7679
}
7780

7881
const script = document.createElement('script');
82+
script.id = 'dx-quill-script';
7983
script.src = '../../../packages/devextreme/artifacts/js/dx-quill.min.js';
8084
// @ts-expect-error ts-error
8185
script.onload = resolve;
8286
script.onerror = reject;
8387
document.head.prepend(script);
8488
}));
89+
90+
await loadQuillFn.with({ boundTestRun: t })();
8591
}
8692

8793
export async function loadGantt(t: TestController): Promise<void> {
88-
await t.eval(() => new Promise<void>((resolve, reject) => {
94+
const loadGanttFn = ClientFunction(() => new Promise<void>((resolve, reject) => {
8995
// @ts-expect-error ts-error
9096
if (window.DevExpress?.ui?.dxGantt) {
9197
resolve();
9298
return;
9399
}
94100

95101
const script = document.createElement('script');
102+
script.id = 'dx-gantt-script';
96103
script.src = '../../../packages/devextreme/artifacts/js/dx-gantt.min.js';
97104
// @ts-expect-error ts-error
98105
script.onload = resolve;
99106
script.onerror = reject;
100107
document.head.appendChild(script);
101108
}));
109+
110+
await loadGanttFn.with({ boundTestRun: t })();
102111
}
103112

104113
export async function loadAspNetData(t: TestController): Promise<void> {
105-
await t.eval(() => new Promise<void>((resolve, reject) => {
114+
const loadAspNetDataFn = ClientFunction(() => new Promise<void>((resolve, reject) => {
106115
// @ts-expect-error ts-error
107116
if (window.DevExpress?.data?.AspNet) {
108117
resolve();
109118
return;
110119
}
111120

112121
const script = document.createElement('script');
122+
script.id = 'dx-aspnet-data-script';
113123
script.src = '../../../packages/devextreme/artifacts/js/dx.aspnet.data.js';
114124
// @ts-expect-error ts-error
115125
script.onload = resolve;
116126
script.onerror = reject;
117127
document.head.appendChild(script);
118128
}));
129+
130+
await loadAspNetDataFn.with({ boundTestRun: t })();
131+
}
132+
133+
export async function loadDevExtreme(t: TestController): Promise<void> {
134+
const loadDevExtremeFn = ClientFunction(() => new Promise<void>((resolve, reject) => {
135+
// @ts-expect-error ts-error
136+
if (window.DevExpress?.ui?.dxCalendar) {
137+
resolve();
138+
return;
139+
}
140+
141+
const script = document.createElement('script');
142+
script.id = 'dx-all-script';
143+
script.src = '../../../packages/devextreme/artifacts/js/dx.all.js';
144+
// @ts-expect-error ts-error
145+
script.onload = resolve;
146+
script.onerror = reject;
147+
document.head.appendChild(script);
148+
}));
149+
150+
await loadDevExtremeFn.with({ boundTestRun: t })();
151+
}
152+
153+
export async function removeScript(t: TestController, scriptId: string): Promise<void> {
154+
await ClientFunction((id: string) => {
155+
const script = document.getElementById(id);
156+
if (script) {
157+
script.remove();
158+
}
159+
}).with({ boundTestRun: t })(scriptId);
119160
}
120161

121162
// interface LoadOptions {

e2e/testcafe-devextreme/helpers/themeUtils.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,16 @@ export async function testScreenshot(
4141
themeChanged,
4242
} = options ?? {};
4343

44+
const baseName = screenshotName.endsWith('.png') ? screenshotName.slice(0, -4) : screenshotName;
45+
const getScreenshotName = (themePostfix?: string) => `${baseName}${themePostfix ?? getThemePostfix(theme)}.png`;
46+
4447
if (isString(theme)) {
4548
await changeTheme(theme);
4649
await themeChanged?.();
4750
}
4851

4952
await t
50-
.expect(await takeScreenshot(screenshotName.replace('.png', `${getThemePostfix(theme)}.png`), element))
53+
.expect(await takeScreenshot(getScreenshotName(), element))
5154
.ok();
5255

5356
if (shouldTestInCompact) {
@@ -57,7 +60,7 @@ export async function testScreenshot(
5760
await compactCallBack?.();
5861

5962
await t
60-
.expect(await takeScreenshot(screenshotName.replace('.png', `${getThemePostfix(`${themeName}-compact`)}.png`), element))
63+
.expect(await takeScreenshot(getScreenshotName(getThemePostfix(`${themeName}-compact`)), element))
6164
.ok();
6265
}
6366

e2e/testcafe-devextreme/runner.ts

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import {
99
clearTestPage,
1010
loadAspNetData,
1111
loadAxeCore,
12+
loadDevExtreme,
1213
loadGantt,
1314
loadQuill,
15+
removeScript,
1416
} from './helpers/testPageUtils';
1517
import 'nconf';
1618

@@ -250,27 +252,57 @@ createTestCafe(TESTCAFE_CONFIG)
250252
(runner as any).cache = args.cache;
251253
}
252254

255+
let testRunCounter = 0;
256+
const testExecutionMap = new Map<string, number>();
257+
253258
const runOptions: RunOptions = {
254259
quarantineMode: { successThreshold: 1, attemptLimit: 5 },
255260
disableNativeAutomation: true,
256261
// @ts-expect-error ts-error
257262
hooks: {
263+
testRun: {
264+
before: async () => {
265+
// eslint-disable-next-line no-plusplus
266+
testRunCounter++;
267+
console.log(`🔄 Test run #${testRunCounter} started`);
268+
},
269+
},
258270
test: {
259271
before: async (t: TestController) => {
272+
// @ts-expect-error ts-errors
273+
const { name } = t.testRun.test;
274+
const currentCount = testExecutionMap.get(name) ?? 0;
275+
testExecutionMap.set(name, currentCount + 1);
276+
277+
const executionCount = testExecutionMap.get(name);
278+
if (executionCount! > 1) {
279+
console.log(`🔁 Test "${name}" - retry attempt #${executionCount}`);
280+
} else {
281+
console.log(`✅ Test "${name}" - first run`);
282+
}
283+
260284
if (!componentFolder.includes('accessibility')) {
261285
// @ts-expect-error ts-errors
262286
const { meta } = t.testRun.test;
263287

264288
if (meta?.loadQuill) {
289+
await removeScript(t, 'dx-all-script');
265290
await loadQuill(t);
266-
}
267-
268-
if (meta?.loadGantt) {
269-
await loadGantt(t);
270-
}
291+
await loadDevExtreme(t);
292+
} else {
293+
await removeScript(t, 'dx-quill-script');
294+
await loadDevExtreme(t);
295+
if (meta?.loadGantt) {
296+
await loadGantt(t);
297+
} else {
298+
await removeScript(t, 'dx-gantt-script');
299+
}
271300

272-
if (meta?.loadAspNetData) {
273-
await loadAspNetData(t);
301+
if (meta?.loadAspNetData) {
302+
await loadAspNetData(t);
303+
} else {
304+
await removeScript(t, 'dx-aspnet-data-script');
305+
}
274306
}
275307

276308
await ClientFunction(() => {

e2e/testcafe-devextreme/tests/common/pivotGrid/runningTotal/runningTotal.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
22
import PivotGrid from 'devextreme-testcafe-models/pivotGrid';
33
import url from '../../../../helpers/getPageUrl';
4-
import { isMaterialBased } from '../../../../helpers/themeUtils';
4+
import { isMaterialBased, testScreenshot } from '../../../../helpers/themeUtils';
55
import { createWidget } from '../../../../helpers/createWidget';
66

77
const testFixture = () => (isMaterialBased() ? fixture.skip : fixture);
@@ -75,7 +75,7 @@ test('Should correctly sum cells values with runningTotal', async (t) => {
7575
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
7676
const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
7777

78-
await takeScreenshot('running-total_seamless-data.png', pivotGrid.element);
78+
await testScreenshot(t, takeScreenshot, 'running-total_seamless-data.png', { element: pivotGrid.element });
7979

8080
await t
8181
.expect(compareResults.isValid())
@@ -112,12 +112,12 @@ test('Should correctly sum cells values with runningTotal with partial data (T11
112112
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
113113
const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
114114

115-
await takeScreenshot('running-total_partial-data_render-0.png', pivotGrid.element);
115+
await testScreenshot(t, takeScreenshot, 'running-total_partial-data_render-0.png', { element: pivotGrid.element });
116116

117117
const rowToCollapse = pivotGrid.getRowsArea().getCell(3);
118118
await t.click(rowToCollapse);
119119

120-
await takeScreenshot('running-total_partial-data_render-1.png', pivotGrid.element);
120+
await testScreenshot(t, takeScreenshot, 'running-total_partial-data_render-1.png', { element: pivotGrid.element });
121121

122122
await t
123123
.expect(compareResults.isValid())

e2e/testcafe-devextreme/tests/common/pivotGrid/scrolling.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,14 @@ generateOptionMatrix({
195195

196196
const firstCellToClick = pivotGrid.getRowsArea().getCell(1);
197197
await t.click(firstCellToClick);
198-
await takeScreenshot(`scrollbar-margin_step-0_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, pivotGrid.element);
198+
await testScreenshot(t, takeScreenshot, `scrollbar-margin_step-0_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, { element: pivotGrid.element });
199199

200200
const secondCellToClick = pivotGrid.getRowsArea().getCell(6);
201201
await t.click(secondCellToClick);
202-
await takeScreenshot(`scrollbar-margin_step-1_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, pivotGrid.element);
202+
await testScreenshot(t, takeScreenshot, `scrollbar-margin_step-1_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, { element: pivotGrid.element });
203203

204204
await t.click(secondCellToClick);
205-
await takeScreenshot(`scrollbar-margin_step-2_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, pivotGrid.element);
205+
await testScreenshot(t, takeScreenshot, `scrollbar-margin_step-2_useNative-${nativeScrolling}_rtl-${rtlEnabled}`, { element: pivotGrid.element });
206206

207207
await t
208208
.expect(compareResults.isValid())

e2e/testcafe-devextreme/tests/common/pivotGrid/virtualScrolling_T1210807.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
22
import PivotGrid from 'devextreme-testcafe-models/pivotGrid';
33
import url from '../../../helpers/getPageUrl';
44
import { createWidget } from '../../../helpers/createWidget';
5-
import { isMaterialBased } from '../../../helpers/themeUtils';
5+
import { isMaterialBased, testScreenshot } from '../../../helpers/themeUtils';
66

77
const testFixture = (): FixtureFn => {
88
if (isMaterialBased()) {
@@ -41,7 +41,8 @@ test.meta({ unstable: true })('Row fields overlap data fields if dataFieldArea i
4141
await pivotGrid.scrollBy({ top: 30000 });
4242
await pivotGrid.scrollBy({ top: 30000 });
4343

44-
await takeScreenshot('rows_do_not_overlap_data_fields_if_virtual_scrolling_enabled_T1210807.png', pivotGrid.element);
44+
await testScreenshot(t, takeScreenshot, 'rows_do_not_overlap_data_fields_if_virtual_scrolling_enabled_T1210807.png', { element: pivotGrid.element });
45+
4546
await t
4647
.expect(compareResults.isValid())
4748
.ok(compareResults.errorMessages());

e2e/testcafe-devextreme/tests/common/treeList/API.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import TreeList from 'devextreme-testcafe-models/treeList';
22
import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
33
import url from '../../../helpers/getPageUrl';
44
import { createWidget } from '../../../helpers/createWidget';
5+
import { testScreenshot } from '../../../helpers/themeUtils';
56

67
fixture.disablePageReloads`Public methods`
78
.page(url(__dirname, '../../container.html'));
@@ -39,7 +40,7 @@ const getItems = (): Record<string, unknown>[] => {
3940
.expect(treeList.getDataCell(131, 0).element.textContent)
4041
.contains('item_');
4142

42-
await takeScreenshot(`T1275775-navigateToRow-with-async-cell-templates_(renderAsync=${renderAsync}_useNativeScrolling=${useNativeScrolling})`, treeList.element);
43+
await testScreenshot(t, takeScreenshot, `T1275775-navigateToRow-with-async-cell-templates_(renderAsync=${renderAsync}_useNativeScrolling=${useNativeScrolling})`, { element: treeList.element });
4344

4445
await t
4546
.expect(compareResults.isValid())

e2e/testcafe-devextreme/tests/common/treeList/aiColumn/visual.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
22
import TreeList from 'devextreme-testcafe-models/treeList';
33
import url from '../../../../helpers/getPageUrl';
44
import { createWidget } from '../../../../helpers/createWidget';
5+
import { testScreenshot } from '../../../../helpers/themeUtils';
56

67
fixture.disablePageReloads`Ai Column.Visual`
78
.page(url(__dirname, '../../../container.html'));
@@ -15,7 +16,7 @@ test('Default render', async (t) => {
1516

1617
await t.expect(treeList.isReady()).ok();
1718

18-
await takeScreenshot('treelist__ai-column__default.png', treeList.element);
19+
await testScreenshot(t, takeScreenshot, 'treelist__ai-column__default.png', { element: treeList.element });
1920

2021
// assert
2122
await t

e2e/testcafe-devextreme/tests/common/treeList/columns.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import TreeList from 'devextreme-testcafe-models/treeList';
33
import url from '../../../helpers/getPageUrl';
44
import { createWidget } from '../../../helpers/createWidget';
55
import { changeTheme } from '../../../helpers/changeTheme';
6+
import { testScreenshot } from '../../../helpers/themeUtils';
67

78
fixture.disablePageReloads`Columns`
89
.page(url(__dirname, '../../container.html'));
@@ -12,9 +13,9 @@ test('CheckBox position with double rows columns', async (t) => {
1213
const treeList = new TreeList('#container');
1314
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
1415

16+
await testScreenshot(t, takeScreenshot, 'T1054312-material.blue.light', { element: treeList.getHeaders().element });
17+
1518
await t
16-
.expect(await takeScreenshot('T1054312-material.blue.light', treeList.getHeaders().element))
17-
.ok()
1819
.expect(compareResults.isValid())
1920
.ok(compareResults.errorMessages());
2021
}).before(async () => {
@@ -44,9 +45,9 @@ test('Correct display border to last column', async (t) => {
4445
const treeList = new TreeList('#container');
4546
const { takeScreenshot, compareResults } = createScreenshotsComparer(t);
4647

48+
await testScreenshot(t, takeScreenshot, 'T1053931-material.blue.light', { element: treeList.getHeaders().element });
49+
4750
await t
48-
.expect(await takeScreenshot('T1053931-material.blue.light', treeList.getHeaders().element))
49-
.ok()
5051
.expect(compareResults.isValid())
5152
.ok(compareResults.errorMessages());
5253
}).before(async () => {

e2e/testcafe-devextreme/tests/common/treeList/keyboardNavigation/markup.screenshots.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createScreenshotsComparer } from 'devextreme-screenshot-comparer';
22
import TreeList from 'devextreme-testcafe-models/treeList';
33
import url from '../../../../helpers/getPageUrl';
44
import { createWidget } from '../../../../helpers/createWidget';
5+
import { testScreenshot } from '../../../../helpers/themeUtils';
56

67
fixture
78
.disablePageReloads`Keyboard Navigation - screenshots`
@@ -17,11 +18,11 @@ test('Focused cells should look correctly', async (t) => {
1718

1819
await t.click(headerCellToFocus.element)
1920
.pressKey('tab');
20-
await takeScreenshot('tree-list_keyboard-navigation-header-cell-focused.png');
21+
await testScreenshot(t, takeScreenshot, 'tree-list_keyboard-navigation-header-cell-focused.png');
2122

2223
await t.click(dataCellToFocus.element)
2324
.pressKey('tab');
24-
await takeScreenshot('tree_list_keyboard-navigation-data-cell-focused.png');
25+
await testScreenshot(t, takeScreenshot, 'tree_list_keyboard-navigation-data-cell-focused.png');
2526

2627
await t.expect(compareResults.isValid())
2728
.ok(compareResults.errorMessages());
@@ -61,10 +62,10 @@ test('Focused custom buttons should look correctly', async (t) => {
6162

6263
await t.click(headerCellToFocus.element)
6364
.pressKey('tab');
64-
await takeScreenshot('tree-list_keyboard-navigation-custom-buttons-cell-focused.png');
65+
await testScreenshot(t, takeScreenshot, 'tree-list_keyboard-navigation-custom-buttons-cell-focused.png');
6566

6667
await t.pressKey('tab');
67-
await takeScreenshot('tree-list_keyboard-navigation-custom-button-focused.png');
68+
await testScreenshot(t, takeScreenshot, 'tree-list_keyboard-navigation-custom-button-focused.png');
6869

6970
await t.expect(compareResults.isValid())
7071
.ok(compareResults.errorMessages());

0 commit comments

Comments
 (0)