1
1
// @vitest -environment node
2
- import { http , HttpResponse , SetupApi , LifeCycleEventsMap } from 'msw'
2
+ import { http , HttpResponse } from 'msw'
3
3
import { setupRemoteServer } from 'msw/node'
4
- import { DeferredPromise } from '@open-draft/deferred-promise'
5
4
import { HttpServer } from '@open-draft/test-server/http'
5
+ import { spyOnLifeCycleEvents } from '../../utils'
6
6
import { spawnTestApp } from './utils'
7
7
8
8
const remote = setupRemoteServer ( )
@@ -13,63 +13,6 @@ const httpServer = new HttpServer((app) => {
13
13
} )
14
14
} )
15
15
16
- function spyOnLifeCycleEvents ( setupApi : SetupApi < LifeCycleEventsMap > ) {
17
- const listener = vi . fn ( )
18
- const requestIdPromise = new DeferredPromise < string > ( )
19
-
20
- setupApi . events
21
- . on ( 'request:start' , ( { request, requestId } ) => {
22
- if ( request . headers . has ( 'upgrade' ) ) {
23
- return
24
- }
25
-
26
- requestIdPromise . resolve ( requestId )
27
- listener ( `[request:start] ${ request . method } ${ request . url } ${ requestId } ` )
28
- } )
29
- . on ( 'request:match' , ( { request, requestId } ) => {
30
- listener ( `[request:match] ${ request . method } ${ request . url } ${ requestId } ` )
31
- } )
32
- . on ( 'request:unhandled' , ( { request, requestId } ) => {
33
- listener (
34
- `[request:unhandled] ${ request . method } ${ request . url } ${ requestId } ` ,
35
- )
36
- } )
37
- . on ( 'request:end' , ( { request, requestId } ) => {
38
- if ( request . headers . has ( 'upgrade' ) ) {
39
- return
40
- }
41
-
42
- listener ( `[request:end] ${ request . method } ${ request . url } ${ requestId } ` )
43
- } )
44
-
45
- setupApi . events
46
- . on ( 'response:mocked' , async ( { response, request, requestId } ) => {
47
- listener (
48
- `[response:mocked] ${ request . method } ${ request . url } ${ requestId } ${
49
- response . status
50
- } ${ await response . clone ( ) . text ( ) } `,
51
- )
52
- } )
53
- . on ( 'response:bypass' , async ( { response, request, requestId } ) => {
54
- if ( request . headers . has ( 'upgrade' ) ) {
55
- return
56
- }
57
-
58
- listener (
59
- `[response:bypass] ${ request . method } ${ request . url } ${ requestId } ${
60
- response . status
61
- } ${ await response . clone ( ) . text ( ) } `,
62
- )
63
- } )
64
-
65
- return {
66
- listener,
67
- waitForRequestId ( ) {
68
- return requestIdPromise
69
- } ,
70
- }
71
- }
72
-
73
16
beforeAll ( async ( ) => {
74
17
await remote . listen ( )
75
18
await httpServer . listen ( )
90
33
)
91
34
92
35
await using testApp = await spawnTestApp ( require . resolve ( './use.app.js' ) )
93
- const { listener, waitForRequestId } = spyOnLifeCycleEvents ( remote )
36
+ const { listener, requestIdPromise } = spyOnLifeCycleEvents ( remote )
94
37
95
38
const response = await fetch ( new URL ( '/resource' , testApp . url ) )
96
- const requestId = await waitForRequestId ( )
39
+ const requestId = await requestIdPromise
97
40
98
41
// Must respond with the mocked response defined in the test.
99
42
expect ( response . status ) . toBe ( 200 )
100
43
expect ( response . statusText ) . toBe ( 'OK' )
101
- expect ( await response . json ( ) ) . toEqual ( { mocked : true } )
44
+ await expect ( response . json ( ) ) . resolves . toEqual ( { mocked : true } )
102
45
103
46
// Must forward the life-cycle events to the test process.
104
47
await vi . waitFor ( ( ) => {
118
61
'emits correct events for the request handled in the remote process' ,
119
62
remote . boundary ( async ( ) => {
120
63
await using testApp = await spawnTestApp ( require . resolve ( './use.app.js' ) )
121
- const { listener, waitForRequestId } = spyOnLifeCycleEvents ( remote )
64
+ const { listener, requestIdPromise } = spyOnLifeCycleEvents ( remote )
122
65
123
66
const response = await fetch ( new URL ( '/resource' , testApp . url ) )
124
- const requestId = await waitForRequestId ( )
67
+ const requestId = await requestIdPromise
125
68
126
69
expect ( response . status ) . toBe ( 200 )
127
70
expect ( response . statusText ) . toBe ( 'OK' )
128
- expect ( await response . json ( ) ) . toEqual ( [ 1 , 2 , 3 ] )
71
+ await expect ( response . json ( ) ) . resolves . toEqual ( [ 1 , 2 , 3 ] )
129
72
130
73
await vi . waitFor ( ( ) => {
131
74
expect ( listener . mock . calls ) . toEqual ( [
144
87
'emits correct events for the request unhandled by either parties' ,
145
88
remote . boundary ( async ( ) => {
146
89
await using testApp = await spawnTestApp ( require . resolve ( './use.app.js' ) )
147
- const { listener, waitForRequestId } = spyOnLifeCycleEvents ( remote )
90
+ const { listener, requestIdPromise } = spyOnLifeCycleEvents ( remote )
148
91
149
92
const resourceUrl = httpServer . http . url ( '/greeting' )
150
93
// Request a special route in the running app that performs a proxy request
151
94
// to the resource specified in the "Location" request header.
152
95
const response = await fetch ( new URL ( '/proxy' , testApp . url ) , {
153
96
headers : {
154
- Location : resourceUrl ,
97
+ location : resourceUrl ,
155
98
} ,
156
99
} )
157
- const requestId = await waitForRequestId ( )
100
+ const requestId = await requestIdPromise
158
101
159
102
expect ( response . status ) . toBe ( 200 )
160
103
expect ( response . statusText ) . toBe ( 'OK' )
0 commit comments