diff --git a/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts b/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts index b9895459dc..3cd6a19918 100644 --- a/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts @@ -18,7 +18,7 @@ import { MockingProxy } from '../mockingProxy'; import type { RootDispatcher } from './dispatcher'; import { Dispatcher, existingDispatcher } from './dispatcher'; import type * as channels from '@protocol/channels'; -import { APIRequestContextDispatcher, RequestDispatcher, RouteDispatcher } from './networkDispatchers'; +import { APIRequestContextDispatcher, RequestDispatcher, ResponseDispatcher, RouteDispatcher } from './networkDispatchers'; import type { Request, Route } from '../network'; import { urlMatches } from '../../utils/isomorphic/urlMatch'; @@ -43,6 +43,20 @@ export class MockingProxyDispatcher extends Dispatcher { this._dispatchEvent('request', { request: RequestDispatcher.from(this as any, request), correlation }); }); + this.addObjectListener(MockingProxy.Events.RequestFailed, (request: Request) => { + this._dispatchEvent('requestFailed', { + request: RequestDispatcher.from(this as any, request), + failureText: request._failureText ?? undefined, + responseEndTiming: request._responseEndTiming, + }); + }); + this.addObjectListener(MockingProxy.Events.RequestFinished, (request: Request) => { + this._dispatchEvent('requestFinished', { + request: RequestDispatcher.from(this as any, request), + response: ResponseDispatcher.fromNullable(this as any, request._existingResponse()), + responseEndTiming: request._responseEndTiming, + }); + }); } async setInterceptionPatterns(params: channels.MockingProxySetInterceptionPatternsParams, metadata?: CallMetadata): Promise { diff --git a/packages/playwright-core/src/server/mockingProxy.ts b/packages/playwright-core/src/server/mockingProxy.ts index 6a59f2bff5..dfcd9dc538 100644 --- a/packages/playwright-core/src/server/mockingProxy.ts +++ b/packages/playwright-core/src/server/mockingProxy.ts @@ -170,7 +170,7 @@ export class MockingProxy extends SdkObject implements RequestContext { response.setTransferSize(transferSize); response.setEncodedBodySize(encodedBodySize); response.setResponseHeadersSize(transferSize - encodedBodySize); - this.emit(MockingProxy.Events.RequestFinished, { request, response }); + this.emit(MockingProxy.Events.RequestFinished, request); resolve(); } catch (error) { request._setFailureText('' + error); diff --git a/tests/playwright-test/playwright.mockingproxy.spec.ts b/tests/playwright-test/playwright.mockingproxy.spec.ts index 7ec80d672a..adb235ff4c 100644 --- a/tests/playwright-test/playwright.mockingproxy.spec.ts +++ b/tests/playwright-test/playwright.mockingproxy.spec.ts @@ -134,11 +134,9 @@ test('all properties are populated', async ({ runInlineTest, server, request }) expect(await response.headersArray()).toContainEqual({ name: 'foo', value: 'bar' }); expect(await response.body()).toEqual(Buffer.from('fallback')); - // TODO: implement, this currently blocks because requestFinished isn't emitted - // expect(await response.finished()).toBe(null); + expect(await response.finished()).toBe(null); expect(request.serviceWorker()).toBe(null); expect(request.frame()).not.toBe(null); - expect(response.frame()).not.toBe(null); expect(request.failure()).toBe(null); expect(request.isNavigationRequest()).toBe(false);