diff --git a/src/index.ts b/src/index.ts index 8945845..e1b44f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ import { RequestHandler, WebSocketHandler, getResponse, + isCommonAssetRequest, } from 'msw' import { type WebSocketClientEventMap, @@ -24,7 +25,8 @@ import { } from '@mswjs/interceptors/WebSocket' export interface CreateNetworkFixtureArgs { - initialHandlers: Array + ignoreCommonAssetRequests?: boolean + initialHandlers?: Array } /** @@ -57,6 +59,7 @@ export function createNetworkFixture( async ({ page }, use) => { const worker = new NetworkFixture({ page, + ignoreCommonAssetRequests: args?.ignoreCommonAssetRequests ?? true, initialHandlers: args?.initialHandlers || [], }) @@ -70,13 +73,16 @@ export function createNetworkFixture( export class NetworkFixture extends SetupApi { #page: Page + #ignoreCommonAssetRequests: boolean constructor(args: { page: Page + ignoreCommonAssetRequests: boolean initialHandlers: Array }) { super(...args.initialHandlers) this.#page = args.page + this.#ignoreCommonAssetRequests = args.ignoreCommonAssetRequests } public async start() { @@ -88,6 +94,11 @@ export class NetworkFixture extends SetupApi { body: request.postDataBuffer(), }) + if (this.#ignoreCommonAssetRequests && isCommonAssetRequest(fetchRequest)) { + route.continue() + return + } + const response = await getResponse( this.handlersController.currentHandlers().filter((handler) => { return handler instanceof RequestHandler diff --git a/tests/requests.test.ts b/tests/requests.test.ts index 38489a2..0804f35 100644 --- a/tests/requests.test.ts +++ b/tests/requests.test.ts @@ -1,5 +1,5 @@ import { test as testBase, expect } from '@playwright/test' -import { http } from 'msw' +import { http, HttpResponse } from 'msw' import { createNetworkFixture, type NetworkFixture } from '../src/index.js' interface Fixtures { @@ -107,3 +107,41 @@ test('intercepts a POST request with array buffer body', async ({ expect(request.url).toBe('http://localhost:5173/action') await expect(request.text()).resolves.toBe('hello world') }) + +test('intercepts an asset request when interceptCommonAssetRequests is true', async ({ network, page }) => { + network.use( + http.get('/index.html', () => { + return HttpResponse.text('NOT VALID HTML') + }), + ) + + await page.goto('/') + const htmlContent = await page.evaluate(async () => { + const res = await fetch('/index.html') + return res.text() + }) + + expect(htmlContent).toContain('DOCTYPE html') + }) + + const testMockAssets = testBase.extend({ + network: createNetworkFixture({ ignoreCommonAssetRequests: false }), + }) + + testMockAssets('passes through an asset request when interceptCommonAssetRequests is false', async ({ network, page }) => { + network.use( + http.get('/index.html', () => { + return HttpResponse.text('NOT VALID HTML') + }), + ) + + await page.goto('/') + const htmlContent = await page.evaluate(async () => { + const res = await fetch('/index.html') + return res.text() + }) + + expect(htmlContent).toContain('NOT VALID HTML') + }) + + \ No newline at end of file