|
1 | | -/* eslint-disable @typescript-eslint/no-empty-object-type */ |
| 1 | +/* eslint-disable no-empty-pattern */ |
2 | 2 |
|
3 | 3 | import { test as base, expect } from '@playwright/test'; |
4 | 4 |
|
| 5 | +import { LoginPage } from '../pages/auth/login.page'; |
| 6 | +import { SubjectDataTablePage } from '../pages/datahub/subject-data-table.page'; |
5 | 7 | import { SetupPage } from '../pages/setup.page'; |
6 | 8 |
|
| 9 | +import type { NavigateVariadicArgs, ProjectMetadata, RouteTo } from './types'; |
| 10 | + |
| 11 | +type PageModels = typeof pageModels; |
| 12 | + |
7 | 13 | 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]>>; |
9 | 18 | }; |
10 | 19 |
|
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 | + ] |
17 | 48 | }); |
18 | 49 |
|
19 | 50 | export { expect }; |
0 commit comments