def test_publish_draft_course_when_newdownloadsdisabled_course_exists__should_not_publish( self): update_course_status(2, CourseStatus.NEW_DOWNLOADS_DISABLED) with open(self.course_file_path, 'rb') as course_file: response = self.publish_course(course_file, True) self.assertEqual(400, response.status_code)
def test_publish_draft_course_when_draft_course_exists__should_publish( self): update_course_status(2, CourseStatus.DRAFT) with open(self.course_file_path, 'rb') as course_file: response = self.publish_course(course_file, True) self.assertEqual(201, response.status_code)
def test_archived_course_normal(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.ARCHIVED) response = self.perform_request(1, self.user_auth, self.STR_DOWNLOAD) self.assertEqual(response.status_code, 404) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_publish_live_course_when_archived_course_exists__should_not_publish( self): update_course_status(2, CourseStatus.ARCHIVED) with open(self.course_file_path, 'rb') as course_file: response = self.publish_course(course_file, False) self.assertEqual(400, response.status_code)
def test_publish_draft_course_when_readonly_course_exists__should_not_publish( self): update_course_status(2, CourseStatus.READ_ONLY) with open(self.course_file_path, 'rb') as course_file: response = self.publish_course(course_file, True) self.assertEqual(400, response.status_code)
def test_draft_course_staff(self): update_course_status(1, CourseStatus.DRAFT) response = self.get_view(self.course_download_url_valid, self.staff_user) self.assertEqual(response.status_code, 200) self.assertEqual(response['content-type'], self.STR_EXPECTED_CONTENT_TYPE) update_course_status(1, CourseStatus.LIVE)
def test_read_only_course_normal(self): update_course_status(1, CourseStatus.READ_ONLY) response = self.get_view(self.course_download_url_valid, self.normal_user) self.assertEqual(response.status_code, 200) self.assertEqual(response['content-type'], self.STR_EXPECTED_CONTENT_TYPE) update_course_status(1, CourseStatus.LIVE)
def test_new_downloads_disabled_course_staff(self): update_course_status(1, CourseStatus.NEW_DOWNLOADS_DISABLED) response = self.get_view(self.course_download_url_valid, self.staff_user) self.assertEqual(response.status_code, 200) self.assertEqual(response['content-type'], self.STR_EXPECTED_CONTENT_TYPE) update_course_status(1, CourseStatus.LIVE)
def test_draft_course_teacher(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.DRAFT) response = self.perform_request(1, self.teacher_auth, self.STR_DOWNLOAD) self.assertEqual(response.status_code, 404) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_no_access_for_draft_course(self): url = ('%s?course=' + self.valid_course) \ % reverse(self.STR_URL_REDIRECT) update_course_status(1, CourseStatus.DRAFT) response = self.client.get(url) self.assertRaises(Http404) self.assertTemplateUsed(response, self.STR_LAUNCHER_TEMPLATE) self.assertEqual(200, response.status_code) update_course_status(1, CourseStatus.LIVE)
def test_read_only_course_normal(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.READ_ONLY) response = self.perform_request(1, self.user_auth, self.STR_DOWNLOAD) self.assertHttpOK(response) self.assertEqual(response['content-type'], self.STR_ZIP_EXPECTED_CONTENT_TYPE) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_new_downloads_disabled_course_normal(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.NEW_DOWNLOADS_DISABLED) response = self.perform_request(1, self.user_auth, self.STR_DOWNLOAD) self.assertHttpOK(response) self.assertEqual(response['content-type'], self.STR_ZIP_EXPECTED_CONTENT_TYPE) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_draft_course_staff(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.DRAFT) response = self.perform_request(1, self.staff_auth, self.STR_DOWNLOAD) self.assertHttpOK(response) self.assertEqual(response['content-type'], self.STR_ZIP_EXPECTED_CONTENT_TYPE) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_archived_course_admin(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.ARCHIVED) resource_url = get_api_url('v1', 'course', 1) + self.STR_DOWNLOAD response = self.api_client.get( resource_url, format='json', data=self.admin_auth) self.assertEqual(response.status_code, 404) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_draft_course_normal(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.DRAFT) resource_url = get_api_url('v1', 'course', 1) + self.STR_DOWNLOAD response = self.api_client.get( resource_url, format='json', data=self.user_auth) self.assertEqual(response.status_code, 404) update_course_status(1, CourseStatus.LIVE) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_publish_draft_course_when_live_course_exists__should_publish_and_update_status( self): course_id = 2 update_course_status(course_id, CourseStatus.LIVE) with open(self.course_file_path, 'rb') as course_file: response = self.publish_course(course_file, True) self.assertEqual(201, response.status_code) course = Course.objects.get(pk=course_id) self.assertEqual(CourseStatus.DRAFT, course.status)
def test_draft_course_staff(self): tracker_count_start = Tracker.objects.all().count() update_course_status(1, CourseStatus.DRAFT) resource_url = get_api_url('v1', 'course', 1) + self.STR_DOWNLOAD response = self.api_client.get( resource_url, format='json', data=self.staff_auth) self.assertHttpOK(response) self.assertEqual(response['content-type'], self.STR_ZIP_EXPECTED_CONTENT_TYPE) update_course_status(1, CourseStatus.LIVE) tracker_count_end = Tracker.objects.all().count() self.assertEqual(tracker_count_start, tracker_count_end)
def test_count_new_downloads_enabled(self): # Expected count of courses having new downloads enabled by category (based on test_oppia.json) expected = {'HEAT': 2, 'ANC': 1, 'Antenatal Care': 1, 'NCD': 1, 'reference': 0} # Disable new downloads from 1 of the 4 courses (ref-1) update_course_status(4, CourseStatus.NEW_DOWNLOADS_DISABLED) resp = self.api_client.get( self.url, format='json', data=self.user_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content) response_data = self.deserialize(resp) self.assertTrue('tags' in response_data) for tag in response_data['tags']: self.assertTrue('count_new_downloads_enabled' in tag) self.assertEqual(tag['count_new_downloads_enabled'], expected.get(tag['name']))
def test_archived_course_is_not_included_in_course_statuses_admin_user(self): expected = { 'reference': {'ref-1': 'live'} } # Set draft-test course to archived status update_course_status(3, CourseStatus.ARCHIVED) resp = self.api_client.get( self.url, format='json', data=self.admin_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content) response_data = self.deserialize(resp) self.assertTrue('tags' in response_data) tags = response_data['tags'] course_statuses = next((tag['course_statuses'] for tag in tags if tag['name'] == 'reference')) self.assertEqual(expected.get('reference'), course_statuses)
def test_can_edit_gamification_new_downloads_disabled_course(self): update_course_status(1, CourseStatus.NEW_DOWNLOADS_DISABLED) # admin self.client.force_login(self.admin_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403) # staff self.client.force_login(self.staff_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403) # teacher self.client.force_login(self.teacher_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403) # user self.client.force_login(self.normal_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403)
def test_can_edit_gamification_draft_course(self): update_course_status(1, CourseStatus.DRAFT) # admin self.client.force_login(self.admin_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 200) # staff self.client.force_login(self.staff_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 200) # teacher self.client.force_login(self.teacher_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403) # user self.client.force_login(self.normal_user) response = self.client.get(self.valid_course_url) self.assertEqual(response.status_code, 403)
def test_course_statuses(self): # Expected courses having new downloads disabled by category (based on test_oppia.json) expected = { 'HEAT': {'anc1-all': 'live', 'ncd1-et': 'new_downloads_disabled'}, 'ANC': {'anc1-all': 'live'}, 'Antenatal Care': {'anc1-all': 'live'}, 'NCD': {'ncd1-et': 'new_downloads_disabled'}, 'reference': {'ref-1': 'new_downloads_disabled'} } # Disable new downloads from 2 of the 4 courses (ncd1-et and ref-1) update_course_status(2, CourseStatus.NEW_DOWNLOADS_DISABLED) update_course_status(4, CourseStatus.NEW_DOWNLOADS_DISABLED) resp = self.api_client.get( self.url, format='json', data=self.user_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content) response_data = self.deserialize(resp) self.assertTrue('tags' in response_data) for tag in response_data['tags']: self.assertTrue('course_statuses' in tag) self.assertEqual(expected.get(tag['name']), tag['course_statuses'])
def test_archived_course_is_not_included_in_course_statuses_normal_teacher_with_manager_permissions(self): expected = { 'reference': {'ref-1': 'live'} } # Set draft-test course to archived status update_course_status(3, CourseStatus.ARCHIVED) # Add Viewer permission to normal user CoursePermissions.objects.create( course=Course.objects.get(shortname='draft-test'), user=self.teacher, role=CoursePermissions.MANAGER ) resp = self.api_client.get( self.url, format='json', data=self.admin_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content) response_data = self.deserialize(resp) self.assertTrue('tags' in response_data) tags = response_data['tags'] course_statuses = next((tag['course_statuses'] for tag in tags if tag['name'] == 'reference')) self.assertEqual(expected.get('reference'), course_statuses)
def test_course_get_single_new_downloads_enabled_admin_visible(self): update_course_status(1, CourseStatus.LIVE) resp = self.perform_request(1, self.admin_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content)
def test_download_course_read_only_admin(self): update_course_status(1, CourseStatus.READ_ONLY) resp = self.perform_request(1, self.admin_auth, self.STR_DOWNLOAD) self.assertHttpOK(resp)
def test_download_course_new_downloads_disabled_admin(self): update_course_status(1, CourseStatus.NEW_DOWNLOADS_DISABLED) resp = self.perform_request(1, self.admin_auth, self.STR_DOWNLOAD) self.assertHttpOK(resp)
def test_download_course_new_downloads_enabled_staff(self): update_course_status(1, CourseStatus.LIVE) resp = self.perform_request(1, self.staff_auth, self.STR_DOWNLOAD) self.assertHttpOK(resp)
def test_course_get_single_read_only_admin_visible(self): update_course_status(1, CourseStatus.READ_ONLY) resp = self.perform_request(1, self.admin_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content)
def test_course_get_single_new_downloads_disabled_admin_visible(self): update_course_status(1, CourseStatus.NEW_DOWNLOADS_DISABLED) resp = self.perform_request(1, self.admin_auth) self.assertHttpOK(resp) self.assertValidJSON(resp.content)
def test_archived_course_admin(self): update_course_status(1, CourseStatus.ARCHIVED) response = self.get_view(self.course_download_url_valid, self.admin_user) self.assertEqual(response.status_code, 404) update_course_status(1, CourseStatus.LIVE)