-
-
Notifications
You must be signed in to change notification settings - Fork 503
/
resetHandlers.test.ts
125 lines (105 loc) · 3.49 KB
/
resetHandlers.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import * as path from 'path'
import { rest } from 'msw'
import { runBrowserWith } from '../../support/runBrowserWith'
import { SetupWorkerApi } from '../../../src/setupWorker/setupWorker'
declare namespace window {
// Annotate global references to the worker and rest request handlers.
export const msw: {
worker: SetupWorkerApi
rest: typeof rest
}
}
function createRuntime() {
return runBrowserWith(path.resolve(__dirname, 'use.mocks.ts'))
}
test('removes all runtime request handlers when resetting without explicit next handlers', async () => {
const runtime = await createRuntime()
await runtime.page.evaluate(() => {
const { msw } = window
// Add a request handler on runtime
msw.worker.use(
msw.rest.post('/login', (req, res, ctx) => {
return res(ctx.json({ accepted: true }))
}),
)
})
// Request handlers added on runtime affect the network communication.
const loginResponse = await runtime.request({
url: `${runtime.origin}/login`,
fetchOptions: {
method: 'POST',
},
})
const loginStatus = loginResponse.status()
const loginBody = await loginResponse.json()
expect(loginStatus).toBe(200)
expect(loginBody).toEqual({ accepted: true })
// Reset request handlers to initial handlers.
await runtime.page.evaluate(() => {
const { msw } = window
msw.worker.resetHandlers()
})
// Any runtime request handlers are removed upon reset.
const secondLoginResponse = await runtime.request({
url: `${runtime.origin}/login`,
fetchOptions: {
method: 'POST',
},
})
const secondLoginStatus = secondLoginResponse.status()
expect(secondLoginStatus).toBe(404)
// Initial request handlers (given to `setupWorker`) are not affected.
const bookResponse = await runtime.request({
url: `${runtime.origin}/book/abc-123`,
})
const bookStatus = bookResponse.status()
const bookBody = await bookResponse.json()
expect(bookStatus).toBe(200)
expect(bookBody).toEqual({ title: 'Original title' })
await runtime.cleanup()
})
test('replaces all handlers with the explicit next runtime handlers upon reset', async () => {
const runtime = await createRuntime()
// Add a runtime request handler.
await runtime.page.evaluate(() => {
const { msw } = window
msw.worker.use(
msw.rest.post('/login', (req, res, ctx) => {
return res(ctx.json({ accepted: true }))
}),
)
})
// Reset request handlers with explicit next handlers.
await runtime.page.evaluate(() => {
const { msw } = window
msw.worker.resetHandlers(
msw.rest.get('/products', (req, res, ctx) => {
return res(ctx.json([1, 2, 3]))
}),
)
})
// Any runtime request handlers must be removed.
const loginResponse = await runtime.request({
url: `${runtime.origin}/login`,
fetchOptions: {
method: 'POST',
},
})
const secondLoginStatus = loginResponse.status()
expect(secondLoginStatus).toBe(404)
// Any initial request handler must be removed.
const bookResponse = await runtime.request({
url: `${runtime.origin}/book/abc-123`,
})
const bookStatus = bookResponse.status()
expect(bookStatus).toEqual(404)
// Should leave only explicit reset request handlers.
const productsResponse = await runtime.request({
url: `${runtime.origin}/products`,
})
const productsStatus = productsResponse.status()
const productsBody = await productsResponse.json()
expect(productsStatus).toBe(200)
expect(productsBody).toEqual([1, 2, 3])
await runtime.cleanup()
})