@@ -148,6 +148,7 @@ 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" : None ,
151
152
"abilities" : {
152
153
"destroy" : False ,
153
154
"partial_update" : False ,
@@ -248,6 +249,7 @@ def test_api_document_accesses_list_authenticated_related_privileged(
248
249
}
249
250
if access .user
250
251
else None ,
252
+ "max_ancestors_role" : None ,
251
253
"team" : access .team ,
252
254
"role" : access .role ,
253
255
"abilities" : access .get_abilities (user ),
@@ -258,6 +260,245 @@ def test_api_document_accesses_list_authenticated_related_privileged(
258
260
)
259
261
260
262
263
+ def test_api_document_accesses_retrieve_set_role_to_child ():
264
+ """Check set_role_to for an access with no access on the ancestor."""
265
+ user , other_user = factories .UserFactory .create_batch (2 )
266
+ client = APIClient ()
267
+ client .force_login (user )
268
+
269
+ parent = factories .DocumentFactory ()
270
+ parent_access = factories .UserDocumentAccessFactory (
271
+ document = parent , user = user , role = "owner"
272
+ )
273
+
274
+ document = factories .DocumentFactory (parent = parent )
275
+ document_access_other_user = factories .UserDocumentAccessFactory (
276
+ document = document , user = other_user , role = "editor"
277
+ )
278
+
279
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
280
+
281
+ assert response .status_code == 200
282
+ content = response .json ()
283
+ assert len (content ) == 2
284
+
285
+ result_dict = {
286
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
287
+ }
288
+ assert result_dict [str (document_access_other_user .id )] == [
289
+ "reader" ,
290
+ "editor" ,
291
+ "administrator" ,
292
+ "owner" ,
293
+ ]
294
+ assert result_dict [str (parent_access .id )] == []
295
+
296
+ # Add an access for the other user on the parent
297
+ parent_access_other_user = factories .UserDocumentAccessFactory (
298
+ document = parent , user = other_user , role = "editor"
299
+ )
300
+
301
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
302
+
303
+ assert response .status_code == 200
304
+ content = response .json ()
305
+ assert len (content ) == 3
306
+
307
+ result_dict = {
308
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
309
+ }
310
+ assert result_dict [str (document_access_other_user .id )] == [
311
+ "editor" ,
312
+ "administrator" ,
313
+ "owner" ,
314
+ ]
315
+ assert result_dict [str (parent_access .id )] == []
316
+ assert result_dict [str (parent_access_other_user .id )] == [
317
+ "reader" ,
318
+ "editor" ,
319
+ "administrator" ,
320
+ "owner" ,
321
+ ]
322
+
323
+
324
+ @pytest .mark .parametrize (
325
+ "roles,results" ,
326
+ [
327
+ [
328
+ ["administrator" , "reader" , "reader" , "reader" ],
329
+ [
330
+ ["reader" , "editor" , "administrator" ],
331
+ [],
332
+ [],
333
+ ["reader" , "editor" , "administrator" ],
334
+ ],
335
+ ],
336
+ [
337
+ ["owner" , "reader" , "reader" , "reader" ],
338
+ [[], [], [], ["reader" , "editor" , "administrator" , "owner" ]],
339
+ ],
340
+ [
341
+ ["owner" , "reader" , "reader" , "owner" ],
342
+ [
343
+ ["reader" , "editor" , "administrator" , "owner" ],
344
+ [],
345
+ [],
346
+ ["reader" , "editor" , "administrator" , "owner" ],
347
+ ],
348
+ ],
349
+ ],
350
+ )
351
+ def test_api_document_accesses_list_authenticated_related_same_user (roles , results ):
352
+ """
353
+ The maximum role across ancestor documents and set_role_to optionsfor
354
+ a given user should be filled as expected.
355
+ """
356
+ user = factories .UserFactory ()
357
+ client = APIClient ()
358
+ client .force_login (user )
359
+
360
+ # Create documents structured as a tree
361
+ grand_parent = factories .DocumentFactory (link_reach = "authenticated" )
362
+ parent = factories .DocumentFactory (parent = grand_parent )
363
+ document = factories .DocumentFactory (parent = parent )
364
+
365
+ # Create accesses for another user
366
+ other_user = factories .UserFactory ()
367
+ accesses = [
368
+ factories .UserDocumentAccessFactory (
369
+ document = document , user = user , role = roles [0 ]
370
+ ),
371
+ factories .UserDocumentAccessFactory (
372
+ document = grand_parent , user = other_user , role = roles [1 ]
373
+ ),
374
+ factories .UserDocumentAccessFactory (
375
+ document = parent , user = other_user , role = roles [2 ]
376
+ ),
377
+ factories .UserDocumentAccessFactory (
378
+ document = document , user = other_user , role = roles [3 ]
379
+ ),
380
+ ]
381
+
382
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
383
+
384
+ assert response .status_code == 200
385
+ content = response .json ()
386
+ assert len (content ) == 4
387
+
388
+ for result in content :
389
+ assert (
390
+ result ["max_ancestors_role" ] is None
391
+ if result ["user" ]["id" ] == str (user .id )
392
+ else choices .RoleChoices .max (roles [1 ], roles [2 ])
393
+ )
394
+
395
+ result_dict = {
396
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
397
+ }
398
+ assert [result_dict [str (access .id )] for access in accesses ] == results
399
+
400
+
401
+ @pytest .mark .parametrize (
402
+ "roles,results" ,
403
+ [
404
+ [
405
+ ["administrator" , "reader" , "reader" , "reader" ],
406
+ [
407
+ ["reader" , "editor" , "administrator" ],
408
+ [],
409
+ [],
410
+ ["reader" , "editor" , "administrator" ],
411
+ ],
412
+ ],
413
+ [
414
+ ["owner" , "reader" , "reader" , "reader" ],
415
+ [[], [], [], ["reader" , "editor" , "administrator" , "owner" ]],
416
+ ],
417
+ [
418
+ ["owner" , "reader" , "reader" , "owner" ],
419
+ [
420
+ ["reader" , "editor" , "administrator" , "owner" ],
421
+ [],
422
+ [],
423
+ ["reader" , "editor" , "administrator" , "owner" ],
424
+ ],
425
+ ],
426
+ [
427
+ ["reader" , "reader" , "reader" , "owner" ],
428
+ [["reader" , "editor" , "administrator" , "owner" ], [], [], []],
429
+ ],
430
+ [
431
+ ["reader" , "administrator" , "reader" , "editor" ],
432
+ [
433
+ ["reader" , "editor" , "administrator" ],
434
+ ["reader" , "editor" , "administrator" ],
435
+ [],
436
+ [],
437
+ ],
438
+ ],
439
+ [
440
+ ["editor" , "editor" , "administrator" , "editor" ],
441
+ [
442
+ ["reader" , "editor" , "administrator" ],
443
+ [],
444
+ ["editor" , "administrator" ],
445
+ [],
446
+ ],
447
+ ],
448
+ ],
449
+ )
450
+ def test_api_document_accesses_list_authenticated_related_same_team (
451
+ roles , results , mock_user_teams
452
+ ):
453
+ """
454
+ The maximum role across ancestor documents and set_role_to optionsfor
455
+ a given team should be filled as expected.
456
+ """
457
+ user = factories .UserFactory ()
458
+ client = APIClient ()
459
+ client .force_login (user )
460
+
461
+ # Create documents structured as a tree
462
+ grand_parent = factories .DocumentFactory (link_reach = "authenticated" )
463
+ parent = factories .DocumentFactory (parent = grand_parent )
464
+ document = factories .DocumentFactory (parent = parent )
465
+
466
+ mock_user_teams .return_value = ["lasuite" , "unknown" ]
467
+ accesses = [
468
+ factories .UserDocumentAccessFactory (
469
+ document = document , user = user , role = roles [0 ]
470
+ ),
471
+ # Create accesses for a team
472
+ factories .TeamDocumentAccessFactory (
473
+ document = grand_parent , team = "lasuite" , role = roles [1 ]
474
+ ),
475
+ factories .TeamDocumentAccessFactory (
476
+ document = parent , team = "lasuite" , role = roles [2 ]
477
+ ),
478
+ factories .TeamDocumentAccessFactory (
479
+ document = document , team = "lasuite" , role = roles [3 ]
480
+ ),
481
+ ]
482
+
483
+ response = client .get (f"/api/v1.0/documents/{ document .id !s} /accesses/" )
484
+
485
+ assert response .status_code == 200
486
+ content = response .json ()
487
+ assert len (content ) == 4
488
+
489
+ for result in content :
490
+ assert (
491
+ result ["max_ancestors_role" ] is None
492
+ if result ["user" ] and result ["user" ]["id" ] == str (user .id )
493
+ else choices .RoleChoices .max (roles [1 ], roles [2 ])
494
+ )
495
+
496
+ result_dict = {
497
+ result ["id" ]: result ["abilities" ]["set_role_to" ] for result in content
498
+ }
499
+ assert [result_dict [str (access .id )] for access in accesses ] == results
500
+
501
+
261
502
def test_api_document_accesses_retrieve_anonymous ():
262
503
"""
263
504
Anonymous users should not be allowed to retrieve a document access.
@@ -353,6 +594,7 @@ def test_api_document_accesses_retrieve_authenticated_related(
353
594
"user" : access_user ,
354
595
"team" : "" ,
355
596
"role" : access .role ,
597
+ "max_ancestors_role" : None ,
356
598
"abilities" : access .get_abilities (user ),
357
599
}
358
600
0 commit comments