Skip to content

Commit c99fe13

Browse files
committed
Transactions - partial
1 parent 5404ba9 commit c99fe13

File tree

9 files changed

+271
-185
lines changed

9 files changed

+271
-185
lines changed

spec/GridFSBucketStorageAdapter.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe('GridFSBucket and GridStore interop', () => {
1818
beforeEach(async () => {
1919
const gsAdapter = new GridStoreAdapter(databaseURI);
2020
const db = await gsAdapter._connect();
21-
db.dropDatabase();
21+
await db.dropDatabase();
2222
});
2323

2424
it('a file created in GridStore should be available in GridFS', async () => {

spec/batch.spec.js

Lines changed: 169 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const batch = require('../lib/batch');
22
const request = require('../lib/request');
3+
const TestUtils = require('../lib/TestUtils');
34

45
const originalURL = '/parse/batch';
56
const serverURL = 'http://localhost:1234/parse';
@@ -70,9 +71,9 @@ describe('batch', () => {
7071

7172
it('should handle a batch request without transaction', done => {
7273
let calls = 0;
73-
Parse.Cloud.beforeSave('MyObject', ({ config }) => {
74+
Parse.Cloud.beforeSave('MyObject', ({ database }) => {
7475
calls++;
75-
expect(config.database._transactionalSession).toEqual(null);
76+
expect(database._transactionalSession).toEqual(null);
7677
});
7778

7879
request({
@@ -113,9 +114,9 @@ describe('batch', () => {
113114

114115
it('should handle a batch request with transaction = false', done => {
115116
let calls = 0;
116-
Parse.Cloud.beforeSave('MyObject', ({ config }) => {
117+
Parse.Cloud.beforeSave('MyObject', ({ database }) => {
117118
calls++;
118-
expect(config.database._transactionalSession).toEqual(null);
119+
expect(database._transactionalSession).toEqual(null);
119120
});
120121

121122
request({
@@ -155,184 +156,214 @@ describe('batch', () => {
155156
});
156157
});
157158

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+
});
206166
});
207-
});
208-
});
209167

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+
});
213171

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+
});
224184

225-
if (myObjectCalls === 1) {
226-
return request({
185+
request({
227186
method: 'POST',
228187
headers: headers,
229188
url: 'http://localhost:8378/1/batch',
230189
body: JSON.stringify({
231190
requests: [
232191
{
233192
method: 'POST',
234-
path: '/1/classes/MyObject2',
193+
path: '/1/classes/MyObject',
235194
body: { key: 'value1' },
236195
},
237196
{
238197
method: 'POST',
239-
path: '/1/classes/MyObject2',
198+
path: '/1/classes/MyObject',
240199
body: { key: 'value2' },
241200
},
242201
],
243202
transaction: true,
244203
}),
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+
});
248235

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+
// }
261247

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({
264321
method: 'POST',
265322
headers: headers,
266323
url: 'http://localhost:8378/1/batch',
267324
body: JSON.stringify({
268325
requests: [
269326
{
270327
method: 'POST',
271-
path: '/1/classes/MyObject3',
328+
path: '/1/classes/MyObject',
272329
body: { key: 'value1' },
273330
},
274331
{
275332
method: 'POST',
276-
path: '/1/classes/MyObject3',
333+
path: '/1/classes/MyObject',
277334
body: { key: 'value2' },
278335
},
279336
],
337+
transaction: true,
280338
}),
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');
326342
query.find().then(results => {
327-
expect(myObject3Calls).toBe(2);
343+
expect(myObjectCalls).toBe(2);
328344
expect(results.map(result => result.get('key')).sort()).toEqual([
329345
'value1',
330346
'value2',
331347
]);
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+
});
333364
});
334365
});
335366
});
336367
});
337-
});
368+
}
338369
});

0 commit comments

Comments
 (0)