def test_rerun(self, pacing_type, expected_self_paced_value): course_run = ToyCourseFactory() start = datetime.datetime.now(pytz.UTC).replace(microsecond=0) end = start + datetime.timedelta(days=30) user = UserFactory() role = 'instructor' run = '3T2017' url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)}) data = { 'run': run, 'schedule': { 'start': serialize_datetime(start), 'end': serialize_datetime(end), }, 'team': [ { 'user': user.username, 'role': role, } ], 'pacing_type': pacing_type, } response = self.client.post(url, data, format='json') assert response.status_code == 201 course_run_key = CourseKey.from_string(response.data['id']) course_run = modulestore().get_course(course_run_key) assert course_run.id.run == run assert course_run.self_paced is expected_self_paced_value self.assert_course_run_schedule(course_run, start, end) self.assert_access_role(course_run, user, role) self.assert_course_access_role_count(course_run, 1)
def test_rerun_duplicate_run(self): course_run = ToyCourseFactory() url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)}) data = { 'run': course_run.id.run, } response = self.client.post(url, data, format='json') assert response.status_code == 400 assert response.data == {'run': ['Course run {key} already exists'.format(key=course_run.id)]}
def test_rerun_invalid_number(self): course_run = ToyCourseFactory() url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(course_run.id)}) data = { 'run': '2T2019', 'number': '!@#$%^&*()', } response = self.client.post(url, data, format='json') assert response.status_code == 400 assert response.data == {'non_field_errors': [ 'Invalid key supplied. Ensure there are no special characters in the Course Number.' ]}
def test_rerun(self, pacing_type, expected_self_paced_value, number): original_course_run = ToyCourseFactory() add_organization({ 'name': 'Test Organization', 'short_name': original_course_run.id.org, 'description': 'Testing Organization Description', }) start = datetime.datetime.now(pytz.UTC).replace(microsecond=0) end = start + datetime.timedelta(days=30) user = UserFactory() role = 'instructor' run = '3T2017' url = reverse('api:v1:course_run-rerun', kwargs={'pk': str(original_course_run.id)}) data = { 'run': run, 'schedule': { 'start': serialize_datetime(start), 'end': serialize_datetime(end), }, 'team': [{ 'user': user.username, 'role': role, }], 'pacing_type': pacing_type, } # If number is supplied, this should become the course number used in the course run key # If not, it should default to the original course run number that the rerun is based on. if number: data.update({'number': number}) response = self.client.post(url, data, format='json') assert response.status_code == 201 course_run_key = CourseKey.from_string(response.data['id']) course_run = modulestore().get_course(course_run_key) assert course_run.id.run == run assert course_run.self_paced is expected_self_paced_value if number: assert course_run.id.course == number assert course_run.id.course != original_course_run.id.course else: assert course_run.id.course == original_course_run.id.course self.assert_course_run_schedule(course_run, start, end) self.assert_access_role(course_run, user, role) self.assert_course_access_role_count(course_run, 1) course_orgs = get_course_organizations(course_run_key) self.assertEqual(len(course_orgs), 1) self.assertEqual(course_orgs[0]['short_name'], original_course_run.id.org)
def test_permissions_query_load(self): """ Tests that the permissions queries are cached when rendering numerous discussion XBlocks. """ user = UserFactory() course = ToyCourseFactory() course_key = course.id course_usage_key = self.store.make_course_usage_key(course_key) discussions = [] for counter in range(5): discussion_id = f'test_discussion_{counter}' discussions.append( ItemFactory.create( parent_location=course_usage_key, category='discussion', discussion_id=discussion_id, discussion_category='Category discussion', discussion_target='Target Discussion', )) # 7 queries are required to do first discussion xblock render: # * split_modulestore_django_splitmodulestorecourseindex x2 # * waffle_utils_wafflecourseoverridemodel # * waffle_utils_waffleorgoverridemodel # * waffle_flag # * django_comment_client_role # * lms_xblock_xblockasidesconfig num_queries = 7 for discussion in discussions: discussion_xblock = get_module_for_descriptor_internal( user=user, descriptor=discussion, student_data=mock.Mock(name='student_data'), course_id=course.id, track_function=mock.Mock(name='track_function'), request_token='request_token', ) with self.assertNumQueries(num_queries): fragment = discussion_xblock.render('student_view') # Permissions are cached, so only 1 query required for subsequent renders # to check the waffle flag num_queries = 1 html = fragment.content assert 'data-user-create-comment="false"' in html assert 'data-user-create-subcomment="false"' in html
def test_permissions_query_load(self): """ Tests that the permissions queries are cached when rendering numerous discussion XBlocks. """ user = UserFactory() course = ToyCourseFactory() course_key = course.id course_usage_key = self.store.make_course_usage_key(course_key) discussions = [] for counter in range(5): discussion_id = 'test_discussion_{}'.format(counter) discussions.append( ItemFactory.create( parent_location=course_usage_key, category='discussion', discussion_id=discussion_id, discussion_category='Category discussion', discussion_target='Target Discussion', )) # 2 queries are required to do first discussion xblock render: # * django_comment_client_role # * lms_xblock_xblockasidesconfig # If the query for roles returned a non-empty result set, there would be # an additional query against django_comment_client_permission, but there # are no roles associated with this test. num_queries = 2 for discussion in discussions: discussion_xblock = get_module_for_descriptor_internal( user=user, descriptor=discussion, student_data=mock.Mock(name='student_data'), course_id=course.id, track_function=mock.Mock(name='track_function'), xqueue_callback_url_prefix=mock.Mock( name='xqueue_callback_url_prefix'), request_token='request_token', ) with self.assertNumQueries(num_queries): fragment = discussion_xblock.render('student_view') # Permissions are cached, so no queries required for subsequent renders num_queries = 0 html = fragment.content self.assertIn('data-user-create-comment="false"', html) self.assertIn('data-user-create-subcomment="false"', html)