|
1 |
| - |
| 1 | +"use strict"; |
2 | 2 |
|
3 | 3 | // Roles are not accessible without the master key, so they are not intended
|
4 | 4 | // for use by clients. We can manually test them using the master key.
|
@@ -64,26 +64,30 @@ describe('Parse Role testing', () => {
|
64 | 64 |
|
65 | 65 | var rolesNames = ["FooRole", "BarRole", "BazRole"];
|
66 | 66 |
|
67 |
| - var createRole = function(name, parent, user) { |
| 67 | + var createRole = function(name, sibling, user) { |
68 | 68 | var role = new Parse.Role(name, new Parse.ACL());
|
69 | 69 | if (user) {
|
70 | 70 | var users = role.relation('users');
|
71 | 71 | users.add(user);
|
72 | 72 | }
|
73 |
| - if (parent) { |
74 |
| - role.relation('roles').add(parent); |
| 73 | + if (sibling) { |
| 74 | + role.relation('roles').add(sibling); |
75 | 75 | }
|
76 | 76 | return role.save({}, { useMasterKey: true });
|
77 | 77 | }
|
78 | 78 | var roleIds = {};
|
79 | 79 | createTestUser().then( (user) => {
|
80 |
| - |
81 |
| - return createRole(rolesNames[0], null, null).then( (aRole) => { |
| 80 | + // Put the user on the 1st role |
| 81 | + return createRole(rolesNames[0], null, user).then( (aRole) => { |
82 | 82 | roleIds[aRole.get("name")] = aRole.id;
|
| 83 | + // set the 1st role as a sibling of the second |
| 84 | + // user will should have 2 role now |
83 | 85 | return createRole(rolesNames[1], aRole, null);
|
84 | 86 | }).then( (anotherRole) => {
|
85 | 87 | roleIds[anotherRole.get("name")] = anotherRole.id;
|
86 |
| - return createRole(rolesNames[2], anotherRole, user); |
| 88 | + // set this role as a sibling of the last |
| 89 | + // the user should now have 3 roles |
| 90 | + return createRole(rolesNames[2], anotherRole, null); |
87 | 91 | }).then( (lastRole) => {
|
88 | 92 | roleIds[lastRole.get("name")] = lastRole.id;
|
89 | 93 | var auth = new Auth({ config: new Config("test"), isMaster: true, user: user });
|
@@ -118,6 +122,60 @@ describe('Parse Role testing', () => {
|
118 | 122 | });
|
119 | 123 | });
|
120 | 124 | });
|
| 125 | + |
| 126 | + it("Should properly resolve roles", (done) => { |
| 127 | + let admin = new Parse.Role("Admin", new Parse.ACL()); |
| 128 | + let moderator = new Parse.Role("Moderator", new Parse.ACL()); |
| 129 | + let superModerator = new Parse.Role("SuperModerator", new Parse.ACL()); |
| 130 | + let contentManager = new Parse.Role('ContentManager', new Parse.ACL()); |
| 131 | + let superContentManager = new Parse.Role('SuperContentManager', new Parse.ACL()); |
| 132 | + Parse.Object.saveAll([admin, moderator, contentManager, superModerator, superContentManager], {useMasterKey: true}).then(() => { |
| 133 | + contentManager.getRoles().add([moderator, superContentManager]); |
| 134 | + moderator.getRoles().add([admin, superModerator]); |
| 135 | + superContentManager.getRoles().add(superModerator); |
| 136 | + return Parse.Object.saveAll([admin, moderator, contentManager, superModerator, superContentManager], {useMasterKey: true}); |
| 137 | + }).then(() => { |
| 138 | + var auth = new Auth({ config: new Config("test"), isMaster: true }); |
| 139 | + // For each role, fetch their sibling, what they inherit |
| 140 | + // return with result and roleId for later comparison |
| 141 | + let promises = [admin, moderator, contentManager, superModerator].map((role) => { |
| 142 | + return auth._getAllRoleNamesForId(role.id).then((result) => { |
| 143 | + return Parse.Promise.as({ |
| 144 | + id: role.id, |
| 145 | + name: role.get('name'), |
| 146 | + roleIds: result |
| 147 | + }); |
| 148 | + }) |
| 149 | + }); |
| 150 | + |
| 151 | + return Parse.Promise.when(promises); |
| 152 | + }).then((results) => { |
| 153 | + results.forEach((result) => { |
| 154 | + let id = result.id; |
| 155 | + let roleIds = result.roleIds; |
| 156 | + if (id == admin.id) { |
| 157 | + expect(roleIds.length).toBe(2); |
| 158 | + expect(roleIds.indexOf(moderator.id)).not.toBe(-1); |
| 159 | + expect(roleIds.indexOf(contentManager.id)).not.toBe(-1); |
| 160 | + } else if (id == moderator.id) { |
| 161 | + expect(roleIds.length).toBe(1); |
| 162 | + expect(roleIds.indexOf(contentManager.id)).toBe(0); |
| 163 | + } else if (id == contentManager.id) { |
| 164 | + expect(roleIds.length).toBe(0); |
| 165 | + } else if (id == superModerator.id) { |
| 166 | + expect(roleIds.length).toBe(3); |
| 167 | + expect(roleIds.indexOf(moderator.id)).not.toBe(-1); |
| 168 | + expect(roleIds.indexOf(contentManager.id)).not.toBe(-1); |
| 169 | + expect(roleIds.indexOf(superContentManager.id)).not.toBe(-1); |
| 170 | + } |
| 171 | + }); |
| 172 | + done(); |
| 173 | + }).fail((err) => { |
| 174 | + console.error(err); |
| 175 | + done(); |
| 176 | + }) |
| 177 | + |
| 178 | + }); |
121 | 179 |
|
122 | 180 | });
|
123 | 181 |
|
0 commit comments