@@ -76,22 +76,30 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
76
76
via , role , mock_user_teams
77
77
):
78
78
"""
79
- Authenticated users should be able to list document accesses for a document
80
- to which they are directly related, whatever their role in the document .
79
+ Authenticated users with no privileged role should only be able to list document
80
+ accesses associated with privileged roles for a document, including from ancestors .
81
81
"""
82
82
user = factories .UserFactory ()
83
-
84
83
client = APIClient ()
85
84
client .force_login (user )
86
85
87
- owner = factories . UserFactory ()
88
- accesses = []
89
-
90
- document_access = factories .UserDocumentAccessFactory (
91
- user = owner , role = models . RoleChoices . OWNER
86
+ # Create documents structured as a tree
87
+ unreadable_ancestor = factories . DocumentFactory ( link_reach = "restricted" )
88
+ # make all documents below the grand parent readable without a specific access for the user
89
+ grand_parent = factories .DocumentFactory (
90
+ parent = unreadable_ancestor , link_reach = "authenticated"
92
91
)
93
- accesses .append (document_access )
94
- document = document_access .document
92
+ parent = factories .DocumentFactory (parent = grand_parent )
93
+ document = factories .DocumentFactory (parent = parent )
94
+ child = factories .DocumentFactory (parent = document )
95
+
96
+ # Create accesses related to each document
97
+ factories .UserDocumentAccessFactory (document = unreadable_ancestor )
98
+ grand_parent_access = factories .UserDocumentAccessFactory (document = grand_parent )
99
+ parent_access = factories .UserDocumentAccessFactory (document = parent )
100
+ document_access = factories .UserDocumentAccessFactory (document = document )
101
+ factories .UserDocumentAccessFactory (document = child )
102
+
95
103
if via == USER :
96
104
models .DocumentAccess .objects .create (
97
105
document = document ,
@@ -108,8 +116,6 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
108
116
109
117
access1 = factories .TeamDocumentAccessFactory (document = document )
110
118
access2 = factories .UserDocumentAccessFactory (document = document )
111
- accesses .append (access1 )
112
- accesses .append (access2 )
113
119
114
120
# Accesses for other documents to which the user is related should not be listed either
115
121
other_access = factories .UserDocumentAccessFactory (user = user )
@@ -119,13 +125,16 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
119
125
f"/api/v1.0/documents/{ document .id !s} /accesses/" ,
120
126
)
121
127
122
- # Return only privileged roles
123
- privileged_accesses = [
124
- access for access in accesses if access .role in models .PRIVILEGED_ROLES
125
- ]
126
128
assert response .status_code == 200
127
129
content = response .json ()
130
+
131
+ # Make sure only privileged roles are returned
132
+ accesses = [grand_parent_access , parent_access , document_access , access1 , access2 ]
133
+ privileged_accesses = [
134
+ acc for acc in accesses if acc .role in models .PRIVILEGED_ROLES
135
+ ]
128
136
assert len (content ) == len (privileged_accesses )
137
+
129
138
assert sorted (content , key = lambda x : x ["id" ]) == sorted (
130
139
[
131
140
{
@@ -147,33 +156,39 @@ def test_api_document_accesses_list_authenticated_related_non_privileged(
147
156
key = lambda x : x ["id" ],
148
157
)
149
158
150
- for access in content :
151
- assert access ["role" ] in models .PRIVILEGED_ROLES
152
-
153
159
154
160
@pytest .mark .parametrize ("via" , VIA )
155
- @pytest .mark .parametrize ("role" , models .PRIVILEGED_ROLES )
156
- def test_api_document_accesses_list_authenticated_related_privileged_roles (
161
+ @pytest .mark .parametrize (
162
+ "role" , [role for role in models .RoleChoices if role in models .PRIVILEGED_ROLES ]
163
+ )
164
+ def test_api_document_accesses_list_authenticated_related_privileged (
157
165
via , role , mock_user_teams
158
166
):
159
167
"""
160
- Authenticated users should be able to list document accesses for a document
161
- to which they are directly related, whatever their role in the document .
168
+ Authenticated users with a privileged role should be able to list all
169
+ document accesses whatever the role, including from ancestors .
162
170
"""
163
171
user = factories .UserFactory ()
164
-
165
172
client = APIClient ()
166
173
client .force_login (user )
167
174
168
- owner = factories . UserFactory ()
169
- accesses = []
170
-
171
- document_access = factories .UserDocumentAccessFactory (
172
- user = owner , role = models . RoleChoices . OWNER
175
+ # Create documents structured as a tree
176
+ unreadable_ancestor = factories . DocumentFactory ( link_reach = "restricted" )
177
+ # make all documents below the grand parent readable without a specific access for the user
178
+ grand_parent = factories .DocumentFactory (
179
+ parent = unreadable_ancestor , link_reach = "authenticated"
173
180
)
174
- accesses .append (document_access )
175
- document = document_access .document
176
- user_access = None
181
+ parent = factories .DocumentFactory (parent = grand_parent )
182
+ document = factories .DocumentFactory (parent = parent )
183
+ child = factories .DocumentFactory (parent = document )
184
+
185
+ # Create accesses related to each document
186
+ factories .UserDocumentAccessFactory (document = unreadable_ancestor )
187
+ grand_parent_access = factories .UserDocumentAccessFactory (document = grand_parent )
188
+ parent_access = factories .UserDocumentAccessFactory (document = parent )
189
+ document_access = factories .UserDocumentAccessFactory (document = document )
190
+ factories .UserDocumentAccessFactory (document = child )
191
+
177
192
if via == USER :
178
193
user_access = models .DocumentAccess .objects .create (
179
194
document = document ,
@@ -187,11 +202,11 @@ def test_api_document_accesses_list_authenticated_related_privileged_roles(
187
202
team = "lasuite" ,
188
203
role = role ,
189
204
)
205
+ else :
206
+ raise RuntimeError ()
190
207
191
208
access1 = factories .TeamDocumentAccessFactory (document = document )
192
209
access2 = factories .UserDocumentAccessFactory (document = document )
193
- accesses .append (access1 )
194
- accesses .append (access2 )
195
210
196
211
# Accesses for other documents to which the user is related should not be listed either
197
212
other_access = factories .UserDocumentAccessFactory (user = user )
@@ -201,42 +216,39 @@ def test_api_document_accesses_list_authenticated_related_privileged_roles(
201
216
f"/api/v1.0/documents/{ document .id !s} /accesses/" ,
202
217
)
203
218
204
- access2_user = serializers .UserSerializer (instance = access2 .user ).data
205
- base_user = serializers .UserSerializer (instance = user ).data
206
-
207
219
assert response .status_code == 200
208
220
content = response .json ()
209
- assert len (content ) == 4
221
+
222
+ # Make sure all expected accesses are returned
223
+ accesses = [
224
+ user_access ,
225
+ grand_parent_access ,
226
+ parent_access ,
227
+ document_access ,
228
+ access1 ,
229
+ access2 ,
230
+ ]
231
+ assert len (content ) == 6
232
+
210
233
assert sorted (content , key = lambda x : x ["id" ]) == sorted (
211
234
[
212
235
{
213
- "id" : str (user_access .id ),
214
- "user" : base_user if via == "user" else None ,
215
- "team" : "lasuite" if via == "team" else "" ,
216
- "role" : user_access .role ,
217
- "abilities" : user_access .get_abilities (user ),
218
- },
219
- {
220
- "id" : str (access1 .id ),
221
- "user" : None ,
222
- "team" : access1 .team ,
223
- "role" : access1 .role ,
224
- "abilities" : access1 .get_abilities (user ),
225
- },
226
- {
227
- "id" : str (access2 .id ),
228
- "user" : access2_user ,
229
- "team" : "" ,
230
- "role" : access2 .role ,
231
- "abilities" : access2 .get_abilities (user ),
232
- },
233
- {
234
- "id" : str (document_access .id ),
235
- "user" : serializers .UserSerializer (instance = owner ).data ,
236
- "team" : "" ,
237
- "role" : models .RoleChoices .OWNER ,
238
- "abilities" : document_access .get_abilities (user ),
239
- },
236
+ "id" : str (access .id ),
237
+ "document_id" : str (access .document_id ),
238
+ "user" : {
239
+ "id" : str (access .user .id ),
240
+ "email" : access .user .email ,
241
+ "language" : access .user .language ,
242
+ "full_name" : access .user .full_name ,
243
+ "short_name" : access .user .short_name ,
244
+ }
245
+ if access .user
246
+ else None ,
247
+ "team" : access .team ,
248
+ "role" : access .role ,
249
+ "abilities" : access .get_abilities (user ),
250
+ }
251
+ for access in accesses
240
252
],
241
253
key = lambda x : x ["id" ],
242
254
)
@@ -331,6 +343,7 @@ def test_api_document_accesses_retrieve_authenticated_related(
331
343
assert response .status_code == 200
332
344
assert response .json () == {
333
345
"id" : str (access .id ),
346
+ "document_id" : str (access .document_id ),
334
347
"user" : access_user ,
335
348
"team" : "" ,
336
349
"role" : access .role ,
0 commit comments