Skip to content

Commit 00da9ca

Browse files
authoredDec 6, 2024··
fix(setupServer): reapply interception after calling server.listen() after server.close() (#2383)
1 parent e8d748e commit 00da9ca

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed
 

‎src/node/SetupServerCommonApi.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ export class SetupServerCommonApi
4848
})
4949

5050
this.resolvedOptions = {} as RequiredDeep<SharedOptions>
51-
52-
this.init()
5351
}
5452

5553
/**
@@ -141,7 +139,10 @@ export class SetupServerCommonApi
141139
) as RequiredDeep<SharedOptions>
142140

143141
// Apply the interceptor when starting the server.
142+
// Attach the event listeners to the interceptor here
143+
// so they get re-attached whenever `.listen()` is called.
144144
this.interceptor.apply()
145+
this.init()
145146
this.subscriptions.push(() => this.interceptor.dispose())
146147

147148
// Apply the WebSocket interception.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* @see https://github.com/mswjs/msw/issues/2370
3+
*/
4+
// @vitest-environment node
5+
import { http, HttpResponse } from 'msw'
6+
import { setupServer } from 'msw/node'
7+
import { HttpServer } from '@open-draft/test-server/http'
8+
9+
const server = setupServer()
10+
11+
const httpServer = new HttpServer((app) => {
12+
app.get('/resource', (_req, res) => {
13+
res.send('original')
14+
})
15+
})
16+
17+
beforeAll(async () => {
18+
server.listen()
19+
await httpServer.listen()
20+
})
21+
22+
afterEach(() => {
23+
server.resetHandlers()
24+
})
25+
26+
afterAll(async () => {
27+
server.close()
28+
await httpServer.close()
29+
})
30+
31+
it('intercepts a request once `server.listen()` is called after `server.close()`', async () => {
32+
const requestUrl = httpServer.http.url('/resource')
33+
34+
server.use(
35+
http.get(requestUrl, () => {
36+
return HttpResponse.text('mocked')
37+
}),
38+
)
39+
40+
// Must respond with a mocked response while MSW is active.
41+
{
42+
const response = await fetch(requestUrl)
43+
await expect(response.text()).resolves.toBe('mocked')
44+
}
45+
46+
server.close()
47+
48+
// Must respond with the original response once MSW is closed.
49+
{
50+
const response = await fetch(requestUrl)
51+
await expect(response.text()).resolves.toBe('original')
52+
}
53+
54+
server.listen()
55+
56+
// Must respond with the mocked response once MSW is active again.
57+
{
58+
const response = await fetch(requestUrl)
59+
await expect(response.text()).resolves.toBe('mocked')
60+
}
61+
})

0 commit comments

Comments
 (0)
Please sign in to comment.