|
10 | 10 | from ccx_keys.locator import CCXLocator |
11 | 11 | from django.test import RequestFactory |
12 | 12 | from opaque_keys.edx.locations import CourseLocator |
| 13 | +from openedx_authz.api.data import OrgCourseOverviewGlobData |
13 | 14 | from openedx_authz.api.users import assign_role_to_user_in_scope |
14 | 15 | from openedx_authz.constants.roles import COURSE_DATA_RESEARCHER, COURSE_EDITOR, COURSE_STAFF |
15 | 16 |
|
|
20 | 21 | _accessible_courses_iter_for_tests, |
21 | 22 | _accessible_courses_list_from_groups, |
22 | 23 | _accessible_courses_summary_iter, |
| 24 | + _get_authz_accessible_courses_list, |
23 | 25 | get_courses_accessible_to_user, |
24 | 26 | ) |
25 | 27 | from common.djangoapps.course_action_state.models import CourseRerunState |
@@ -715,3 +717,58 @@ def test_superuser_gets_all_courses(self): |
715 | 717 | } |
716 | 718 |
|
717 | 719 | self.assertEqual(result_ids, expected_ids) |
| 720 | + |
| 721 | + def test_get_authz_accessible_courses_list_with_org_scope(self): |
| 722 | + """ |
| 723 | + When the scope is an OrgCourseOverviewGlobData, all course keys |
| 724 | + returned by `_get_course_keys_for_org_scope` should be included in |
| 725 | + the resulting authz keys when the authz toggle is enabled. |
| 726 | + """ |
| 727 | + authz_keys, _, authz_courses, _ = self._create_courses() |
| 728 | + org_scope = OrgCourseOverviewGlobData(external_key='course-v1:Org1+*') |
| 729 | + |
| 730 | + request = self._make_request(self.authorized_user) |
| 731 | + |
| 732 | + with patch( |
| 733 | + "cms.djangoapps.contentstore.views.course.get_scopes_for_user_and_permission", |
| 734 | + return_value=[org_scope], |
| 735 | + ), patch( |
| 736 | + "cms.djangoapps.contentstore.views.course._get_course_keys_for_org_scope", |
| 737 | + return_value=authz_keys, |
| 738 | + ) as mock_get_keys, patch.object( |
| 739 | + core_toggles.AUTHZ_COURSE_AUTHORING_FLAG, |
| 740 | + "is_enabled", |
| 741 | + return_value=True, |
| 742 | + ): |
| 743 | + result = _get_authz_accessible_courses_list(request) |
| 744 | + |
| 745 | + mock_get_keys.assert_called_once_with(org_scope) |
| 746 | + self.assertEqual(result, set(authz_keys)) |
| 747 | + |
| 748 | + def test_get_authz_accessible_courses_list_org_scope_respects_toggle(self): |
| 749 | + """ |
| 750 | + If the authz toggle is enabled only for a subset of org courses, only |
| 751 | + those course keys should appear in the resulting authz keys. |
| 752 | + """ |
| 753 | + authz_keys, _, authz_courses, _ = self._create_courses() |
| 754 | + # enable only the first and third course keys |
| 755 | + enabled_keys = {str(authz_keys[0]), str(authz_keys[2])} |
| 756 | + org_scope = OrgCourseOverviewGlobData(external_key='course-v1:Org1+*') |
| 757 | + |
| 758 | + request = self._make_request(self.authorized_user) |
| 759 | + |
| 760 | + with patch( |
| 761 | + "cms.djangoapps.contentstore.views.course.get_scopes_for_user_and_permission", |
| 762 | + return_value=[org_scope], |
| 763 | + ), patch( |
| 764 | + "cms.djangoapps.contentstore.views.course._get_course_keys_for_org_scope", |
| 765 | + return_value=authz_keys, |
| 766 | + ), patch.object( |
| 767 | + core_toggles.AUTHZ_COURSE_AUTHORING_FLAG, |
| 768 | + "is_enabled", |
| 769 | + side_effect=self._mock_authz_toggle(enabled_keys), |
| 770 | + ): |
| 771 | + result = _get_authz_accessible_courses_list(request) |
| 772 | + |
| 773 | + expected = {authz_keys[0], authz_keys[2]} |
| 774 | + self.assertEqual(result, expected) |
0 commit comments