You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
| import { Page, test } from '@playwright/test';
 | |
| import { beforeAllClean, forceCloseAllWindows } from './beforeEach';
 | |
| import { openApp } from './open';
 | |
| 
 | |
| // This is not ideal, most of our test needs to open a specific number of windows and close them once the test is done or failed.
 | |
| // This file contains a bunch of utility function to use to open those windows and clean them afterwards.
 | |
| // Note: those function only keep track (and close) the windows they open. If you open a new window or need to close and reopen an existing one, this won't take of it.
 | |
| 
 | |
| type Tuple<T, N extends number> = N extends N
 | |
|   ? number extends N
 | |
|     ? T[]
 | |
|     : _TupleOf<T, N, []>
 | |
|   : never;
 | |
| type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N
 | |
|   ? R
 | |
|   : _TupleOf<T, N, [T, ...R]>;
 | |
| 
 | |
| type CountWindows = 1 | 2 | 3 | 4 | 5;
 | |
| 
 | |
| function sessionTest<T extends CountWindows, N extends Tuple<Page, T>>(
 | |
|   testName: string,
 | |
|   testCallback: (windows: N) => Promise<void>,
 | |
|   count: T
 | |
| ) {
 | |
|   return test(testName, async () => {
 | |
|     beforeAllClean();
 | |
|     const windows = await openApp(count);
 | |
| 
 | |
|     try {
 | |
|       if (windows.length !== count) {
 | |
|         throw new Error(`openApp should have opened ${count} windows but did not.`);
 | |
|       }
 | |
|       await testCallback(windows as N);
 | |
|     } catch (e) {
 | |
|       throw e;
 | |
|     } finally {
 | |
|       try {
 | |
|         await forceCloseAllWindows(windows);
 | |
|       } catch (e) {
 | |
|         console.error(`forceCloseAllWindows of ${testName} failed with: `, e);
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| export function sessionTestOneWindow(
 | |
|   testName: string,
 | |
|   testCallback: (windows: Tuple<Page, 1>) => Promise<void>
 | |
| ) {
 | |
|   return sessionTest(testName, testCallback, 1);
 | |
| }
 | |
| 
 | |
| export function sessionTestTwoWindows(
 | |
|   testName: string,
 | |
|   testCallback: ([windowA, windowB]: [Page, Page]) => Promise<void>
 | |
| ) {
 | |
|   return sessionTest(testName, testCallback, 2);
 | |
| }
 | |
| 
 | |
| export function sessionTestThreeWindows(
 | |
|   testName: string,
 | |
|   testCallback: ([windowA, windowB, windowC]: [Page, Page, Page]) => Promise<void>
 | |
| ) {
 | |
|   return sessionTest(testName, testCallback, 3);
 | |
| }
 | |
| 
 | |
| export function sessionTestFourWindows(
 | |
|   testName: string,
 | |
|   testCallback: ([windowA, windowB, windowC, windowD]: [Page, Page, Page, Page]) => Promise<void>
 | |
| ) {
 | |
|   return sessionTest(testName, testCallback, 4);
 | |
| }
 | |
| 
 | |
| export function sessionTestFiveWindows(
 | |
|   testName: string,
 | |
|   testCallback: ([windowA, windowB, windowC, windowD]: [Page, Page, Page, Page, Page]) => Promise<
 | |
|     void
 | |
|   >
 | |
| ) {
 | |
|   return sessionTest(testName, testCallback, 5);
 | |
| }
 |