|
1 | 1 | const batch = require('../lib/batch');
|
2 | 2 | const request = require('../lib/request');
|
| 3 | +const TestUtils = require('../lib/TestUtils'); |
3 | 4 |
|
4 | 5 | const originalURL = '/parse/batch';
|
5 | 6 | const serverURL = 'http://localhost:1234/parse';
|
@@ -70,9 +71,9 @@ describe('batch', () => {
|
70 | 71 |
|
71 | 72 | it('should handle a batch request without transaction', done => {
|
72 | 73 | let calls = 0;
|
73 |
| - Parse.Cloud.beforeSave('MyObject', ({ config }) => { |
| 74 | + Parse.Cloud.beforeSave('MyObject', ({ database }) => { |
74 | 75 | calls++;
|
75 |
| - expect(config.database._transactionalSession).toEqual(null); |
| 76 | + expect(database._transactionalSession).toEqual(null); |
76 | 77 | });
|
77 | 78 |
|
78 | 79 | request({
|
@@ -113,9 +114,9 @@ describe('batch', () => {
|
113 | 114 |
|
114 | 115 | it('should handle a batch request with transaction = false', done => {
|
115 | 116 | let calls = 0;
|
116 |
| - Parse.Cloud.beforeSave('MyObject', ({ config }) => { |
| 117 | + Parse.Cloud.beforeSave('MyObject', ({ database }) => { |
117 | 118 | calls++;
|
118 |
| - expect(config.database._transactionalSession).toEqual(null); |
| 119 | + expect(database._transactionalSession).toEqual(null); |
119 | 120 | });
|
120 | 121 |
|
121 | 122 | request({
|
@@ -155,184 +156,214 @@ describe('batch', () => {
|
155 | 156 | });
|
156 | 157 | });
|
157 | 158 |
|
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 |
| - |
173 |
| - request({ |
174 |
| - method: 'POST', |
175 |
| - headers: headers, |
176 |
| - url: 'http://localhost:8378/1/batch', |
177 |
| - body: JSON.stringify({ |
178 |
| - requests: [ |
179 |
| - { |
180 |
| - method: 'POST', |
181 |
| - path: '/1/classes/MyObject', |
182 |
| - body: { key: 'value1' }, |
183 |
| - }, |
184 |
| - { |
185 |
| - method: 'POST', |
186 |
| - path: '/1/classes/MyObject', |
187 |
| - body: { key: 'value2' }, |
188 |
| - }, |
189 |
| - ], |
190 |
| - transaction: true, |
191 |
| - }), |
192 |
| - }).then(response => { |
193 |
| - expect(response.data.length).toEqual(2); |
194 |
| - expect(response.data[0].success.objectId).toBeDefined(); |
195 |
| - expect(response.data[0].success.createdAt).toBeDefined(); |
196 |
| - expect(response.data[1].success.objectId).toBeDefined(); |
197 |
| - expect(response.data[1].success.createdAt).toBeDefined(); |
198 |
| - const query = new Parse.Query('MyObject'); |
199 |
| - query.find().then(results => { |
200 |
| - expect(calls).toBe(2); |
201 |
| - expect(results.map(result => result.get('key')).sort()).toEqual([ |
202 |
| - 'value1', |
203 |
| - 'value2', |
204 |
| - ]); |
205 |
| - done(); |
| 159 | + if (process.env.PARSE_SERVER_TEST_DATABASE_URI_TRANSACTIONS) { |
| 160 | + describe('transactions', () => { |
| 161 | + beforeAll(async () => { |
| 162 | + await reconfigureServer({ |
| 163 | + databaseAdapter: undefined, |
| 164 | + databaseURI: process.env.PARSE_SERVER_TEST_DATABASE_URI_TRANSACTIONS, |
| 165 | + }); |
206 | 166 | });
|
207 |
| - }); |
208 |
| - }); |
209 | 167 |
|
210 |
| - it('should generate separate session for each call', done => { |
211 |
| - let myObjectCalls = 0; |
212 |
| - let myObjectTransactionalSession = null; |
| 168 | + beforeEach(async () => { |
| 169 | + await TestUtils.destroyAllDataPermanently(true); |
| 170 | + }); |
213 | 171 |
|
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 |
| - } |
| 172 | + it('should handle a batch request with transaction = true', done => { |
| 173 | + let calls = 0; |
| 174 | + let transactionalSession = null; |
| 175 | + Parse.Cloud.beforeSave('MyObject', ({ database }) => { |
| 176 | + calls++; |
| 177 | + expect(database._transactionalSession).not.toEqual(null); |
| 178 | + if (transactionalSession) { |
| 179 | + expect(database._transactionalSession).toBe(transactionalSession); |
| 180 | + } else { |
| 181 | + transactionalSession = database._transactionalSession; |
| 182 | + } |
| 183 | + }); |
224 | 184 |
|
225 |
| - if (myObjectCalls === 1) { |
226 |
| - return request({ |
| 185 | + request({ |
227 | 186 | method: 'POST',
|
228 | 187 | headers: headers,
|
229 | 188 | url: 'http://localhost:8378/1/batch',
|
230 | 189 | body: JSON.stringify({
|
231 | 190 | requests: [
|
232 | 191 | {
|
233 | 192 | method: 'POST',
|
234 |
| - path: '/1/classes/MyObject2', |
| 193 | + path: '/1/classes/MyObject', |
235 | 194 | body: { key: 'value1' },
|
236 | 195 | },
|
237 | 196 | {
|
238 | 197 | method: 'POST',
|
239 |
| - path: '/1/classes/MyObject2', |
| 198 | + path: '/1/classes/MyObject', |
240 | 199 | body: { key: 'value2' },
|
241 | 200 | },
|
242 | 201 | ],
|
243 | 202 | transaction: true,
|
244 | 203 | }),
|
245 |
| - }).then(() => Promise.resolve()); |
246 |
| - } |
247 |
| - }); |
| 204 | + }).then(response => { |
| 205 | + expect(response.data.length).toEqual(2); |
| 206 | + expect(response.data[0].success.objectId).toBeDefined(); |
| 207 | + expect(response.data[0].success.createdAt).toBeDefined(); |
| 208 | + expect(response.data[1].success.objectId).toBeDefined(); |
| 209 | + expect(response.data[1].success.createdAt).toBeDefined(); |
| 210 | + const query = new Parse.Query('MyObject'); |
| 211 | + query.find().then(results => { |
| 212 | + expect(calls).toBe(2); |
| 213 | + expect(results.map(result => result.get('key')).sort()).toEqual([ |
| 214 | + 'value1', |
| 215 | + 'value2', |
| 216 | + ]); |
| 217 | + done(); |
| 218 | + }); |
| 219 | + }); |
| 220 | + }); |
| 221 | + |
| 222 | + it('should generate separate session for each call', done => { |
| 223 | + let myObjectCalls = 0; |
| 224 | + //let myObjectTransactionalSession = null; |
| 225 | + |
| 226 | + Parse.Cloud.afterSave('MyObject', () => { |
| 227 | + console.log(1); |
| 228 | + }); |
| 229 | + Parse.Cloud.afterSave('MyObject2', () => { |
| 230 | + console.log(2); |
| 231 | + }); |
| 232 | + Parse.Cloud.afterSave('MyObject3', () => { |
| 233 | + console.log(3); |
| 234 | + }); |
248 | 235 |
|
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 |
| - } |
| 236 | + Parse.Cloud.beforeSave('MyObject', (/*{ database }*/) => { |
| 237 | + myObjectCalls++; |
| 238 | + // expect(database._transactionalSession).not.toEqual(null); |
| 239 | + // if (myObjectTransactionalSession) { |
| 240 | + // expect(database._transactionalSession).toBe( |
| 241 | + // myObjectTransactionalSession |
| 242 | + // ); |
| 243 | + // } else { |
| 244 | + // myObjectTransactionalSession = |
| 245 | + // database._transactionalSession; |
| 246 | + // } |
261 | 247 |
|
262 |
| - if (myObject2Calls === 1) { |
263 |
| - return request({ |
| 248 | + if (myObjectCalls === 1) { |
| 249 | + return request({ |
| 250 | + method: 'POST', |
| 251 | + headers: headers, |
| 252 | + url: 'http://localhost:8378/1/batch', |
| 253 | + body: JSON.stringify({ |
| 254 | + requests: [ |
| 255 | + { |
| 256 | + method: 'POST', |
| 257 | + path: '/1/classes/MyObject2', |
| 258 | + body: { key: 'value1' }, |
| 259 | + }, |
| 260 | + { |
| 261 | + method: 'POST', |
| 262 | + path: '/1/classes/MyObject2', |
| 263 | + body: { key: 'value2' }, |
| 264 | + }, |
| 265 | + ], |
| 266 | + transaction: false, |
| 267 | + }), |
| 268 | + }).then(response => { |
| 269 | + console.log(response.data[0].error); |
| 270 | + return Promise.resolve(); |
| 271 | + }); |
| 272 | + } |
| 273 | + }); |
| 274 | + |
| 275 | + let myObject2Calls = 0; |
| 276 | + //let myObject2TransactionalSession = null; |
| 277 | + Parse.Cloud.beforeSave('MyObject2', (/*{ database }*/) => { |
| 278 | + myObject2Calls++; |
| 279 | + // expect(database._transactionalSession).not.toEqual(null); |
| 280 | + // if (myObject2TransactionalSession) { |
| 281 | + // expect(database._transactionalSession).toBe( |
| 282 | + // myObject2TransactionalSession |
| 283 | + // ); |
| 284 | + // } else { |
| 285 | + // myObject2TransactionalSession = |
| 286 | + // database._transactionalSession; |
| 287 | + // } |
| 288 | + if (myObject2Calls === 1) { |
| 289 | + return request({ |
| 290 | + method: 'POST', |
| 291 | + headers: headers, |
| 292 | + url: 'http://localhost:8378/1/batch', |
| 293 | + body: JSON.stringify({ |
| 294 | + requests: [ |
| 295 | + { |
| 296 | + method: 'POST', |
| 297 | + path: '/1/classes/MyObject3', |
| 298 | + body: { key: 'value1' }, |
| 299 | + }, |
| 300 | + { |
| 301 | + method: 'POST', |
| 302 | + path: '/1/classes/MyObject3', |
| 303 | + body: { key: 'value2' }, |
| 304 | + }, |
| 305 | + ], |
| 306 | + }), |
| 307 | + }).then(response => { |
| 308 | + console.log(response.data); |
| 309 | + return Promise.resolve(); |
| 310 | + }); |
| 311 | + } |
| 312 | + }); |
| 313 | + |
| 314 | + let myObject3Calls = 0; |
| 315 | + Parse.Cloud.beforeSave('MyObject3', ({ database }) => { |
| 316 | + myObject3Calls++; |
| 317 | + expect(database._transactionalSession).toEqual(null); |
| 318 | + }); |
| 319 | + |
| 320 | + request({ |
264 | 321 | method: 'POST',
|
265 | 322 | headers: headers,
|
266 | 323 | url: 'http://localhost:8378/1/batch',
|
267 | 324 | body: JSON.stringify({
|
268 | 325 | requests: [
|
269 | 326 | {
|
270 | 327 | method: 'POST',
|
271 |
| - path: '/1/classes/MyObject3', |
| 328 | + path: '/1/classes/MyObject', |
272 | 329 | body: { key: 'value1' },
|
273 | 330 | },
|
274 | 331 | {
|
275 | 332 | method: 'POST',
|
276 |
| - path: '/1/classes/MyObject3', |
| 333 | + path: '/1/classes/MyObject', |
277 | 334 | body: { key: 'value2' },
|
278 | 335 | },
|
279 | 336 | ],
|
| 337 | + transaction: true, |
280 | 338 | }),
|
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'); |
| 339 | + }).then(response => { |
| 340 | + console.log(response.data); |
| 341 | + const query = new Parse.Query('MyObject'); |
326 | 342 | query.find().then(results => {
|
327 |
| - expect(myObject3Calls).toBe(2); |
| 343 | + expect(myObjectCalls).toBe(2); |
328 | 344 | expect(results.map(result => result.get('key')).sort()).toEqual([
|
329 | 345 | 'value1',
|
330 | 346 | 'value2',
|
331 | 347 | ]);
|
332 |
| - done(); |
| 348 | + const query = new Parse.Query('MyObject2'); |
| 349 | + query.find().then(results => { |
| 350 | + expect(myObject2Calls).toBe(2); |
| 351 | + expect(results.map(result => result.get('key')).sort()).toEqual([ |
| 352 | + 'value1', |
| 353 | + 'value2', |
| 354 | + ]); |
| 355 | + const query = new Parse.Query('MyObject3'); |
| 356 | + query.find().then(results => { |
| 357 | + expect(myObject3Calls).toBe(2); |
| 358 | + expect(results.map(result => result.get('key')).sort()).toEqual( |
| 359 | + ['value1', 'value2'] |
| 360 | + ); |
| 361 | + done(); |
| 362 | + }); |
| 363 | + }); |
333 | 364 | });
|
334 | 365 | });
|
335 | 366 | });
|
336 | 367 | });
|
337 |
| - }); |
| 368 | + } |
338 | 369 | });
|
0 commit comments