Skip to content

Commit 3d335b1

Browse files
authored
Schema Cache Improvement 2 (parse-community#5616)
* schema hasClass improvement * create object improvement * destroy object * update object * hasClass test rewrite * more tests * improve signing up users
1 parent cab9113 commit 3d335b1

File tree

8 files changed

+563
-396
lines changed

8 files changed

+563
-396
lines changed

spec/RedisCacheAdapter.spec.js

Lines changed: 133 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,20 +175,20 @@ describe_only(() => {
175175

176176
beforeEach(async () => {
177177
await cacheAdapter.clear();
178-
getSpy = spyOn(cacheAdapter, 'get').and.callThrough();
179-
putSpy = spyOn(cacheAdapter, 'put').and.callThrough();
180178
await reconfigureServer({
181179
cacheAdapter,
182180
enableSingleSchemaCache: true,
183181
});
182+
getSpy = spyOn(cacheAdapter, 'get').and.callThrough();
183+
putSpy = spyOn(cacheAdapter, 'put').and.callThrough();
184184
});
185185

186186
it('test new object', async () => {
187187
const object = new TestObject();
188188
object.set('foo', 'bar');
189189
await object.save();
190-
expect(getSpy.calls.count()).toBe(4);
191-
expect(putSpy.calls.count()).toBe(3);
190+
expect(getSpy.calls.count()).toBe(2);
191+
expect(putSpy.calls.count()).toBe(2);
192192
});
193193

194194
it('test new object multiple fields', async () => {
@@ -200,8 +200,8 @@ describe_only(() => {
200200
booleanField: true,
201201
});
202202
await container.save();
203-
expect(getSpy.calls.count()).toBe(4);
204-
expect(putSpy.calls.count()).toBe(3);
203+
expect(getSpy.calls.count()).toBe(2);
204+
expect(putSpy.calls.count()).toBe(2);
205205
});
206206

207207
it('test update existing fields', async () => {
@@ -214,7 +214,57 @@ describe_only(() => {
214214

215215
object.set('foo', 'barz');
216216
await object.save();
217-
expect(getSpy.calls.count()).toBe(3);
217+
expect(getSpy.calls.count()).toBe(2);
218+
expect(putSpy.calls.count()).toBe(0);
219+
});
220+
221+
it('test saveAll / destroyAll', async () => {
222+
const object = new TestObject();
223+
await object.save();
224+
225+
getSpy.calls.reset();
226+
putSpy.calls.reset();
227+
228+
const objects = [];
229+
for (let i = 0; i < 10; i++) {
230+
const object = new TestObject();
231+
object.set('number', i);
232+
objects.push(object);
233+
}
234+
await Parse.Object.saveAll(objects);
235+
expect(getSpy.calls.count()).toBe(11);
236+
expect(putSpy.calls.count()).toBe(10);
237+
238+
getSpy.calls.reset();
239+
putSpy.calls.reset();
240+
241+
await Parse.Object.destroyAll(objects);
242+
expect(getSpy.calls.count()).toBe(11);
243+
expect(putSpy.calls.count()).toBe(0);
244+
});
245+
246+
it('test saveAll / destroyAll batch', async () => {
247+
const object = new TestObject();
248+
await object.save();
249+
250+
getSpy.calls.reset();
251+
putSpy.calls.reset();
252+
253+
const objects = [];
254+
for (let i = 0; i < 10; i++) {
255+
const object = new TestObject();
256+
object.set('number', i);
257+
objects.push(object);
258+
}
259+
await Parse.Object.saveAll(objects, { batchSize: 5 });
260+
expect(getSpy.calls.count()).toBe(12);
261+
expect(putSpy.calls.count()).toBe(5);
262+
263+
getSpy.calls.reset();
264+
putSpy.calls.reset();
265+
266+
await Parse.Object.destroyAll(objects, { batchSize: 5 });
267+
expect(getSpy.calls.count()).toBe(12);
218268
expect(putSpy.calls.count()).toBe(0);
219269
});
220270

@@ -228,7 +278,7 @@ describe_only(() => {
228278

229279
object.set('new', 'barz');
230280
await object.save();
231-
expect(getSpy.calls.count()).toBe(3);
281+
expect(getSpy.calls.count()).toBe(2);
232282
expect(putSpy.calls.count()).toBe(1);
233283
});
234284

@@ -248,8 +298,43 @@ describe_only(() => {
248298
booleanField: true,
249299
});
250300
await object.save();
301+
expect(getSpy.calls.count()).toBe(2);
302+
expect(putSpy.calls.count()).toBe(1);
303+
});
304+
305+
it('test user', async () => {
306+
const user = new Parse.User();
307+
user.setUsername('testing');
308+
user.setPassword('testing');
309+
await user.signUp();
310+
311+
expect(getSpy.calls.count()).toBe(6);
312+
expect(putSpy.calls.count()).toBe(1);
313+
});
314+
315+
it('test allowClientCreation false', async () => {
316+
const object = new TestObject();
317+
await object.save();
318+
await reconfigureServer({
319+
cacheAdapter,
320+
enableSingleSchemaCache: true,
321+
allowClientClassCreation: false,
322+
});
323+
getSpy.calls.reset();
324+
putSpy.calls.reset();
325+
326+
object.set('foo', 'bar');
327+
await object.save();
251328
expect(getSpy.calls.count()).toBe(3);
252329
expect(putSpy.calls.count()).toBe(1);
330+
331+
getSpy.calls.reset();
332+
putSpy.calls.reset();
333+
334+
const query = new Parse.Query(TestObject);
335+
await query.get(object.id);
336+
expect(getSpy.calls.count()).toBe(3);
337+
expect(putSpy.calls.count()).toBe(0);
253338
});
254339

255340
it('test query', async () => {
@@ -266,6 +351,45 @@ describe_only(() => {
266351
expect(putSpy.calls.count()).toBe(0);
267352
});
268353

354+
it('test query include', async () => {
355+
const child = new TestObject();
356+
await child.save();
357+
358+
const object = new TestObject();
359+
object.set('child', child);
360+
await object.save();
361+
362+
getSpy.calls.reset();
363+
putSpy.calls.reset();
364+
365+
const query = new Parse.Query(TestObject);
366+
query.include('child');
367+
await query.get(object.id);
368+
369+
expect(getSpy.calls.count()).toBe(4);
370+
expect(putSpy.calls.count()).toBe(0);
371+
});
372+
373+
it('query relation without schema', async () => {
374+
const child = new Parse.Object('ChildObject');
375+
await child.save();
376+
377+
const parent = new Parse.Object('ParentObject');
378+
const relation = parent.relation('child');
379+
relation.add(child);
380+
await parent.save();
381+
382+
getSpy.calls.reset();
383+
putSpy.calls.reset();
384+
385+
const objects = await relation.query().find();
386+
expect(objects.length).toBe(1);
387+
expect(objects[0].id).toBe(child.id);
388+
389+
expect(getSpy.calls.count()).toBe(2);
390+
expect(putSpy.calls.count()).toBe(0);
391+
});
392+
269393
it('test delete object', async () => {
270394
const object = new TestObject();
271395
object.set('foo', 'bar');
@@ -275,7 +399,7 @@ describe_only(() => {
275399
putSpy.calls.reset();
276400

277401
await object.destroy();
278-
expect(getSpy.calls.count()).toBe(3);
402+
expect(getSpy.calls.count()).toBe(2);
279403
expect(putSpy.calls.count()).toBe(0);
280404
});
281405

spec/RestQuery.spec.js

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -181,31 +181,26 @@ describe('rest query', () => {
181181
);
182182
});
183183

184-
it('query existent class when disabled client class creation', done => {
184+
it('query existent class when disabled client class creation', async () => {
185185
const customConfig = Object.assign({}, config, {
186186
allowClientClassCreation: false,
187187
});
188-
config.database
189-
.loadSchema()
190-
.then(schema => schema.addClassIfNotExists('ClientClassCreation', {}))
191-
.then(actualSchema => {
192-
expect(actualSchema.className).toEqual('ClientClassCreation');
193-
return rest.find(
194-
customConfig,
195-
auth.nobody(customConfig),
196-
'ClientClassCreation',
197-
{}
198-
);
199-
})
200-
.then(
201-
result => {
202-
expect(result.results.length).toEqual(0);
203-
done();
204-
},
205-
() => {
206-
fail('Should not throw error');
207-
}
208-
);
188+
const schema = await config.database.loadSchema();
189+
const actualSchema = await schema.addClassIfNotExists(
190+
'ClientClassCreation',
191+
{}
192+
);
193+
expect(actualSchema.className).toEqual('ClientClassCreation');
194+
195+
await schema.reloadData({ clearCache: true });
196+
// Should not throw
197+
const result = await rest.find(
198+
customConfig,
199+
auth.nobody(customConfig),
200+
'ClientClassCreation',
201+
{}
202+
);
203+
expect(result.results.length).toEqual(0);
209204
});
210205

211206
it('query with wrongly encoded parameter', done => {

spec/Schema.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,7 @@ describe('SchemaController', () => {
929929
.then(schema => {
930930
return schema
931931
.addClassIfNotExists('NewClass', {})
932+
.then(() => schema.reloadData({ clearCache: true }))
932933
.then(() => {
933934
schema
934935
.hasClass('NewClass')

spec/rest.spec.js

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -181,30 +181,25 @@ describe('rest create', () => {
181181
);
182182
});
183183

184-
it('handles create on existent class when disabled client class creation', done => {
184+
it('handles create on existent class when disabled client class creation', async () => {
185185
const customConfig = Object.assign({}, config, {
186186
allowClientClassCreation: false,
187187
});
188-
config.database
189-
.loadSchema()
190-
.then(schema => schema.addClassIfNotExists('ClientClassCreation', {}))
191-
.then(actualSchema => {
192-
expect(actualSchema.className).toEqual('ClientClassCreation');
193-
return rest.create(
194-
customConfig,
195-
auth.nobody(customConfig),
196-
'ClientClassCreation',
197-
{}
198-
);
199-
})
200-
.then(
201-
() => {
202-
done();
203-
},
204-
() => {
205-
fail('Should not throw error');
206-
}
207-
);
188+
const schema = await config.database.loadSchema();
189+
const actualSchema = await schema.addClassIfNotExists(
190+
'ClientClassCreation',
191+
{}
192+
);
193+
expect(actualSchema.className).toEqual('ClientClassCreation');
194+
195+
await schema.reloadData({ clearCache: true });
196+
// Should not throw
197+
await rest.create(
198+
customConfig,
199+
auth.nobody(customConfig),
200+
'ClientClassCreation',
201+
{}
202+
);
208203
});
209204

210205
it('handles user signup', done => {

0 commit comments

Comments
 (0)