|
26 | 26 | User = get_user_model() |
27 | 27 |
|
28 | 28 |
|
29 | | -def get_user_map_without_profile(usernames: list[str]) -> dict[str, User]: |
30 | | - """ |
31 | | - Test version of ``get_user_map`` that doesn't use select_related('profile'). |
32 | | -
|
33 | | - The generic Django User model doesn't have a profile relation, |
34 | | - so we override this in tests to avoid FieldError. |
35 | | - """ |
36 | | - users = User.objects.filter(username__in=usernames) |
37 | | - return {user.username: user for user in users} |
38 | | - |
39 | | - |
40 | 29 | class ViewTestMixin(BaseRolesTestCase): |
41 | 30 | """Mixin providing common test utilities for view tests.""" |
42 | 31 |
|
@@ -322,11 +311,6 @@ def setUp(self): |
322 | 311 | super().setUp() |
323 | 312 | self.client.force_authenticate(user=self.admin_user) |
324 | 313 | self.url = reverse("openedx_authz:role-user-list") |
325 | | - self.get_user_map_patcher = patch( |
326 | | - "openedx_authz.rest_api.v1.views.get_user_map", |
327 | | - side_effect=get_user_map_without_profile, |
328 | | - ) |
329 | | - self.get_user_map_patcher.start() |
330 | 314 |
|
331 | 315 | @data( |
332 | 316 | # All users |
@@ -1076,12 +1060,6 @@ def setUp(self): |
1076 | 1060 | """Set up test fixtures.""" |
1077 | 1061 | super().setUp() |
1078 | 1062 | self.url = reverse("openedx_authz:user-list") |
1079 | | - self.get_user_map_patcher = patch( |
1080 | | - "openedx_authz.api.utils.get_user_map", |
1081 | | - side_effect=get_user_map_without_profile, |
1082 | | - ) |
1083 | | - self.get_user_map_patcher.start() |
1084 | | - self.addCleanup(self.get_user_map_patcher.stop) |
1085 | 1063 |
|
1086 | 1064 | # -------------------------------------------------------------------- # |
1087 | 1065 | # Visibility: calling user only sees assignments it has view access to # |
@@ -1340,16 +1318,6 @@ class TestTeamMemberAssignmentsAPIView(ViewTestMixin): |
1340 | 1318 | (requires at least one VIEW_LIBRARY_TEAM or COURSES_VIEW_COURSE_TEAM permission). |
1341 | 1319 | """ |
1342 | 1320 |
|
1343 | | - def setUp(self): |
1344 | | - """Set up test fixtures.""" |
1345 | | - super().setUp() |
1346 | | - self.get_user_map_patcher = patch( |
1347 | | - "openedx_authz.api.utils.get_user_map", |
1348 | | - side_effect=get_user_map_without_profile, |
1349 | | - ) |
1350 | | - self.get_user_map_patcher.start() |
1351 | | - self.addCleanup(self.get_user_map_patcher.stop) |
1352 | | - |
1353 | 1321 | def _url(self, username: str) -> str: |
1354 | 1322 | return reverse("openedx_authz:user-assignment-list", kwargs={"username": username}) |
1355 | 1323 |
|
@@ -2102,12 +2070,6 @@ def setUp(self): |
2102 | 2070 | """Set up test fixtures.""" |
2103 | 2071 | super().setUp() |
2104 | 2072 | self.url = reverse("openedx_authz:assignment-list") |
2105 | | - self.get_user_map_patcher = patch( |
2106 | | - "openedx_authz.api.utils.get_user_map", |
2107 | | - side_effect=get_user_map_without_profile, |
2108 | | - ) |
2109 | | - self.get_user_map_patcher.start() |
2110 | | - self.addCleanup(self.get_user_map_patcher.stop) |
2111 | 2073 |
|
2112 | 2074 | # -------------------------------------------------------------------- # |
2113 | 2075 | # Visibility: calling user only sees assignments it has view access to # |
@@ -2585,6 +2547,44 @@ def test_combined_scope_and_search(self): |
2585 | 2547 | self.assertEqual(response.status_code, status.HTTP_200_OK) |
2586 | 2548 | self.assertEqual(response.data["count"], 2) |
2587 | 2549 |
|
| 2550 | + # ------------------------------------------------------------------ # |
| 2551 | + # Active user filtering # |
| 2552 | + # ------------------------------------------------------------------ # |
| 2553 | + |
| 2554 | + def test_inactive_users_excluded_from_results(self): |
| 2555 | + """Role assignments for inactive users are not included in results. |
| 2556 | +
|
| 2557 | + Deactivating a user (is_active=False) should remove their role assignments |
| 2558 | + from the response, even though the assignments still exist in the database. |
| 2559 | + Superadmin entries are also excluded for inactive staff/superusers. |
| 2560 | +
|
| 2561 | + Expected result: |
| 2562 | + - Returns 200 OK. |
| 2563 | + - The inactive user's assignments do not appear in the results. |
| 2564 | + - The total count decreases by the number of assignments the inactive user had. |
| 2565 | + """ |
| 2566 | + # Baseline: admin_1 (staff) sees all 14 rows (3 superadmin + 11 role assignments) |
| 2567 | + baseline_response = self.client.get(self.url) |
| 2568 | + self.assertEqual(baseline_response.status_code, status.HTTP_200_OK) |
| 2569 | + baseline_count = baseline_response.data["count"] |
| 2570 | + |
| 2571 | + # Deactivate regular_1, who has 1 role assignment in lib:Org1:LIB1 |
| 2572 | + inactive_user = User.objects.get(username="regular_1") |
| 2573 | + inactive_user.is_active = False |
| 2574 | + inactive_user.save() |
| 2575 | + try: |
| 2576 | + response = self.client.get(self.url) |
| 2577 | + |
| 2578 | + self.assertEqual(response.status_code, status.HTTP_200_OK) |
| 2579 | + # regular_1 had 1 role assignment → count should drop by 1 |
| 2580 | + self.assertEqual(response.data["count"], baseline_count - 1) |
| 2581 | + # Confirm regular_1 is not in the results |
| 2582 | + usernames = {item["username"] for item in response.data["results"]} |
| 2583 | + self.assertNotIn("regular_1", usernames) |
| 2584 | + finally: |
| 2585 | + inactive_user.is_active = True |
| 2586 | + inactive_user.save() |
| 2587 | + |
2588 | 2588 |
|
2589 | 2589 | @ddt |
2590 | 2590 | class TestAssignmentsAPIViewPermissions(ViewTestMixin): |
@@ -2638,12 +2638,6 @@ def setUp(self): |
2638 | 2638 | """Set up test fixtures.""" |
2639 | 2639 | super().setUp() |
2640 | 2640 | self.url = reverse("openedx_authz:assignment-list") |
2641 | | - self.get_user_map_patcher = patch( |
2642 | | - "openedx_authz.api.utils.get_user_map", |
2643 | | - side_effect=get_user_map_without_profile, |
2644 | | - ) |
2645 | | - self.get_user_map_patcher.start() |
2646 | | - self.addCleanup(self.get_user_map_patcher.stop) |
2647 | 2641 |
|
2648 | 2642 | # ------------------------------------------------------------------ # |
2649 | 2643 | # Superadmin caller # |
|
0 commit comments