@@ -2,7 +2,7 @@ const fastify = require('fastify')
2
2
const { fastifyRequestContextPlugin } = require ( '../lib/requestContextPlugin' )
3
3
const { TestService } = require ( './internal/testService' )
4
4
5
- function initApp ( endpoint ) {
5
+ function initAppGet ( endpoint ) {
6
6
const app = fastify ( { logger : true } )
7
7
app . register ( fastifyRequestContextPlugin )
8
8
@@ -11,13 +11,22 @@ function initApp(endpoint) {
11
11
return app . ready ( )
12
12
}
13
13
14
+ function initAppPost ( endpoint ) {
15
+ const app = fastify ( { logger : true } )
16
+ app . register ( fastifyRequestContextPlugin )
17
+
18
+ app . post ( '/' , endpoint )
19
+
20
+ return app . ready ( )
21
+ }
22
+
14
23
describe ( 'requestContextPlugin' , ( ) => {
15
24
let app
16
25
afterEach ( ( ) => {
17
26
return app . close ( )
18
27
} )
19
28
20
- it ( 'correctly preserves values within single request' , ( ) => {
29
+ it ( 'correctly preserves values within single GET request' , ( ) => {
21
30
expect . assertions ( 2 )
22
31
23
32
let testService
@@ -50,7 +59,7 @@ describe('requestContextPlugin', () => {
50
59
}
51
60
}
52
61
53
- initApp ( route ) . then ( ( _app ) => {
62
+ initAppGet ( route ) . then ( ( _app ) => {
54
63
app = _app
55
64
testService = new TestService ( app )
56
65
const response1Promise = app
@@ -89,4 +98,77 @@ describe('requestContextPlugin', () => {
89
98
return promiseRequest2
90
99
} )
91
100
} )
101
+
102
+ it ( 'correctly preserves values within single POST request' , ( ) => {
103
+ expect . assertions ( 2 )
104
+
105
+ let testService
106
+ let responseCounter = 0
107
+ return new Promise ( ( resolveResponsePromise ) => {
108
+ const promiseRequest2 = new Promise ( ( resolveRequest2Promise ) => {
109
+ const promiseRequest1 = new Promise ( ( resolveRequest1Promise ) => {
110
+ const route = ( req , reply ) => {
111
+ function prepareReply ( ) {
112
+ testService . processRequest ( requestId ) . then ( ( ) => {
113
+ const storedValue = req . requestContext . get ( 'testKey' )
114
+ reply . status ( 204 ) . send ( {
115
+ storedValue,
116
+ } )
117
+ } )
118
+ }
119
+
120
+ const requestId = Number . parseInt ( req . body . requestId )
121
+ req . requestContext . set ( 'testKey' , `testValue${ requestId } ` )
122
+
123
+ // We don't want to read values until both requests wrote their values to see if there is a racing condition
124
+ if ( requestId === 1 ) {
125
+ resolveRequest1Promise ( )
126
+ return promiseRequest2 . then ( prepareReply )
127
+ }
128
+
129
+ if ( requestId === 2 ) {
130
+ resolveRequest2Promise ( )
131
+ return promiseRequest1 . then ( prepareReply )
132
+ }
133
+ }
134
+
135
+ initAppPost ( route ) . then ( ( _app ) => {
136
+ app = _app
137
+ testService = new TestService ( app )
138
+ const response1Promise = app
139
+ . inject ( )
140
+ . post ( '/' )
141
+ . body ( { requestId : 1 } )
142
+ . end ( )
143
+ . then ( ( response ) => {
144
+ expect ( response . json ( ) . storedValue ) . toBe ( 'testValue1' )
145
+ responseCounter ++
146
+ if ( responseCounter === 2 ) {
147
+ resolveResponsePromise ( )
148
+ }
149
+ } )
150
+
151
+ const response2Promise = app
152
+ . inject ( )
153
+ . post ( '/' )
154
+ . body ( { requestId : 2 } )
155
+ . end ( )
156
+ . then ( ( response ) => {
157
+ expect ( response . json ( ) . storedValue ) . toBe ( 'testValue2' )
158
+ responseCounter ++
159
+ if ( responseCounter === 2 ) {
160
+ resolveResponsePromise ( )
161
+ }
162
+ } )
163
+
164
+ return Promise . all ( [ response1Promise , response2Promise ] )
165
+ } )
166
+ } )
167
+
168
+ return promiseRequest1
169
+ } )
170
+
171
+ return promiseRequest2
172
+ } )
173
+ } )
92
174
} )
0 commit comments