Skip to content

Commit 87036e3

Browse files
committed
update types and fixtures
1 parent bb8b8b6 commit 87036e3

2 files changed

Lines changed: 69 additions & 8 deletions

File tree

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,50 @@
1-
/* eslint-disable @typescript-eslint/no-empty-object-type */
1+
/* eslint-disable no-empty-pattern */
22

33
import { test as base, expect } from '@playwright/test';
44

5+
import { LoginPage } from '../pages/auth/login.page';
6+
import { SubjectDataTablePage } from '../pages/datahub/subject-data-table.page';
57
import { SetupPage } from '../pages/setup.page';
68

9+
import type { NavigateVariadicArgs, ProjectMetadata, RouteTo } from './types';
10+
11+
type PageModels = typeof pageModels;
12+
713
type TestArgs = {
8-
setupPage: SetupPage;
14+
getPageModel: <TKey extends Extract<keyof PageModels, RouteTo>>(
15+
key: TKey,
16+
...args: NavigateVariadicArgs<TKey>
17+
) => Promise<InstanceType<PageModels[TKey]>>;
918
};
1019

11-
export const test = base.extend<TestArgs, {}>({
12-
setupPage: async ({ page }, use) => {
13-
const setupPage = new SetupPage(page);
14-
await setupPage.goto();
15-
return use(setupPage);
16-
}
20+
type WorkerArgs = {
21+
getProjectMetadata: <TKey extends Extract<keyof ProjectMetadata, string>>(key: TKey) => ProjectMetadata[TKey];
22+
};
23+
24+
const pageModels = {
25+
'/auth/login': LoginPage,
26+
'/datahub/$subjectId/table': SubjectDataTablePage,
27+
'/setup': SetupPage
28+
} satisfies { [K in RouteTo]?: any };
29+
30+
export const test = base.extend<TestArgs, WorkerArgs>({
31+
getPageModel: ({ page }, use) => {
32+
return use(
33+
async <TKey extends Extract<keyof PageModels, RouteTo>>(key: TKey, ...args: NavigateVariadicArgs<TKey>) => {
34+
const pageModel = new pageModels[key](page) as InstanceType<PageModels[TKey]>;
35+
await pageModel.goto(key, ...args);
36+
return pageModel;
37+
}
38+
);
39+
},
40+
getProjectMetadata: [
41+
async ({}, use, workerInfo) => {
42+
return use((key) => {
43+
return (workerInfo.project.metadata as ProjectMetadata)[key];
44+
});
45+
},
46+
{ scope: 'worker' }
47+
]
1748
});
1849

1950
export { expect };

testing/e2e/src/helpers/types.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/* eslint-disable @typescript-eslint/no-namespace */
22
/* eslint-disable @typescript-eslint/consistent-type-definitions */
33

4+
import type { IfEmptyObject, IfNever, Split } from 'type-fest';
5+
46
declare global {
57
namespace NodeJS {
68
interface ProcessEnv {
@@ -13,6 +15,34 @@ declare global {
1315

1416
export type BrowserTarget = 'Desktop Chrome' | 'Desktop Firefox' | 'Desktop Safari';
1517

18+
export type ExtractParams<TPath extends string> = Split<TPath, '/'>[number] extends infer TUnion
19+
? TUnion extends `$${infer TParam}`
20+
? TParam
21+
: never
22+
: never;
23+
24+
export type NavigateVariadicArgs<TPath extends RouteTo> = IfNever<
25+
ExtractParams<TPath>,
26+
[],
27+
[params: RouteParams<TPath>]
28+
>;
29+
30+
export type NavigateArgs<TPath extends RouteTo> = [to: TPath, ...NavigateVariadicArgs<TPath>];
31+
1632
export type ProjectMetadata = {
1733
browserTarget: BrowserTarget;
1834
};
35+
36+
// export type RouteTo = import('../../../../apps/web/src/route-tree.ts').FileRouteTypes['to'];
37+
38+
export type RouteTo = string;
39+
40+
export type RouteParams<TPath extends RouteTo> = {
41+
[K in ExtractParams<TPath>]: number | string;
42+
} extends infer TParams
43+
? IfEmptyObject<TParams, void, TParams>
44+
: never;
45+
46+
export type TestDataMap<T> = {
47+
[K in BrowserTarget]: T;
48+
};

0 commit comments

Comments
 (0)