diff --git a/package.json b/package.json index a56279e..46ae471 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,11 @@ ] }, "scripts": { - "build": "yarn workspaces foreach run build", + "build": "yarn workspaces foreach --all run build", "deploy": "monodeploy --config-file monodeploy.config.js", "format": "prettier --write .", "lint": "eslint \"**/{src,tests}/**/*\"", - "test": "yarn workspaces foreach run test", + "test": "yarn workspaces foreach --all run test", "postinstall": "husky install" }, "devDependencies": { diff --git a/packages/example/public/config.json b/packages/example/public/config.json new file mode 100644 index 0000000..6db90bc --- /dev/null +++ b/packages/example/public/config.json @@ -0,0 +1,3 @@ +{ + "title": "real title" +} diff --git a/packages/example/src/App.tsx b/packages/example/src/App.tsx index 1382993..5c504ca 100644 --- a/packages/example/src/App.tsx +++ b/packages/example/src/App.tsx @@ -8,6 +8,7 @@ import { UsersList } from './components/users-list'; import { SettingsForm } from './components/settings-form'; import { Documents } from './components/documents'; import { Search } from './components/search'; +import { ConfigTitle } from './components/config-title'; const queryClient = new QueryClient(); const apolloClient = new ApolloClient({ @@ -21,6 +22,7 @@ const App: FC = () => { + } /> } /> } /> } /> diff --git a/packages/example/src/components/config-title.tsx b/packages/example/src/components/config-title.tsx new file mode 100644 index 0000000..6b01160 --- /dev/null +++ b/packages/example/src/components/config-title.tsx @@ -0,0 +1,17 @@ +import { FC, useEffect, useState } from 'react'; + +export const ConfigTitle: FC = () => { + const [title, setTitle] = useState('Loading title'); + + useEffect(() => { + const fetchData = async (): Promise => { + const response = await fetch('/config.json'); + const data = await response.json(); + setTitle(data.title); + }; + + void fetchData(); + }, []); + + return

{title}

; +}; diff --git a/packages/example/src/mocks/handlers.ts b/packages/example/src/mocks/handlers.ts index b35f267..e105b9e 100644 --- a/packages/example/src/mocks/handlers.ts +++ b/packages/example/src/mocks/handlers.ts @@ -3,6 +3,7 @@ import searchHandlers from './handlers/search'; import sessionHandlers from './handlers/session'; import usersHandlers from './handlers/users'; import settingsHandlers from './handlers/settings'; +import configHandlers from './handlers/config'; export default [ ...documentsHandlers, @@ -10,4 +11,5 @@ export default [ ...sessionHandlers, ...usersHandlers, ...settingsHandlers, + ...configHandlers, ]; diff --git a/packages/example/src/mocks/handlers/config.ts b/packages/example/src/mocks/handlers/config.ts new file mode 100644 index 0000000..cffc471 --- /dev/null +++ b/packages/example/src/mocks/handlers/config.ts @@ -0,0 +1,7 @@ +import { HttpResponse, http } from 'msw'; + +export default [ + http.get('/config.json', () => + HttpResponse.json({ title: 'mocked title' }, { status: 200 }), + ), +]; diff --git a/packages/example/tests/playwright/specs/passthrough.spec.ts b/packages/example/tests/playwright/specs/passthrough.spec.ts new file mode 100644 index 0000000..5d8b37a --- /dev/null +++ b/packages/example/tests/playwright/specs/passthrough.spec.ts @@ -0,0 +1,40 @@ +import { HttpResponse, http, passthrough } from 'msw'; +import { test } from '../test'; + +test.describe('passthrough', () => { + test('should show a custom mocked title if overridden', async ({ + worker, + page, + }) => { + await worker.use( + http.get('/config.json', () => + HttpResponse.json({ title: 'title overridden' }, { status: 200 }), + ), + ); + await page.goto('/config-title'); + await page.waitForSelector('text=title overridden'); + }); + + test('should show mocked title if not overridden', async ({ page }) => { + await page.goto('/config-title'); + await page.waitForSelector('text=mocked title'); + }); + + test('should show real title when passthrough is used', async ({ + worker, + page, + }) => { + await worker.use(http.get('/config.json', () => passthrough())); + await page.goto('/config-title'); + await page.waitForSelector('text=real title'); + }); + + test('should show real title when passthrough is used for a wildcard', async ({ + worker, + page, + }) => { + await worker.use(http.get('/*onfig.json', () => passthrough())); + await page.goto('/config-title'); + await page.waitForSelector('text=real title'); + }); +}); diff --git a/packages/playwright-msw/src/handler.ts b/packages/playwright-msw/src/handler.ts index d5eb283..f05564c 100644 --- a/packages/playwright-msw/src/handler.ts +++ b/packages/playwright-msw/src/handler.ts @@ -36,6 +36,7 @@ export const handleRoute = async (route: Route, handlers: RequestHandler[]) => { */ baseUrl: url.origin, }, + onPassthroughResponse: () => route.continue(), onMockedResponse: async ({ status, headers: rawHeaders,