@@ -148,6 +148,9 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
148148 else None ,
149149 "team" : access .team ,
150150 "role" : access .role ,
151+ "max_ancestors_role" : access .role
152+ if access .document_id != document .id
153+ else None ,
151154 "abilities" : {
152155 "destroy" : False ,
153156 "partial_update" : False ,
@@ -248,6 +251,9 @@ def test_api_document_accesses_list_authenticated_related_privileged(
248251 }
249252 if access .user
250253 else None ,
254+ "max_ancestors_role" : access .role
255+ if access .document_id != document .id
256+ else None ,
251257 "team" : access .team ,
252258 "role" : access .role ,
253259 "abilities" : access .get_abilities (user ),
@@ -258,6 +264,174 @@ def test_api_document_accesses_list_authenticated_related_privileged(
258264 )
259265
260266
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+
261435def test_api_document_accesses_retrieve_anonymous ():
262436 """
263437 Anonymous users should not be allowed to retrieve a document access.
@@ -353,6 +527,7 @@ def test_api_document_accesses_retrieve_authenticated_related(
353527 "user" : access_user ,
354528 "team" : "" ,
355529 "role" : access .role ,
530+ "max_ancestors_role" : None ,
356531 "abilities" : access .get_abilities (user ),
357532 }
358533
0 commit comments