Skip to content

Commit bb0b9e6

Browse files
committed
PRO-13138 feat: group steps in HTML report
1 parent 48a5777 commit bb0b9e6

30 files changed

Lines changed: 202 additions & 154 deletions

autotests/packs/allTests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export const pack: Pack = {
8080
skipTests,
8181
takeFullPageScreenshotOnError: false,
8282
takeViewportScreenshotOnError: true,
83-
testFileGlobs: ['**/autotests/tests/**/exists.ts'],
83+
testFileGlobs: ['**/autotests/tests/**/*.ts'],
8484
testIdleTimeout: 8_000,
8585
testTimeout: 15_000,
8686
userAgent,

src/utils/getDurationWithUnits.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Should be a pure function without dependencies in the form of a function declaration,
55
* because it is used in the JS client code of HTML report.
66
*/
7-
export function getDurationWithUnits(durationInMs: number): string {
7+
export const getDurationWithUnits = (durationInMs: number): string => {
88
const msInSecond = 1_000;
99
const timeMultiplicator = 60;
1010

@@ -37,4 +37,4 @@ export function getDurationWithUnits(durationInMs: number): string {
3737
}
3838

3939
return parts.slice(0, 2).join(' ') || '0ms';
40-
}
40+
};

src/utils/report/client/addOnClickOnClass.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ declare const reportClientState: ReportClientState;
77
* This base client function should not use scope variables (except other base functions).
88
* @internal
99
*/
10-
export function addOnClickOnClass(className: string, onclick: (event: HTMLElement) => void): void {
10+
export const addOnClickOnClass = (
11+
className: string,
12+
onclick: (element: HTMLElement) => void,
13+
): void => {
1114
let {clickListeners} = reportClientState;
1215

1316
if (!clickListeners) {
@@ -34,4 +37,4 @@ export function addOnClickOnClass(className: string, onclick: (event: HTMLElemen
3437
}
3538

3639
clickListeners[className] = onclick;
37-
}
40+
};

src/utils/report/client/chooseTestRun.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function chooseTestRun(runHash: RunHash): void {
5050

5151
if (
5252
!(previousHash in testRunDetailsElementsByHash) &&
53-
!previousTestRunDetailsElement.classList.contains('test-details-empty')
53+
!previousTestRunDetailsElement.classList.contains('empty-state')
5454
) {
5555
testRunDetailsElementsByHash[previousHash] = previousTestRunDetailsElement;
5656
}

src/utils/report/client/clickOnRetry.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* This base client function should not use scope variables (except other base functions).
44
* @internal
55
*/
6-
export function clickOnRetry(element: HTMLElement): void {
7-
const chosenRetryId = element.getAttribute('aria-controls');
6+
export const clickOnRetry = (element: HTMLElement): void => {
7+
const chosenRetryId = element.dataset['retry'];
88
const retry = Number(chosenRetryId?.match(/\d+/)?.[0]);
99
const allRetryElements: NodeListOf<HTMLElement> = document.querySelectorAll('.retry');
1010

@@ -26,4 +26,4 @@ export function clickOnRetry(element: HTMLElement): void {
2626
if (leftSection) {
2727
leftSection.ariaLabel = `Retry ${retry}`;
2828
}
29-
}
29+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Handler for click on screenshot in step details.
3+
* This base client function should not use scope variables (except other base functions).
4+
* @internal
5+
*/
6+
export const clickOnScreenshot = (element: HTMLElement): void => {
7+
const image = element.firstElementChild as HTMLImageElement | null;
8+
9+
if (image === null || image.tagName !== 'IMG') {
10+
// eslint-disable-next-line no-console
11+
console.error('Cannot find element <image> in clicked button', element);
12+
13+
return;
14+
}
15+
16+
const screenshotDialogImage = document.getElementById(
17+
'screenshotDialogImage',
18+
) as HTMLImageElement | null;
19+
const screenshotDialogTitle = document.getElementById('screenshotDialogTitle');
20+
21+
if (screenshotDialogImage) {
22+
screenshotDialogImage.alt = image.title;
23+
screenshotDialogImage.src = image.src;
24+
screenshotDialogImage.title = image.title;
25+
}
26+
27+
if (screenshotDialogTitle) {
28+
screenshotDialogTitle.textContent = image.title;
29+
}
30+
31+
(document.getElementById('screenshotDialog') as HTMLDialogElement | null)?.showModal();
32+
};

src/utils/report/client/clickOnStep.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
* This base client function should not use scope variables (except other base functions).
44
* @internal
55
*/
6-
export function clickOnStep(element: HTMLElement): void {
6+
export const clickOnStep = (element: HTMLElement): void => {
77
const expanded = element.ariaExpanded === 'true';
88

99
// eslint-disable-next-line no-param-reassign
1010
element.ariaExpanded = String(!expanded);
11-
}
11+
};

src/utils/report/client/clickOnTestRun.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const chooseTestRun = clientChooseTestRun;
99
* This base client function should not use scope variables (except other base functions).
1010
* @internal
1111
*/
12-
export function clickOnTestRun(element: HTMLElement): void {
12+
export const clickOnTestRun = (element: HTMLElement): void => {
1313
const runHash = (element.dataset as {runhash: RunHash}).runhash;
1414

1515
const previousChosenTestRunButton = document.querySelector('.test-link[aria-current="true"]');
@@ -22,4 +22,4 @@ export function clickOnTestRun(element: HTMLElement): void {
2222
element.ariaCurrent = 'true';
2323

2424
chooseTestRun(runHash);
25-
}
25+
};

src/utils/report/client/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export {chooseTestRun} from './chooseTestRun';
99
/** @internal */
1010
export {clickOnRetry} from './clickOnRetry';
1111
/** @internal */
12+
export {clickOnScreenshot} from './clickOnScreenshot';
13+
/** @internal */
1214
export {clickOnStep} from './clickOnStep';
1315
/** @internal */
1416
export {clickOnTestRun} from './clickOnTestRun';

src/utils/report/client/initialScript.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {createSimpleLocator as clientCreateSimpleLocator} from 'create-locator';
33
import {addDomContentLoadedHandler as clientAddDomContentLoadedHandler} from './addDomContentLoadedHandler';
44
import {addOnClickOnClass as clientAddOnClickOnClass} from './addOnClickOnClass';
55
import {clickOnRetry as clientClickOnRetry} from './clickOnRetry';
6+
import {clickOnScreenshot as clientClickOnScreenshot} from './clickOnScreenshot';
67
import {clickOnStep as clientClickOnStep} from './clickOnStep';
78
import {clickOnTestRun as clientClickOnTestRun} from './clickOnTestRun';
89
import {createJsxRuntime as clientCreateJsxRuntime} from './createJsxRuntime';
@@ -18,6 +19,7 @@ declare const reportClientState: ReportClientState;
1819
const addDomContentLoadedHandler = clientAddDomContentLoadedHandler;
1920
const addOnClickOnClass = clientAddOnClickOnClass;
2021
const clickOnRetry = clientClickOnRetry;
22+
const clickOnScreenshot = clientClickOnScreenshot;
2123
const clickOnStep = clientClickOnStep;
2224
const clickOnTestRun = clientClickOnTestRun;
2325
const createJsxRuntime = clientCreateJsxRuntime;
@@ -30,7 +32,7 @@ const setReadJsonReportDataObservers = clientSetReadJsonReportDataObservers;
3032
* This client function should not use scope variables (except global functions).
3133
* @internal
3234
*/
33-
export function initialScript(): void {
35+
export const initialScript = (): void => {
3436
jsx = createJsxRuntime();
3537

3638
const {locator} = createSimpleLocator(reportClientState.createLocatorOptions);
@@ -39,9 +41,10 @@ export function initialScript(): void {
3941

4042
addOnClickOnClass('retry-link', clickOnRetry);
4143
addOnClickOnClass('step-expanded', clickOnStep);
44+
addOnClickOnClass('step__screenshot-button', clickOnScreenshot);
4245
addOnClickOnClass('test-link', clickOnTestRun);
4346

4447
setReadJsonReportDataObservers();
4548

4649
addDomContentLoadedHandler(onDomContentLoad);
47-
}
50+
};

0 commit comments

Comments
 (0)