@@ -69,6 +69,12 @@ describe('batch', () => {
69
69
} ) ;
70
70
71
71
it ( 'should handle a batch request without transaction' , done => {
72
+ let calls = 0 ;
73
+ Parse . Cloud . beforeSave ( 'MyObject' , ( { config } ) => {
74
+ calls ++ ;
75
+ expect ( config . database . _transactionalSession ) . toEqual ( null ) ;
76
+ } ) ;
77
+
72
78
request ( {
73
79
method : 'POST' ,
74
80
headers : headers ,
@@ -95,6 +101,7 @@ describe('batch', () => {
95
101
expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
96
102
const query = new Parse . Query ( 'MyObject' ) ;
97
103
query . find ( ) . then ( results => {
104
+ expect ( calls ) . toBe ( 2 ) ;
98
105
expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
99
106
'value1' ,
100
107
'value2' ,
@@ -105,6 +112,12 @@ describe('batch', () => {
105
112
} ) ;
106
113
107
114
it ( 'should handle a batch request with transaction = false' , done => {
115
+ let calls = 0 ;
116
+ Parse . Cloud . beforeSave ( 'MyObject' , ( { config } ) => {
117
+ calls ++ ;
118
+ expect ( config . database . _transactionalSession ) . toEqual ( null ) ;
119
+ } ) ;
120
+
108
121
request ( {
109
122
method : 'POST' ,
110
123
headers : headers ,
@@ -132,6 +145,7 @@ describe('batch', () => {
132
145
expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
133
146
const query = new Parse . Query ( 'MyObject' ) ;
134
147
query . find ( ) . then ( results => {
148
+ expect ( calls ) . toBe ( 2 ) ;
135
149
expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
136
150
'value1' ,
137
151
'value2' ,
@@ -142,6 +156,20 @@ describe('batch', () => {
142
156
} ) ;
143
157
144
158
it ( 'should handle a batch request with transaction = true' , done => {
159
+ let calls = 0 ;
160
+ let transactionalSession = null ;
161
+ Parse . Cloud . beforeSave ( 'MyObject' , ( { config } ) => {
162
+ calls ++ ;
163
+ expect ( config . database . _transactionalSession ) . not . toEqual ( null ) ;
164
+ if ( transactionalSession ) {
165
+ expect ( config . database . _transactionalSession ) . toBe (
166
+ transactionalSession
167
+ ) ;
168
+ } else {
169
+ transactionalSession = config . database . _transactionalSession ;
170
+ }
171
+ } ) ;
172
+
145
173
request ( {
146
174
method : 'POST' ,
147
175
headers : headers ,
@@ -169,6 +197,7 @@ describe('batch', () => {
169
197
expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
170
198
const query = new Parse . Query ( 'MyObject' ) ;
171
199
query . find ( ) . then ( results => {
200
+ expect ( calls ) . toBe ( 2 ) ;
172
201
expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
173
202
'value1' ,
174
203
'value2' ,
@@ -177,4 +206,133 @@ describe('batch', () => {
177
206
} ) ;
178
207
} ) ;
179
208
} ) ;
209
+
210
+ it ( 'should generate separate session for each call' , done => {
211
+ let myObjectCalls = 0 ;
212
+ let myObjectTransactionalSession = null ;
213
+
214
+ Parse . Cloud . beforeSave ( 'MyObject' , ( { config } ) => {
215
+ myObjectCalls ++ ;
216
+ expect ( config . database . _transactionalSession ) . not . toEqual ( null ) ;
217
+ if ( myObjectTransactionalSession ) {
218
+ expect ( config . database . _transactionalSession ) . toBe (
219
+ myObjectTransactionalSession
220
+ ) ;
221
+ } else {
222
+ myObjectTransactionalSession = config . database . _transactionalSession ;
223
+ }
224
+
225
+ if ( myObjectCalls === 1 ) {
226
+ return request ( {
227
+ method : 'POST' ,
228
+ headers : headers ,
229
+ url : 'http://localhost:8378/1/batch' ,
230
+ body : JSON . stringify ( {
231
+ requests : [
232
+ {
233
+ method : 'POST' ,
234
+ path : '/1/classes/MyObject2' ,
235
+ body : { key : 'value1' } ,
236
+ } ,
237
+ {
238
+ method : 'POST' ,
239
+ path : '/1/classes/MyObject2' ,
240
+ body : { key : 'value2' } ,
241
+ } ,
242
+ ] ,
243
+ transaction : true ,
244
+ } ) ,
245
+ } ) . then ( ( ) => Promise . resolve ( ) ) ;
246
+ }
247
+ } ) ;
248
+
249
+ let myObject2Calls = 0 ;
250
+ let myObject2TransactionalSession = null ;
251
+ Parse . Cloud . beforeSave ( 'MyObject2' , ( { config } ) => {
252
+ myObject2Calls ++ ;
253
+ expect ( config . database . _transactionalSession ) . not . toEqual ( null ) ;
254
+ if ( myObject2TransactionalSession ) {
255
+ expect ( config . database . _transactionalSession ) . toBe (
256
+ myObject2TransactionalSession
257
+ ) ;
258
+ } else {
259
+ myObject2TransactionalSession = config . database . _transactionalSession ;
260
+ }
261
+
262
+ if ( myObject2Calls === 1 ) {
263
+ return request ( {
264
+ method : 'POST' ,
265
+ headers : headers ,
266
+ url : 'http://localhost:8378/1/batch' ,
267
+ body : JSON . stringify ( {
268
+ requests : [
269
+ {
270
+ method : 'POST' ,
271
+ path : '/1/classes/MyObject3' ,
272
+ body : { key : 'value1' } ,
273
+ } ,
274
+ {
275
+ method : 'POST' ,
276
+ path : '/1/classes/MyObject3' ,
277
+ body : { key : 'value2' } ,
278
+ } ,
279
+ ] ,
280
+ } ) ,
281
+ } ) . then ( ( ) => Promise . resolve ( ) ) ;
282
+ }
283
+ } ) ;
284
+
285
+ let myObject3Calls = 0 ;
286
+ Parse . Cloud . beforeSave ( 'MyObject3' , ( { config } ) => {
287
+ myObject3Calls ++ ;
288
+ expect ( config . database . _transactionalSession ) . toEqual ( null ) ;
289
+ } ) ;
290
+
291
+ request ( {
292
+ method : 'POST' ,
293
+ headers : headers ,
294
+ url : 'http://localhost:8378/1/batch' ,
295
+ body : JSON . stringify ( {
296
+ requests : [
297
+ {
298
+ method : 'POST' ,
299
+ path : '/1/classes/MyObject' ,
300
+ body : { key : 'value1' } ,
301
+ } ,
302
+ {
303
+ method : 'POST' ,
304
+ path : '/1/classes/MyObject' ,
305
+ body : { key : 'value2' } ,
306
+ } ,
307
+ ] ,
308
+ transaction : true ,
309
+ } ) ,
310
+ } ) . then ( ( ) => {
311
+ const query = new Parse . Query ( 'MyObject' ) ;
312
+ query . find ( ) . then ( results => {
313
+ expect ( myObjectCalls ) . toBe ( 2 ) ;
314
+ expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
315
+ 'value1' ,
316
+ 'value2' ,
317
+ ] ) ;
318
+ const query = new Parse . Query ( 'MyObject2' ) ;
319
+ query . find ( ) . then ( results => {
320
+ expect ( myObject2Calls ) . toBe ( 2 ) ;
321
+ expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
322
+ 'value1' ,
323
+ 'value2' ,
324
+ ] ) ;
325
+ const query = new Parse . Query ( 'MyObject3' ) ;
326
+ query . find ( ) . then ( results => {
327
+ expect ( myObject3Calls ) . toBe ( 2 ) ;
328
+ expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
329
+ 'value1' ,
330
+ 'value2' ,
331
+ ] ) ;
332
+ done ( ) ;
333
+ } ) ;
334
+ } ) ;
335
+ } ) ;
336
+ } ) ;
337
+ } ) ;
180
338
} ) ;
0 commit comments