Skip to content

Commit cc0c927

Browse files
committed
test(authorization): cover end-to-end ACL filtering for authorized_users
Existing tests verified user_has_permission() flips when an admin adds / removes via the new endpoints, but did not exercise the actual view-level gating. New cases assert end-to-end via the Django test client: * unauthorized non-staff hitting view_product / view_product_type 400s (handler403 → custom_unauthorized_view) * authorized user (direct or cascading via product_type) gets 200 * the product list page filters by membership (unauthorized user does not see the product; authorized member does) * product_type cascade is visible — adding to Product_Type.authorized_users surfaces its products in the product list for the cascade member
1 parent 3c95edd commit cc0c927

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

unittests/test_authorized_users_ui.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,31 @@ def test_panel_renders_with_authorized_user_listed(self):
9393
self.assertNotIn(">Members</h4>", body)
9494
self.assertNotIn(">Groups</h4>", body)
9595

96+
def test_unauthorized_user_locked_out_of_detail(self):
97+
self.client.force_login(self.bystander)
98+
response = self.client.get(reverse("view_product", args=(self.product.id,)))
99+
# custom_unauthorized_view (handler403) renders with status=400.
100+
self.assertEqual(response.status_code, 400)
101+
102+
def test_authorized_user_can_view_detail(self):
103+
self.product.authorized_users.add(self.target)
104+
self.client.force_login(self.target)
105+
response = self.client.get(reverse("view_product", args=(self.product.id,)))
106+
self.assertEqual(response.status_code, 200)
107+
108+
def test_unauthorized_user_does_not_see_product_in_list(self):
109+
self.client.force_login(self.bystander)
110+
response = self.client.get(reverse("product"))
111+
self.assertEqual(response.status_code, 200)
112+
self.assertNotIn(self.product.name, response.content.decode("utf-8"))
113+
114+
def test_authorized_user_sees_product_in_list(self):
115+
self.product.authorized_users.add(self.target)
116+
self.client.force_login(self.target)
117+
response = self.client.get(reverse("product"))
118+
self.assertEqual(response.status_code, 200)
119+
self.assertIn(self.product.name, response.content.decode("utf-8"))
120+
96121

97122
class TestProductTypeAuthorizedUsersUI(AuthorizedUsersUIBaseTestCase):
98123

@@ -144,3 +169,28 @@ def test_panel_renders_with_authorized_user_listed(self):
144169
self.assertIn(self.target.username, body)
145170
self.assertNotIn(">Members</h4>", body)
146171
self.assertNotIn(">Groups</h4>", body)
172+
173+
def test_unauthorized_user_locked_out_of_detail(self):
174+
self.client.force_login(self.bystander)
175+
response = self.client.get(reverse("view_product_type", args=(self.pt.id,)))
176+
self.assertEqual(response.status_code, 400)
177+
178+
def test_authorized_user_can_view_detail(self):
179+
self.pt.authorized_users.add(self.target)
180+
self.client.force_login(self.target)
181+
response = self.client.get(reverse("view_product_type", args=(self.pt.id,)))
182+
self.assertEqual(response.status_code, 200)
183+
184+
def test_authorized_user_sees_cascading_product_in_list(self):
185+
# cascade: membership on the product_type grants access to its products
186+
self.pt.authorized_users.add(self.target)
187+
self.client.force_login(self.target)
188+
response = self.client.get(reverse("product"))
189+
self.assertEqual(response.status_code, 200)
190+
self.assertIn(self.product.name, response.content.decode("utf-8"))
191+
192+
def test_unauthorized_user_does_not_see_product_type_in_list(self):
193+
self.client.force_login(self.bystander)
194+
response = self.client.get(reverse("product_type"))
195+
self.assertEqual(response.status_code, 200)
196+
self.assertNotIn(self.pt.name, response.content.decode("utf-8"))

0 commit comments

Comments
 (0)