Skip to content

Commit

Permalink
FI-1010 fix: add runtime tests for `createPageObjectsFromMultiLocator…
Browse files Browse the repository at this point in the history
…` utility
  • Loading branch information
uid11 committed Mar 13, 2024
1 parent cc371fb commit 4ccef1c
Show file tree
Hide file tree
Showing 11 changed files with 95 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import {
} from 'autotests/actions';
import {setPageCookies, setPageRequestHeaders} from 'autotests/context';
import {E2edReportExample as E2edReportExampleRoute} from 'autotests/routes/pageRoutes';
import {locatorIdSelector} from 'autotests/selectors';
import {locatorIdSelector, rootLocator} from 'autotests/selectors';
import {Page} from 'e2ed';
import {setReadonlyProperty} from 'e2ed/utils';
import {createPageObjectsFromMultiLocator, setReadonlyProperty} from 'e2ed/utils';

import {TestRunButton} from './TestRunButton';

import type {Cookie, Headers, Selector, Url} from 'e2ed/types';

Expand Down Expand Up @@ -75,6 +77,17 @@ export class E2edReportExample extends Page<CustomPageParams> {
return new E2edReportExampleRoute();
}

/**
* Get `TestRunButton` hash (hashed by test `mainParams`).
*/
getTestRunButtons(): Promise<Readonly<Record<string, TestRunButton>>> {
return createPageObjectsFromMultiLocator({
PageObjectClass: TestRunButton,
keyParameter: 'runhash',
locator: rootLocator.retries.retry.button,
});
}

override init(this: E2edReportExample): void {
const {pageCookies = [], pageRequestHeaders} = this.pageParams ?? {};

Expand Down
22 changes: 22 additions & 0 deletions autotests/pageObjects/pages/E2edReportExample/TestRunButton.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type {CreateLocator} from 'e2ed/createLocator';
import type {Selector, TestRunButtonLocator} from 'e2ed/types';

type Locator = CreateLocator<TestRunButtonLocator, Selector>;

/**
* `TestRun` button.
*/
export class TestRunButton {
readonly locator: Locator;

constructor(locator: Locator) {
this.locator = locator;
}

/**
* Element with `mainParams` of test.
*/
get parameters(): Selector {
return this.locator.parameters();
}
}
1 change: 1 addition & 0 deletions autotests/pageObjects/pages/E2edReportExample/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export {E2edReportExample} from './E2edReportExample';
1 change: 1 addition & 0 deletions autotests/selectors/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export {inputSelector} from './inputSelector';
export {rootLocator} from './rootLocator';
export {
createSelector,
createSelectorByCss,
Expand Down
15 changes: 15 additions & 0 deletions autotests/selectors/rootLocator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {createSelectorByCss} from 'autotests/selectors';
import {createLocator, getCssSelectorFromAttributesChain} from 'e2ed/createLocator';

import type {ReportRootLocator, Selector} from 'e2ed/types';

/**
* Project root locator, mapped to `Selector`.
*/
export const rootLocator = createLocator<ReportRootLocator, Selector>('app', {
mapAttributesChain: (attributesChain) => {
const cssSelector = getCssSelectorFromAttributesChain(attributesChain);

return createSelectorByCss(cssSelector.replace('data-test-runhash', 'data-runhash'));
},
});
13 changes: 11 additions & 2 deletions autotests/selectors/selectorFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ import {createSelectorFunctions} from 'e2ed/selectors';
*/
export const {createSelector, createSelectorByCss, locatorIdSelector, htmlElementSelector} =
createSelectorFunctions({
getLocatorAttributeName: (parameter) =>
parameter === 'id' ? 'data-testid' : `data-test-${parameter}`,
getLocatorAttributeName: (parameter) => {
if (parameter === 'id') {
return 'data-testid';
}

if (parameter === 'runhash') {
return 'data-runhash';
}

return `data-test-${parameter}`;
},
});
28 changes: 25 additions & 3 deletions autotests/tests/e2edReportExample/selectorCustomMethods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,41 @@ test('selector custom methods', {meta: {testId: '15'}}, async () => {

await expect(reportPage.navigationRetries.exists, 'navigation retries exists').ok();

await expect(reportPage.navigationRetriesButton.exists, ' exists').ok();
await expect(reportPage.navigationRetriesButton.exists, 'navigation retries button exists').ok();

await expect(
reportPage.navigationRetriesButtonSelected.exists,
'selected navigation retries button exists',
).ok();

const buttonsCount = await reportPage.navigationRetriesButton.count;
const testRunButtonsHash = await reportPage.getTestRunButtons();

const retriesButtonsCount = await reportPage.navigationRetriesButton.count;

const testRunButtonsCount = Object.keys(testRunButtonsHash).length;

await expect(reportPage.testRunButton.count, 'getTestRunButtons find all buttons').eql(
testRunButtonsCount,
);

let buttonsIndex = 0;

for (const testRunButton of Object.values(testRunButtonsHash)) {
const selector = reportPage.testRunButton.nth(buttonsIndex);
const mainParams = await selector.findByLocatorId(String(testRunButton.locator.parameters))
.textContent;

await expect(testRunButton.parameters.textContent, 'mainParams of test run button correct').eql(
mainParams,
);

buttonsIndex += 1;
}

await expect(
reportPage.navigationRetriesButtonSelected.getLocatorParameter('retry'),
'last navigation retries button selected',
).eql(String(buttonsCount));
).eql(String(retriesButtonsCount));

await expect(
reportPage.navigationRetriesButtonSelected.hasLocatorParameter('disabled'),
Expand Down
2 changes: 1 addition & 1 deletion src/types/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export type {ReportRootLocator} from '../utils/report';
export type {ReportRootLocator, TestRunButtonLocator} from '../utils/report';
export type {Brand, IsBrand} from './brand';
export type {Expect, IsEqual, IsReadonlyKey} from './checks';
export type {Class} from './class';
Expand Down
2 changes: 1 addition & 1 deletion src/utils/report/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export {getLiteReport} from './getLiteReport';
/** @internal */
// eslint-disable-next-line import/no-unused-modules
export {getTestsThatRunningAtGivenTime} from './getTestsThatRunningAtGivenTime';
export type {ReportRootLocator} from './render';
export type {ReportRootLocator, TestRunButtonLocator} from './render';
/** @internal */
export {writeHtmlReport} from './writeHtmlReport';
/** @internal */
Expand Down
1 change: 1 addition & 0 deletions src/utils/report/render/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export type {RootLocator as ReportRootLocator} from './rootLocator';
/** @internal */
export {renderReportToHtml} from './renderReportToHtml';
export type {TestRunButtonLocator} from './renderTestRunButton';
4 changes: 2 additions & 2 deletions src/utils/report/render/renderTestRunButton.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type Props = TestRunButtonProps & Readonly<{index: number}> & Mark<TestRunButton

export type TestRunButtonLocator = Locator<
{name: Void; order: Void; parameters: Void; time: Void},
{status: TestRunStatus}
{mainParams: string; runhash?: string; status: TestRunStatus}
>;

/**
Expand All @@ -36,7 +36,7 @@ export const renderTestRunButton = ({
class="test-button test-button_status_${status}"
data-runhash="${runHash}"
role="tab"
${renderAttributes(locator({status}))}
${renderAttributes(locator({mainParams, status}))}
>
<span class="test-button__order" ${renderAttributes(locator.order())}>#${index + 1}</span>
<span class="test-button__name" ${renderAttributes(
Expand Down

0 comments on commit 4ccef1c

Please sign in to comment.