From af1fa1675e80a63d8587a3d55126cfd05547d8fb Mon Sep 17 00:00:00 2001 From: Perceval Archimbaud Date: Thu, 3 Jan 2019 10:46:32 +0100 Subject: [PATCH 1/5] Add test on RestQuery.each with relation --- spec/RestQuery.spec.js | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index e17af81b8d..86439a81d1 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -363,4 +363,63 @@ describe('RestQuery.each', () => { expect(classSpy.calls.count()).toBe(4); expect(results.length).toBe(7); }); + + it('should work with query on relations', async () => { + const objectA = new Parse.Object('Letter', { value: 'A' }); + const objectB = new Parse.Object('Letter', { value: 'B' }); + + const object1 = new Parse.Object('Number', { value: '1' }); + const object2 = new Parse.Object('Number', { value: '2' }); + const object3 = new Parse.Object('Number', { value: '3' }); + const object4 = new Parse.Object('Number', { value: '4' }); + await Parse.Object.saveAll([object1, object2, object3, object4]); + + objectA.relation('numbers').add(object1); + objectB.relation('numbers').add(object2); + await Parse.Object.saveAll([objectA, objectB]); + + const config = Config.get('test'); + + /* Two query needed since objectId are sorted and we can't know wich one + ** going to be the first and then skip by the $gt added by each */ + const queryOne = new RestQuery( + config, + auth.master(config), + 'Letter', + { + numbers: { + __type: 'Pointer', + className: 'Number', + objectId: object1.id, + }, + }, + { limit: 1 } + ); + const queryTwo = new RestQuery( + config, + auth.master(config), + 'Letter', + { + numbers: { + __type: 'Pointer', + className: 'Number', + objectId: object2.id, + }, + }, + { limit: 1 } + ); + + const classSpy = spyOn(RestQuery.prototype, 'execute').and.callThrough(); + const resultsOne = []; + const resultsTwo = []; + await queryOne.each(result => { + resultsOne.push(result); + }); + await queryTwo.each(result => { + resultsTwo.push(result); + }); + expect(classSpy.calls.count()).toBe(4); + expect(resultsOne.length).toBe(1); + expect(resultsTwo.length).toBe(1); + }); }); From d18d2697afb57a8d08ea42febcb346f9beaba7e4 Mon Sep 17 00:00:00 2001 From: Perceval Archimbaud Date: Thu, 3 Jan 2019 10:49:01 +0100 Subject: [PATCH 2/5] Fix the failing test for RestQuery.each and relations --- src/RestQuery.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/RestQuery.js b/src/RestQuery.js index aa53c0ebf0..fa6f5bf813 100644 --- a/src/RestQuery.js +++ b/src/RestQuery.js @@ -223,7 +223,9 @@ RestQuery.prototype.each = function(callback) { results.forEach(callback); finished = results.length < restOptions.limit; if (!finished) { - restWhere.objectId = { $gt: results[results.length - 1].objectId }; + restWhere.objectId = Object.assign({}, restWhere.objectId, { + $gt: results[results.length - 1].objectId, + }); } } ); From b64959ee68f1e2c08bbdad38287e6601a1fa4b69 Mon Sep 17 00:00:00 2001 From: Perceval Archimbaud Date: Fri, 4 Jan 2019 18:30:07 +0100 Subject: [PATCH 3/5] Add test for getRolesForUser --- spec/Auth.spec.js | 53 ++++++++++++++++++++++++++++++++++++------ spec/RestQuery.spec.js | 4 ++-- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/spec/Auth.spec.js b/spec/Auth.spec.js index 0b44ca95b0..e53f9a6222 100644 --- a/spec/Auth.spec.js +++ b/spec/Auth.spec.js @@ -151,7 +151,6 @@ describe('Auth', () => { }); describe('getRolesForUser', () => { - const rolesNumber = 300; it('should load all roles without config', async () => { @@ -165,11 +164,11 @@ describe('Auth', () => { sessionToken: user.getSessionToken(), }); const roles = []; - for(let i = 0; i < rolesNumber;i++){ + for (let i = 0; i < rolesNumber; i++) { const acl = new Parse.ACL(); - const role = new Parse.Role("roleloadtest" + i, acl); + const role = new Parse.Role('roleloadtest' + i, acl); role.getUsers().add([user]); - roles.push(role.save()) + roles.push(role.save()); } const savedRoles = await Promise.all(roles); expect(savedRoles.length).toBe(rolesNumber); @@ -189,16 +188,56 @@ describe('Auth', () => { config: Config.get('test'), }); const roles = []; - for(let i = 0; i < rolesNumber;i++){ + for (let i = 0; i < rolesNumber; i++) { const acl = new Parse.ACL(); - const role = new Parse.Role("roleloadtest" + i, acl); + const role = new Parse.Role('roleloadtest' + i, acl); role.getUsers().add([user]); - roles.push(role.save()) + roles.push(role.save()); } const savedRoles = await Promise.all(roles); expect(savedRoles.length).toBe(rolesNumber); const cloudRoles = await userAuth.getRolesForUser(); expect(cloudRoles.length).toBe(rolesNumber); }); + + fit('should load all roles for different users with config', async () => { + const rolesNumber = 100; + const user = new Parse.User(); + await user.signUp({ + username: 'hello', + password: 'password', + }); + const user2 = new Parse.User(); + await user2.signUp({ + username: 'world', + password: '1234', + }); + expect(user.getSessionToken()).not.toBeUndefined(); + const userAuth = await getAuthForSessionToken({ + sessionToken: user.getSessionToken(), + config: Config.get('test'), + }); + const user2Auth = await getAuthForSessionToken({ + sessionToken: user2.getSessionToken(), + config: Config.get('test'), + }); + const roles = []; + for (let i = 0; i < rolesNumber; i += 1) { + const acl = new Parse.ACL(); + const acl2 = new Parse.ACL(); + const role = new Parse.Role('roleloadtest' + i, acl); + const role2 = new Parse.Role('role2loadtest' + i, acl2); + role.getUsers().add([user]); + role2.getUsers().add([user2]); + roles.push(role.save()); + roles.push(role2.save()); + } + const savedRoles = await Promise.all(roles); + expect(savedRoles.length).toBe(rolesNumber * 2); + const cloudRoles = await userAuth.getRolesForUser(); + const cloudRoles2 = await user2Auth.getRolesForUser(); + expect(cloudRoles.length).toBe(rolesNumber); + expect(cloudRoles2.length).toBe(rolesNumber); + }); }); }); diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index 86439a81d1..50db3679e9 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -380,8 +380,8 @@ describe('RestQuery.each', () => { const config = Config.get('test'); - /* Two query needed since objectId are sorted and we can't know wich one - ** going to be the first and then skip by the $gt added by each */ + // Two queries needed since objectId are sorted and we can't know which one + // going to be the first and then skip by the $gt added by each const queryOne = new RestQuery( config, auth.master(config), From 0df70ab1aa41611bc8e4f74357fe2aa109db16ed Mon Sep 17 00:00:00 2001 From: Perceval Archimbaud Date: Fri, 4 Jan 2019 18:32:13 +0100 Subject: [PATCH 4/5] Fix format for comment --- spec/RestQuery.spec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/RestQuery.spec.js b/spec/RestQuery.spec.js index 50db3679e9..51a49b08cc 100644 --- a/spec/RestQuery.spec.js +++ b/spec/RestQuery.spec.js @@ -380,8 +380,10 @@ describe('RestQuery.each', () => { const config = Config.get('test'); - // Two queries needed since objectId are sorted and we can't know which one - // going to be the first and then skip by the $gt added by each + /** + * Two queries needed since objectId are sorted and we can't know which one + * going to be the first and then skip by the $gt added by each + */ const queryOne = new RestQuery( config, auth.master(config), From a3c9330c353cfb4e55752b9d813df972569cd7b1 Mon Sep 17 00:00:00 2001 From: Perceval Archimbaud Date: Fri, 4 Jan 2019 18:36:28 +0100 Subject: [PATCH 5/5] Remove extra fit --- spec/Auth.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/Auth.spec.js b/spec/Auth.spec.js index e53f9a6222..0884218f2d 100644 --- a/spec/Auth.spec.js +++ b/spec/Auth.spec.js @@ -200,7 +200,7 @@ describe('Auth', () => { expect(cloudRoles.length).toBe(rolesNumber); }); - fit('should load all roles for different users with config', async () => { + it('should load all roles for different users with config', async () => { const rolesNumber = 100; const user = new Parse.User(); await user.signUp({