@@ -81,6 +81,7 @@ def setUp(self):
8181 self .admin = AdminFactory .create ()
8282 self .instructor = InstructorFactory .create (course_key = self .course_key )
8383 self .staff = StaffFactory .create (course_key = self .course_key )
84+ self .django_staff_user = UserFactory .create (is_staff = True )
8485 self .data_researcher = UserFactory .create ()
8586 CourseDataResearcherRole (self .course_key ).add_users (self .data_researcher )
8687 CourseInstructorRole (self .proctored_course .id ).add_users (self .instructor )
@@ -118,60 +119,93 @@ def _get_url(self, course_id=None):
118119 course_id = str (self .course_key )
119120 return reverse ('instructor_api_v2:course_metadata' , kwargs = {'course_id' : course_id })
120121
122+ @override_settings (COURSE_AUTHORING_MICROFRONTEND_URL = 'http://localhost:2001/authoring' )
123+ @override_settings (ADMIN_CONSOLE_MICROFRONTEND_URL = 'http://localhost:2025/admin-console' )
121124 def test_get_course_metadata_as_instructor (self ):
122125 """
123126 Test that an instructor can retrieve comprehensive course metadata.
124127 """
125128 self .client .force_authenticate (user = self .instructor )
126129 response = self .client .get (self ._get_url ())
127130
128- self . assertEqual ( response .status_code , status .HTTP_200_OK ) # noqa: PT009
131+ assert response .status_code == status .HTTP_200_OK
129132 data = response .data
130133
131134 # Verify basic course information
132- self . assertEqual ( data ['course_id' ], str (self .course_key )) # noqa: PT009
133- self . assertEqual ( data ['display_name' ], 'Demonstration Course' ) # noqa: PT009
134- self . assertEqual ( data ['org' ], 'edX' ) # noqa: PT009
135- self . assertEqual ( data ['course_number' ], 'DemoX' ) # noqa: PT009
136- self . assertEqual ( data ['course_run' ], 'Demo_Course' ) # noqa: PT009
137- self . assertEqual ( data ['pacing' ], 'instructor' ) # noqa: PT009
135+ assert data ['course_id' ] == str (self .course_key )
136+ assert data ['display_name' ] == 'Demonstration Course'
137+ assert data ['org' ] == 'edX'
138+ assert data ['course_number' ] == 'DemoX'
139+ assert data ['course_run' ] == 'Demo_Course'
140+ assert data ['pacing' ] == 'instructor'
138141
139142 # Verify enrollment counts structure
140- self . assertIn ( 'enrollment_counts' , data ) # noqa: PT009
141- self . assertIn ( 'total' , data ['enrollment_counts' ]) # noqa: PT009
142- self . assertIn ( 'total_enrollment' , data ) # noqa: PT009
143- self . assertGreaterEqual ( data ['total_enrollment' ], 3 ) # noqa: PT009
143+ assert 'enrollment_counts' in data
144+ assert 'total' in data ['enrollment_counts' ]
145+ assert 'total_enrollment' in data
146+ assert data ['total_enrollment' ] >= 3
144147
145148 # Verify role-based enrollment counts are present
146- self . assertIn ( 'learner_count' , data ) # noqa: PT009
147- self . assertIn ( 'staff_count' , data ) # noqa: PT009
148- self . assertEqual ( data ['total_enrollment' ], data ['learner_count' ] + data ['staff_count' ]) # noqa: PT009
149+ assert 'learner_count' in data
150+ assert 'staff_count' in data
151+ assert data ['total_enrollment' ] == data ['learner_count' ] + data ['staff_count' ]
149152
150153 # Verify permissions structure
151- self . assertIn ( 'permissions' , data ) # noqa: PT009
154+ assert 'permissions' in data
152155 permissions_data = data ['permissions' ]
153- self . assertIn ( 'admin' , permissions_data ) # noqa: PT009
154- self . assertIn ( 'instructor' , permissions_data ) # noqa: PT009
155- self . assertIn ( 'staff' , permissions_data ) # noqa: PT009
156- self . assertIn ( 'forum_admin' , permissions_data ) # noqa: PT009
157- self . assertIn ( 'finance_admin' , permissions_data ) # noqa: PT009
158- self . assertIn ( 'sales_admin' , permissions_data ) # noqa: PT009
159- self . assertIn ( 'data_researcher' , permissions_data ) # noqa: PT009
156+ assert 'admin' in permissions_data
157+ assert 'instructor' in permissions_data
158+ assert 'staff' in permissions_data
159+ assert 'forum_admin' in permissions_data
160+ assert 'finance_admin' in permissions_data
161+ assert 'sales_admin' in permissions_data
162+ assert 'data_researcher' in permissions_data
160163
161164 # Verify sections structure
162- self . assertIn ( 'tabs' , data ) # noqa: PT009
163- self . assertIsInstance (data ['tabs' ], list ) # noqa: PT009
165+ assert 'tabs' in data
166+ assert isinstance (data ['tabs' ], list )
164167
165168 # Verify other metadata fields
166- self .assertIn ('num_sections' , data ) # noqa: PT009
167- self .assertIn ('tabs' , data ) # noqa: PT009
168- self .assertIn ('grade_cutoffs' , data ) # noqa: PT009
169- self .assertIn ('course_errors' , data ) # noqa: PT009
170- self .assertIn ('studio_url' , data ) # noqa: PT009
171- self .assertIn ('disable_buttons' , data ) # noqa: PT009
172- self .assertIn ('has_started' , data ) # noqa: PT009
173- self .assertIn ('has_ended' , data ) # noqa: PT009
174- self .assertIn ('analytics_dashboard_message' , data ) # noqa: PT009
169+ assert 'num_sections' in data
170+ assert 'grade_cutoffs' in data
171+ assert 'course_errors' in data
172+ assert 'studio_url' in data
173+ assert 'disable_buttons' in data
174+ assert 'has_started' in data
175+ assert 'has_ended' in data
176+ assert 'analytics_dashboard_message' in data
177+ assert 'studio_grading_url' in data
178+ assert 'admin_console_url' in data
179+
180+ assert data ['studio_grading_url' ] == f'http://localhost:2001/authoring/course/{ self .course .id } /settings/grading'
181+ assert data ['admin_console_url' ] == 'http://localhost:2025/admin-console/authz'
182+
183+ @override_settings (ADMIN_CONSOLE_MICROFRONTEND_URL = 'http://localhost:2025/admin-console' )
184+ def test_admin_console_url_requires_instructor_access (self ):
185+ """
186+ Test that the admin console URL is only available to users with instructor access.
187+ """
188+ # data researcher has access to course but is not an instructor
189+ self .client .force_authenticate (user = self .data_researcher )
190+ response = self .client .get (self ._get_url ())
191+
192+ assert response .status_code == status .HTTP_200_OK
193+ assert 'admin_console_url' in response .data
194+ data = response .data
195+ assert data ['admin_console_url' ] is None
196+
197+ @override_settings (ADMIN_CONSOLE_MICROFRONTEND_URL = 'http://localhost:2025/admin-console' )
198+ def test_django_staff_user_without_instructor_access_can_see_admin_console_url (self ):
199+ """
200+ Test that Django staff users without instructor access can see the admin console URL.
201+ """
202+ self .client .force_authenticate (user = self .django_staff_user )
203+ response = self .client .get (self ._get_url ())
204+
205+ assert response .status_code == status .HTTP_200_OK
206+ assert 'admin_console_url' in response .data
207+ data = response .data
208+ assert data ['admin_console_url' ] == 'http://localhost:2025/admin-console/authz'
175209
176210 def test_get_course_metadata_as_staff (self ):
177211 """
0 commit comments