diff --git a/src/index.ts b/src/index.ts index 8945845..a09c854 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,8 @@ import type { Page, PlaywrightTestArgs, PlaywrightWorkerArgs, + Request, + Route, TestFixture, WebSocketRoute, } from '@playwright/test' @@ -50,9 +52,9 @@ export function createNetworkFixture( args?: CreateNetworkFixtureArgs, /** @todo `onUnhandledRequest`? */ ): [ - TestFixture, - { auto: boolean }, -] { + TestFixture, + { auto: boolean }, + ] { return [ async ({ page }, use) => { const worker = new NetworkFixture({ @@ -77,44 +79,51 @@ export class NetworkFixture extends SetupApi { }) { super(...args.initialHandlers) this.#page = args.page + } - public async start() { - // Handle HTTP requests. - await this.#page.route(/.+/, async (route, request) => { - const fetchRequest = new Request(request.url(), { - method: request.method(), - headers: new Headers(await request.allHeaders()), - body: request.postDataBuffer(), - }) + async httpHandler(route: Route, request: Request) { + const fetchRequest = new Request(request.url(), { + method: request.method(), + headers: new Headers(await request.allHeaders()), + body: request.postDataBuffer(), + }) - const response = await getResponse( - this.handlersController.currentHandlers().filter((handler) => { - return handler instanceof RequestHandler - }), - fetchRequest, - { - baseUrl: this.getPageUrl(), - }, - ) - - if (response) { - if (response.status === 0) { - route.abort() - return - } - - route.fulfill({ - status: response.status, - headers: Object.fromEntries(response.headers), - body: response.body - ? Buffer.from(await response.arrayBuffer()) - : undefined, - }) + const response = await getResponse( + this.handlersController.currentHandlers().filter((handler) => { + return handler instanceof RequestHandler + }), + fetchRequest, + { + baseUrl: this.getPageUrl(), + }, + ) + + if (response) { + if (response.status === 0) { + route.abort() return } - route.continue() + route.fulfill({ + status: response.status, + headers: Object.fromEntries(response.headers), + body: response.body + ? Buffer.from(await response.arrayBuffer()) + : undefined, + }) + return + } + + route.continue() + } + + public async start() { + // Handle HTTP requests. + await this.#page.route(/.+/, this.httpHandler) + + this.subscriptions.push(async () => { + await this.#page.unroute(/.+/, this.httpHandler) }) // Handle WebSocket connections. @@ -160,8 +169,7 @@ export class NetworkFixture extends SetupApi { } class PlaywrightWebSocketClientConnection - implements WebSocketClientConnectionProtocol -{ + implements WebSocketClientConnectionProtocol { public id: string public url: URL @@ -264,8 +272,7 @@ class PlaywrightWebSocketClientConnection } class PlaywrightWebSocketServerConnection - implements WebSocketServerConnectionProtocol -{ + implements WebSocketServerConnectionProtocol { #server?: WebSocketRoute #bufferedEvents: Array< Parameters