@@ -178,83 +178,102 @@ describe('batch', () => {
178
178
} ) ;
179
179
180
180
it ( 'should handle a batch request with transaction = true' , done => {
181
- spyOn ( databaseAdapter , 'createObject' ) . and . callThrough ( ) ;
181
+ const myObject = new Parse . Object ( 'MyObject' ) ; // This is important because transaction only works on pre-existing collections
182
+ myObject
183
+ . save ( )
184
+ . then ( ( ) => {
185
+ return myObject . destroy ( ) ;
186
+ } )
187
+ . then ( ( ) => {
188
+ spyOn ( databaseAdapter , 'createObject' ) . and . callThrough ( ) ;
182
189
183
- request ( {
184
- method : 'POST' ,
185
- headers : headers ,
186
- url : 'http://localhost:8378/1/batch' ,
187
- body : JSON . stringify ( {
188
- requests : [
189
- {
190
- method : 'POST' ,
191
- path : '/1/classes/MyObject' ,
192
- body : { key : 'value1' } ,
193
- } ,
194
- {
195
- method : 'POST' ,
196
- path : '/1/classes/MyObject' ,
197
- body : { key : 'value2' } ,
198
- } ,
199
- ] ,
200
- transaction : true ,
201
- } ) ,
202
- } ) . then ( response => {
203
- expect ( response . data . length ) . toEqual ( 2 ) ;
204
- expect ( response . data [ 0 ] . success . objectId ) . toBeDefined ( ) ;
205
- expect ( response . data [ 0 ] . success . createdAt ) . toBeDefined ( ) ;
206
- expect ( response . data [ 1 ] . success . objectId ) . toBeDefined ( ) ;
207
- expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
208
- const query = new Parse . Query ( 'MyObject' ) ;
209
- query . find ( ) . then ( results => {
210
- expect ( databaseAdapter . createObject . calls . count ( ) ) . toBe ( 2 ) ;
211
- expect ( databaseAdapter . createObject . calls . argsFor ( 0 ) [ 3 ] ) . toBe (
212
- databaseAdapter . createObject . calls . argsFor ( 1 ) [ 3 ]
213
- ) ;
214
- expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
215
- 'value1' ,
216
- 'value2' ,
217
- ] ) ;
218
- done ( ) ;
190
+ request ( {
191
+ method : 'POST' ,
192
+ headers : headers ,
193
+ url : 'http://localhost:8378/1/batch' ,
194
+ body : JSON . stringify ( {
195
+ requests : [
196
+ {
197
+ method : 'POST' ,
198
+ path : '/1/classes/MyObject' ,
199
+ body : { key : 'value1' } ,
200
+ } ,
201
+ {
202
+ method : 'POST' ,
203
+ path : '/1/classes/MyObject' ,
204
+ body : { key : 'value2' } ,
205
+ } ,
206
+ ] ,
207
+ transaction : true ,
208
+ } ) ,
209
+ } ) . then ( response => {
210
+ expect ( response . data . length ) . toEqual ( 2 ) ;
211
+ expect ( response . data [ 0 ] . success . objectId ) . toBeDefined ( ) ;
212
+ expect ( response . data [ 0 ] . success . createdAt ) . toBeDefined ( ) ;
213
+ expect ( response . data [ 1 ] . success . objectId ) . toBeDefined ( ) ;
214
+ expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
215
+ const query = new Parse . Query ( 'MyObject' ) ;
216
+ query . find ( ) . then ( results => {
217
+ expect ( databaseAdapter . createObject . calls . count ( ) ) . toBe ( 2 ) ;
218
+ expect ( databaseAdapter . createObject . calls . argsFor ( 0 ) [ 3 ] ) . toBe (
219
+ databaseAdapter . createObject . calls . argsFor ( 1 ) [ 3 ]
220
+ ) ;
221
+ expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual (
222
+ [ 'value1' , 'value2' ]
223
+ ) ;
224
+ done ( ) ;
225
+ } ) ;
226
+ } ) ;
219
227
} ) ;
220
- } ) ;
221
228
} ) ;
222
229
223
230
it ( 'should not save anything when one operation fails in a transaction' , done => {
224
- request ( {
225
- method : 'POST' ,
226
- headers : headers ,
227
- url : 'http://localhost:8378/1/batch' ,
228
- body : JSON . stringify ( {
229
- requests : [
230
- {
231
- method : 'POST' ,
232
- path : '/1/classes/MyObject' ,
233
- body : { key : 'value1' } ,
234
- } ,
235
- {
236
- method : 'POST' ,
237
- path : '/1/classes/MyObject' ,
238
- body : { key : 10 } ,
239
- } ,
240
- ] ,
241
- transaction : true ,
242
- } ) ,
243
- } ) . catch ( error => {
244
- expect ( error . data ) . toBeDefined ( ) ;
245
- const query = new Parse . Query ( 'MyObject' ) ;
246
- query . find ( ) . then ( results => {
247
- expect ( results . length ) . toBe ( 0 ) ;
248
- done ( ) ;
231
+ const myObject = new Parse . Object ( 'MyObject' ) ; // This is important because transaction only works on pre-existing collections
232
+ myObject
233
+ . save ( )
234
+ . then ( ( ) => {
235
+ return myObject . destroy ( ) ;
236
+ } )
237
+ . then ( ( ) => {
238
+ request ( {
239
+ method : 'POST' ,
240
+ headers : headers ,
241
+ url : 'http://localhost:8378/1/batch' ,
242
+ body : JSON . stringify ( {
243
+ requests : [
244
+ {
245
+ method : 'POST' ,
246
+ path : '/1/classes/MyObject' ,
247
+ body : { key : 'value1' } ,
248
+ } ,
249
+ {
250
+ method : 'POST' ,
251
+ path : '/1/classes/MyObject' ,
252
+ body : { key : 10 } ,
253
+ } ,
254
+ ] ,
255
+ transaction : true ,
256
+ } ) ,
257
+ } ) . catch ( error => {
258
+ expect ( error . data ) . toBeDefined ( ) ;
259
+ const query = new Parse . Query ( 'MyObject' ) ;
260
+ query . find ( ) . then ( results => {
261
+ expect ( results . length ) . toBe ( 0 ) ;
262
+ done ( ) ;
263
+ } ) ;
264
+ } ) ;
249
265
} ) ;
250
- } ) ;
251
266
} ) ;
252
267
253
- xit ( 'should generate separate session for each call' , async ( ) => {
254
- const myObject = new Parse . Object ( 'MyObject2 ' ) ; // This is important because transaction only works on pre-existing collections
268
+ it ( 'should generate separate session for each call' , async ( ) => {
269
+ const myObject = new Parse . Object ( 'MyObject ' ) ; // This is important because transaction only works on pre-existing collections
255
270
await myObject . save ( ) ;
256
271
await myObject . destroy ( ) ;
257
272
273
+ const myObject2 = new Parse . Object ( 'MyObject2' ) ; // This is important because transaction only works on pre-existing collections
274
+ await myObject2 . save ( ) ;
275
+ await myObject2 . destroy ( ) ;
276
+
258
277
spyOn ( databaseAdapter , 'createObject' ) . and . callThrough ( ) ;
259
278
260
279
let myObjectCalls = 0 ;
@@ -289,32 +308,6 @@ describe('batch', () => {
289
308
}
290
309
} ) ;
291
310
292
- let myObject2Calls = 0 ;
293
- Parse . Cloud . beforeSave ( 'MyObject2' , async ( ) => {
294
- myObject2Calls ++ ;
295
- if ( myObject2Calls === 2 ) {
296
- await request ( {
297
- method : 'POST' ,
298
- headers : headers ,
299
- url : 'http://localhost:8378/1/batch' ,
300
- body : JSON . stringify ( {
301
- requests : [
302
- {
303
- method : 'POST' ,
304
- path : '/1/classes/MyObject3' ,
305
- body : { key : 'value1' } ,
306
- } ,
307
- {
308
- method : 'POST' ,
309
- path : '/1/classes/MyObject3' ,
310
- body : { key : 'value2' } ,
311
- } ,
312
- ] ,
313
- } ) ,
314
- } ) ;
315
- }
316
- } ) ;
317
-
318
311
const response = await request ( {
319
312
method : 'POST' ,
320
313
headers : headers ,
@@ -342,6 +335,26 @@ describe('batch', () => {
342
335
expect ( response . data [ 1 ] . success . objectId ) . toBeDefined ( ) ;
343
336
expect ( response . data [ 1 ] . success . createdAt ) . toBeDefined ( ) ;
344
337
338
+ await request ( {
339
+ method : 'POST' ,
340
+ headers : headers ,
341
+ url : 'http://localhost:8378/1/batch' ,
342
+ body : JSON . stringify ( {
343
+ requests : [
344
+ {
345
+ method : 'POST' ,
346
+ path : '/1/classes/MyObject3' ,
347
+ body : { key : 'value1' } ,
348
+ } ,
349
+ {
350
+ method : 'POST' ,
351
+ path : '/1/classes/MyObject3' ,
352
+ body : { key : 'value2' } ,
353
+ } ,
354
+ ] ,
355
+ } ) ,
356
+ } ) ;
357
+
345
358
const query = new Parse . Query ( 'MyObject' ) ;
346
359
const results = await query . find ( ) ;
347
360
expect ( results . map ( result => result . get ( 'key' ) ) . sort ( ) ) . toEqual ( [
0 commit comments