102 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/* eslint-disable react-hooks/rules-of-hooks */
 | 
						|
import { test as playwrightTestFn } from '@playwright/test'
 | 
						|
 | 
						|
import type { Fixtures } from '@e2e/playwright/fixtures/fixtureSetup'
 | 
						|
import {
 | 
						|
  ElectronZoo,
 | 
						|
  fixturesBasedOnProcessEnvPlatform,
 | 
						|
} from '@e2e/playwright/fixtures/fixtureSetup'
 | 
						|
 | 
						|
export { expect } from '@playwright/test'
 | 
						|
 | 
						|
declare module '@playwright/test' {
 | 
						|
  interface BrowserContext {
 | 
						|
    folderSetupFn: (
 | 
						|
      cb: (dir: string) => Promise<void>
 | 
						|
    ) => Promise<{ dir: string }>
 | 
						|
  }
 | 
						|
  interface Page {
 | 
						|
    dir: string
 | 
						|
    setBodyDimensions: (dims: {
 | 
						|
      width: number
 | 
						|
      height: number
 | 
						|
    }) => Promise<void>
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Each worker spawns a new thread, which will spawn its own ElectronZoo.
 | 
						|
// So in some sense there is an implicit pool.
 | 
						|
// For example, the variable just beneath this text is reused many times
 | 
						|
// *for one worker*.
 | 
						|
const electronZooInstance = new ElectronZoo()
 | 
						|
 | 
						|
// Track whether this is the first run for this worker process
 | 
						|
// Mac needs more time for the first window creation
 | 
						|
let isFirstRun = true
 | 
						|
 | 
						|
// Our custom decorated Zoo test object. Makes it easier to add fixtures, and
 | 
						|
// switch between web and electron if needed.
 | 
						|
const playwrightTestFnWithFixtures_ = playwrightTestFn.extend<{
 | 
						|
  tronApp?: ElectronZoo
 | 
						|
}>({
 | 
						|
  tronApp: [
 | 
						|
    async ({}, use, testInfo) => {
 | 
						|
      if (process.env.TARGET === 'web') {
 | 
						|
        await use(undefined)
 | 
						|
        return
 | 
						|
      }
 | 
						|
 | 
						|
      // Create a single timeout for the entire tronApp setup process
 | 
						|
      // This will ensure tests fail faster if there's an issue with setup
 | 
						|
      // instead of waiting for the full global timeout (120s)
 | 
						|
      // First runs need more time especially on Mac for window creation
 | 
						|
      const setupTimeout = isFirstRun ? 120_000 : 30_000
 | 
						|
      let timeoutId: NodeJS.Timeout | undefined
 | 
						|
 | 
						|
      const setupPromise = new Promise<void>((resolve, reject) => {
 | 
						|
        timeoutId = setTimeout(() => {
 | 
						|
          reject(
 | 
						|
            new Error(
 | 
						|
              `tronApp setup timed out after ${setupTimeout}ms${isFirstRun ? ' (first run)' : ' (subsequent run)'}`
 | 
						|
            )
 | 
						|
          )
 | 
						|
        }, setupTimeout)
 | 
						|
 | 
						|
        // Execute the async setup in a separate function
 | 
						|
        const doSetup = async () => {
 | 
						|
          try {
 | 
						|
            await electronZooInstance.createInstanceIfMissing(testInfo)
 | 
						|
            resolve()
 | 
						|
          } catch (error) {
 | 
						|
            reject(error)
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
        // Start the setup process
 | 
						|
        void doSetup()
 | 
						|
      })
 | 
						|
 | 
						|
      try {
 | 
						|
        await setupPromise
 | 
						|
        if (timeoutId) clearTimeout(timeoutId)
 | 
						|
 | 
						|
        // First run is complete at this point
 | 
						|
        isFirstRun = false
 | 
						|
 | 
						|
        await use(electronZooInstance)
 | 
						|
        await electronZooInstance.makeAvailableAgain()
 | 
						|
      } catch (error) {
 | 
						|
        if (timeoutId) clearTimeout(timeoutId)
 | 
						|
        throw error
 | 
						|
      }
 | 
						|
    },
 | 
						|
    { timeout: 120_000 }, // Keep the global timeout as fallback
 | 
						|
  ],
 | 
						|
})
 | 
						|
 | 
						|
const test = playwrightTestFnWithFixtures_.extend<Fixtures>(
 | 
						|
  fixturesBasedOnProcessEnvPlatform
 | 
						|
)
 | 
						|
 | 
						|
export { test }
 |