Skip to content

Commit

Permalink
FI-1638 feat: add optional prepare step to waitForNewTab action
Browse files Browse the repository at this point in the history
  • Loading branch information
uid11 committed Jan 27, 2025
1 parent 1c34f86 commit de555e1
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
19 changes: 19 additions & 0 deletions autotests/tests/internalTypeTests/waitForEvents.skip.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {AddUser, GetUser} from 'autotests/routes/apiRoutes';
import {
waitForNewTab,
waitForRequest,
waitForRequestToRoute,
waitForResponse,
Expand Down Expand Up @@ -86,3 +87,21 @@ void waitForResponseToRoute(AddUser, ({delay}, {responseBody, request: {requestB

// @ts-expect-error: waitForResponseToRoute does not accept routes without `getParamsFromUrlOrThrow` method
void waitForResponseToRoute(GetUser);

// ok
void waitForNewTab();

// ok
void waitForNewTab({timeout: 2_000});

// ok
void waitForNewTab(() => Promise.resolve());

// ok
void waitForNewTab(() => {});

// ok
void waitForNewTab(() => Promise.resolve(), {timeout: 1_000});

// @ts-expect-error: waitForNewTab does not accept options as first argument
void waitForNewTab({timeout: 1_000}, () => {});
19 changes: 15 additions & 4 deletions src/actions/waitFor/waitForNewTab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,31 @@ import {getFullPackConfig} from '../../utils/config';
import {getDurationWithUnits} from '../../utils/getDurationWithUnits';
import {log} from '../../utils/log';

import type {InternalTab, Tab, UtcTimeInMs} from '../../types/internal';
import type {AsyncVoid, InternalTab, Tab, UtcTimeInMs} from '../../types/internal';

type Options = Readonly<{
timeout?: number;
}>;

type WaitForNewTab = ((prepare: () => AsyncVoid, options?: Options) => Promise<Tab>) &
((options?: Options) => Promise<Tab>);

/**
* Waits for opening of new tab and returns this tab.
*/
export const waitForNewTab = async (options?: Options): Promise<Tab> => {
export const waitForNewTab = (async (
prepareOrOptions: Options | (() => AsyncVoid),
options?: Options,
): Promise<Tab> => {
const startTimeInMs = Date.now() as UtcTimeInMs;

const context = getPlaywrightPage().context();
const timeout = options?.timeout ?? getFullPackConfig().navigationTimeout;
const prepare = typeof prepareOrOptions === 'function' ? prepareOrOptions : undefined;
const finalOptions = typeof prepareOrOptions === 'function' ? options : prepareOrOptions;

const timeout = finalOptions?.timeout ?? getFullPackConfig().navigationTimeout;

await prepare?.();

const page = await context.waitForEvent('page', {timeout});

Expand All @@ -36,4 +47,4 @@ export const waitForNewTab = async (options?: Options): Promise<Tab> => {
);

return newTab as Tab;
};
}) as WaitForNewTab;

0 comments on commit de555e1

Please sign in to comment.