From 5841b629894bbcf30b4051e8b45f9d6ea3b10744 Mon Sep 17 00:00:00 2001 From: Grex Date: Tue, 22 Jul 2025 09:37:56 -0800 Subject: [PATCH 1/2] feat: add `ignoreCommonAssetRequests` option --- src/index.ts | 13 ++++++++++++- tests/requests.test.ts | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8945845..f64634a 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 ?? false, 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..915bd49 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 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') + }) + + const testIgnoreAssets = testBase.extend({ + network: createNetworkFixture({ ignoreCommonAssetRequests: true }), + }) + + testIgnoreAssets('passes through 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') + }) + + \ No newline at end of file From 5db518574c5b3f57e5f13fa298ac3e6efc98a340 Mon Sep 17 00:00:00 2001 From: Grex Date: Thu, 31 Jul 2025 08:39:11 -0800 Subject: [PATCH 2/2] chore: update `interceptCommonAssetRequests` default value based on feedback --- src/index.ts | 2 +- tests/requests.test.ts | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/index.ts b/src/index.ts index f64634a..e1b44f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -59,7 +59,7 @@ export function createNetworkFixture( async ({ page }, use) => { const worker = new NetworkFixture({ page, - ignoreCommonAssetRequests: args?.ignoreCommonAssetRequests ?? false, + ignoreCommonAssetRequests: args?.ignoreCommonAssetRequests ?? true, initialHandlers: args?.initialHandlers || [], }) diff --git a/tests/requests.test.ts b/tests/requests.test.ts index 915bd49..0804f35 100644 --- a/tests/requests.test.ts +++ b/tests/requests.test.ts @@ -108,7 +108,7 @@ test('intercepts a POST request with array buffer body', async ({ await expect(request.text()).resolves.toBe('hello world') }) -test('intercepts an asset request when interceptCommonAssetRequests is false', async ({ network, page }) => { +test('intercepts an asset request when interceptCommonAssetRequests is true', async ({ network, page }) => { network.use( http.get('/index.html', () => { return HttpResponse.text('NOT VALID HTML') @@ -121,27 +121,27 @@ test('intercepts an asset request when interceptCommonAssetRequests is false', a return res.text() }) - expect(htmlContent).toContain('NOT VALID HTML') + expect(htmlContent).toContain('DOCTYPE html') }) - - const testIgnoreAssets = testBase.extend({ - network: createNetworkFixture({ ignoreCommonAssetRequests: true }), + + const testMockAssets = testBase.extend({ + network: createNetworkFixture({ ignoreCommonAssetRequests: false }), }) - - testIgnoreAssets('passes through an asset request when interceptCommonAssetRequests is true', async ({ network, page }) => { + + 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('DOCTYPE html') + + expect(htmlContent).toContain('NOT VALID HTML') }) \ No newline at end of file