@@ -148,6 +148,9 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
148
148
else None ,
149
149
"team" : access .team ,
150
150
"role" : access .role ,
151
+ "max_ancestors_role" : access .role
152
+ if access .document_id != document .id
153
+ else None ,
151
154
"abilities" : {
152
155
"destroy" : False ,
153
156
"partial_update" : False ,
@@ -248,6 +251,9 @@ def test_api_document_accesses_list_authenticated_related_privileged(
248
251
}
249
252
if access .user
250
253
else None ,
254
+ "max_ancestors_role" : access .role
255
+ if access .document_id != document .id
256
+ else None ,
251
257
"team" : access .team ,
252
258
"role" : access .role ,
253
259
"abilities" : access .get_abilities (user ),
@@ -258,6 +264,174 @@ def test_api_document_accesses_list_authenticated_related_privileged(
258
264
)
259
265
260
266
267
+ @pytest .mark .parametrize (
268
+ "roles,results" ,
269
+ [
270
+ [
271
+ ["administrator" , "reader" , "reader" , "reader" ],
272
+ [
273
+ ["reader" , "editor" , "administrator" ],
274
+ [],
275
+ [],
276
+ ["reader" , "editor" , "administrator" ],
277
+ ],
278
+ ],
279
+ [
280
+ ["owner" , "reader" , "reader" , "reader" ],
281
+ [[], [], [], ["reader" , "editor" , "administrator" , "owner" ]],
282
+ ],
283
+ [
284
+ ["owner" , "reader" , "reader" , "owner" ],
285
+ [
286
+ ["reader" , "editor" , "administrator" , "owner" ],
287
+ [],
288
+ [],
289
+ ["reader" , "editor" , "administrator" , "owner" ],
290
+ ],
291
+ ],
292
+ ],
293
+ )
294
+ def test_api_document_accesses_list_authenticated_related_same_user (roles , results ):
295
+ """
296
+ The maximum role across ancestor documents and set_role_to optionsfor
297
+ a given user should be filled as expected.
298
+ """
299
+ user = factories .UserFactory ()
300
+ client = APIClient ()
301
+ client .force_login (user )
302
+
303
+ # Create documents structured as a tree
304
+ grand_parent = factories .DocumentFactory (link_reach = "authenticated" )
305
+ parent = factories .DocumentFactory (parent = grand_parent )
306
+ document = factories .DocumentFactory (parent = parent )
307
+
308
+ # Create accesses for another user
309
+ other_user = factories .UserFactory ()
310
+ accesses = [
311
+ factories .UserDocumentAccessFactory (
312
+ document = document , user = user , role = roles [0 ]
313
+ ),
314
+ factories .UserDocumentAccessFactory (
315
+ document = grand_parent , user = other_user , role = roles [1 ]
316
+ ),
317
+ factories .UserDocumentAccessFactory (
318
+ document = parent , user = other_user , role = roles [2 ]
319
+ ),
320
+ factories .UserDocumentAccessFactory (
321
+ document = document , user = other_user , role = roles [3 ]
322
+ ),
323
+ ]
324
+
325
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
326
+
327
+ assert response .status_code == 200
328
+ content = response .json ()
329
+ assert len (content ) == 4
330
+
331
+ for result in content :
332
+ assert (
333
+ result ["max_ancestors_role" ] is None
334
+ if result ["user" ]["id" ] == str (user .id )
335
+ else choices .RoleChoices .max (roles [1 ], roles [2 ])
336
+ )
337
+
338
+ result_dict = {
339
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
340
+ }
341
+ assert [result_dict [str (access .id )] for access in accesses ] == results
342
+
343
+
344
+ @pytest .mark .parametrize (
345
+ "roles,results" ,
346
+ [
347
+ [
348
+ ["administrator" , "reader" , "reader" , "reader" ],
349
+ [
350
+ ["reader" , "editor" , "administrator" ],
351
+ [],
352
+ [],
353
+ ["reader" , "editor" , "administrator" ],
354
+ ],
355
+ ],
356
+ [
357
+ ["owner" , "reader" , "reader" , "reader" ],
358
+ [[], [], [], ["reader" , "editor" , "administrator" , "owner" ]],
359
+ ],
360
+ [
361
+ ["owner" , "reader" , "reader" , "owner" ],
362
+ [
363
+ ["reader" , "editor" , "administrator" , "owner" ],
364
+ [],
365
+ [],
366
+ ["reader" , "editor" , "administrator" , "owner" ],
367
+ ],
368
+ ],
369
+ [
370
+ ["reader" , "reader" , "reader" , "owner" ],
371
+ [["reader" , "editor" , "administrator" , "owner" ], [], [], []],
372
+ ],
373
+ [
374
+ ["reader" , "administrator" , "reader" , "editor" ],
375
+ [[], ["reader" , "editor" , "administrator" ], [], []],
376
+ ],
377
+ [
378
+ ["reader" , "editor" , "administrator" , "editor" ],
379
+ [[], [], ["editor" , "administrator" ], []],
380
+ ],
381
+ ],
382
+ )
383
+ def test_api_document_accesses_list_authenticated_related_same_team (
384
+ roles , results , mock_user_teams
385
+ ):
386
+ """
387
+ The maximum role across ancestor documents and set_role_to optionsfor
388
+ a given team should be filled as expected.
389
+ """
390
+ user = factories .UserFactory ()
391
+ client = APIClient ()
392
+ client .force_login (user )
393
+
394
+ # Create documents structured as a tree
395
+ grand_parent = factories .DocumentFactory (link_reach = "authenticated" )
396
+ parent = factories .DocumentFactory (parent = grand_parent )
397
+ document = factories .DocumentFactory (parent = parent )
398
+
399
+ mock_user_teams .return_value = ["lasuite" , "unknown" ]
400
+ accesses = [
401
+ factories .UserDocumentAccessFactory (
402
+ document = document , user = user , role = roles [0 ]
403
+ ),
404
+ # Create accesses for a team
405
+ factories .TeamDocumentAccessFactory (
406
+ document = grand_parent , team = "lasuite" , role = roles [1 ]
407
+ ),
408
+ factories .TeamDocumentAccessFactory (
409
+ document = parent , team = "lasuite" , role = roles [2 ]
410
+ ),
411
+ factories .TeamDocumentAccessFactory (
412
+ document = document , team = "lasuite" , role = roles [3 ]
413
+ ),
414
+ ]
415
+
416
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
417
+
418
+ assert response .status_code == 200
419
+ content = response .json ()
420
+ assert len (content ) == 4
421
+
422
+ for result in content :
423
+ assert (
424
+ result ["max_ancestors_role" ] is None
425
+ if result ["user" ] and result ["user" ]["id" ] == str (user .id )
426
+ else choices .RoleChoices .max (roles [1 ], roles [2 ])
427
+ )
428
+
429
+ result_dict = {
430
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
431
+ }
432
+ assert [result_dict [str (access .id )] for access in accesses ] == results
433
+
434
+
261
435
def test_api_document_accesses_retrieve_anonymous ():
262
436
"""
263
437
Anonymous users should not be allowed to retrieve a document access.
@@ -353,6 +527,7 @@ def test_api_document_accesses_retrieve_authenticated_related(
353
527
"user" : access_user ,
354
528
"team" : "" ,
355
529
"role" : access .role ,
530
+ "max_ancestors_role" : None ,
356
531
"abilities" : access .get_abilities (user ),
357
532
}
358
533
0 commit comments