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.
5
+ var RestQuery = require ( "../src/RestQuery" ) ;
5
6
var Auth = require ( "../src/Auth" ) . Auth ;
6
7
var Config = require ( "../src/Config" ) ;
7
8
@@ -60,21 +61,87 @@ describe('Parse Role testing', () => {
60
61
61
62
} ) ;
62
63
63
- it ( "should recursively load roles" , ( done ) => {
64
+ var createRole = function ( name , sibling , user ) {
65
+ var role = new Parse . Role ( name , new Parse . ACL ( ) ) ;
66
+ if ( user ) {
67
+ var users = role . relation ( 'users' ) ;
68
+ users . add ( user ) ;
69
+ }
70
+ if ( sibling ) {
71
+ role . relation ( 'roles' ) . add ( sibling ) ;
72
+ }
73
+ return role . save ( { } , { useMasterKey : true } ) ;
74
+ } ;
64
75
65
- var rolesNames = [ "FooRole" , "BarRole" , "BazRole" ] ;
76
+ it ( "should not recursively load the same role multiple times" , ( done ) => {
77
+ var rootRole = "RootRole" ;
78
+ var roleNames = [ "FooRole" , "BarRole" , "BazRole" ] ;
79
+ var allRoles = [ rootRole ] . concat ( roleNames ) ;
66
80
67
- var createRole = function ( name , sibling , user ) {
68
- var role = new Parse . Role ( name , new Parse . ACL ( ) ) ;
69
- if ( user ) {
70
- var users = role . relation ( 'users' ) ;
71
- users . add ( user ) ;
72
- }
73
- if ( sibling ) {
74
- role . relation ( 'roles' ) . add ( sibling ) ;
75
- }
76
- return role . save ( { } , { useMasterKey : true } ) ;
77
- }
81
+ var roleObjs = { } ;
82
+ var createAllRoles = function ( user ) {
83
+ var promises = allRoles . map ( function ( roleName ) {
84
+ return createRole ( roleName , null , user )
85
+ . then ( function ( roleObj ) {
86
+ roleObjs [ roleName ] = roleObj ;
87
+ return roleObj ;
88
+ } ) ;
89
+ } ) ;
90
+ return Promise . all ( promises ) ;
91
+ } ;
92
+
93
+ var restExecute = spyOn ( RestQuery . prototype , "execute" ) . and . callThrough ( ) ;
94
+
95
+ var user ,
96
+ auth ,
97
+ getAllRolesSpy ;
98
+ createTestUser ( ) . then ( ( newUser ) => {
99
+ user = newUser ;
100
+ return createAllRoles ( user ) ;
101
+ } ) . then ( ( roles ) => {
102
+ var rootRoleObj = roleObjs [ rootRole ] ;
103
+ roles . forEach ( function ( role , i ) {
104
+ // Add all roles to the RootRole
105
+ if ( role . id !== rootRoleObj . id ) {
106
+ role . relation ( "roles" ) . add ( rootRoleObj ) ;
107
+ }
108
+ // Add all "roleNames" roles to the previous role
109
+ if ( i > 0 ) {
110
+ role . relation ( "roles" ) . add ( roles [ i - 1 ] ) ;
111
+ }
112
+ } ) ;
113
+
114
+ return Parse . Object . saveAll ( roles , { useMasterKey : true } ) ;
115
+ } ) . then ( ( ) => {
116
+ auth = new Auth ( { config : new Config ( "test" ) , isMaster : true , user : user } ) ;
117
+ getAllRolesSpy = spyOn ( auth , "_getAllRoleNamesForId" ) . and . callThrough ( ) ;
118
+
119
+ return auth . _loadRoles ( ) ;
120
+ } ) . then ( ( roles ) => {
121
+ expect ( roles . length ) . toEqual ( 4 ) ;
122
+
123
+ allRoles . forEach ( function ( name ) {
124
+ expect ( roles . indexOf ( "role:" + name ) ) . not . toBe ( - 1 ) ;
125
+ } ) ;
126
+
127
+ // 1 Query for the initial setup
128
+ // 4 Queries for all the specific roles
129
+ // 1 Query for the final $in
130
+ expect ( restExecute . calls . count ( ) ) . toEqual ( 6 ) ;
131
+
132
+ // 4 One query for each of the roles
133
+ // 3 Queries for the "RootRole"
134
+ expect ( getAllRolesSpy . calls . count ( ) ) . toEqual ( 7 ) ;
135
+ done ( )
136
+ } ) . catch ( ( ) => {
137
+ fail ( "should succeed" ) ;
138
+ done ( ) ;
139
+ } ) ;
140
+
141
+ } ) ;
142
+
143
+ it ( "should recursively load roles" , ( done ) => {
144
+ var rolesNames = [ "FooRole" , "BarRole" , "BazRole" ] ;
78
145
var roleIds = { } ;
79
146
createTestUser ( ) . then ( ( user ) => {
80
147
// Put the user on the 1st role
@@ -97,7 +164,7 @@ describe('Parse Role testing', () => {
97
164
expect ( roles . length ) . toEqual ( 3 ) ;
98
165
rolesNames . forEach ( ( name ) => {
99
166
expect ( roles . indexOf ( 'role:' + name ) ) . not . toBe ( - 1 ) ;
100
- } )
167
+ } ) ;
101
168
done ( ) ;
102
169
} , function ( err ) {
103
170
fail ( "should succeed" )
@@ -122,7 +189,7 @@ describe('Parse Role testing', () => {
122
189
} ) ;
123
190
} ) ;
124
191
} ) ;
125
-
192
+
126
193
it ( "Should properly resolve roles" , ( done ) => {
127
194
let admin = new Parse . Role ( "Admin" , new Parse . ACL ( ) ) ;
128
195
let moderator = new Parse . Role ( "Moderator" , new Parse . ACL ( ) ) ;
@@ -134,7 +201,7 @@ describe('Parse Role testing', () => {
134
201
moderator . getRoles ( ) . add ( [ admin , superModerator ] ) ;
135
202
superContentManager . getRoles ( ) . add ( superModerator ) ;
136
203
return Parse . Object . saveAll ( [ admin , moderator , contentManager , superModerator , superContentManager ] , { useMasterKey : true } ) ;
137
- } ) . then ( ( ) => {
204
+ } ) . then ( ( ) => {
138
205
var auth = new Auth ( { config : new Config ( "test" ) , isMaster : true } ) ;
139
206
// For each role, fetch their sibling, what they inherit
140
207
// return with result and roleId for later comparison
@@ -147,7 +214,7 @@ describe('Parse Role testing', () => {
147
214
} ) ;
148
215
} )
149
216
} ) ;
150
-
217
+
151
218
return Parse . Promise . when ( promises ) ;
152
219
} ) . then ( ( results ) => {
153
220
results . forEach ( ( result ) => {
@@ -174,7 +241,7 @@ describe('Parse Role testing', () => {
174
241
console . error ( err ) ;
175
242
done ( ) ;
176
243
} )
177
-
244
+
178
245
} ) ;
179
246
180
247
it ( 'can create role and query empty users' , ( done ) => {
0 commit comments