def test_rerun_course(self): """ Unit tests for :meth: `contentstore.tasks.rerun_course` """ mongo_course1_id = self.import_and_populate_course() # rerun from mongo into split split_course3_id = CourseLocator(org="edx3", course="split3", run="rerun_test") # Mark the action as initiated fields = {'display_name': 'rerun'} CourseRerunState.objects.initiated(mongo_course1_id, split_course3_id, self.user, fields['display_name']) result = rerun_course.delay(six.text_type(mongo_course1_id), six.text_type(split_course3_id), self.user.id, json.dumps(fields, cls=EdxJSONEncoder)) self.assertEqual(result.get(), "succeeded") self.assertTrue(has_course_author_access(self.user, split_course3_id), "Didn't grant access") rerun_state = CourseRerunState.objects.find_first( course_key=split_course3_id) self.assertEqual(rerun_state.state, CourseRerunUIStateManager.State.SUCCEEDED) # try creating rerunning again to same name and ensure it generates error result = rerun_course.delay(six.text_type(mongo_course1_id), six.text_type(split_course3_id), self.user.id) self.assertEqual(result.get(), "duplicate course") # the below will raise an exception if the record doesn't exist CourseRerunState.objects.find_first( course_key=split_course3_id, state=CourseRerunUIStateManager.State.FAILED) # try to hit the generic exception catch with patch( 'xmodule.modulestore.split_mongo.mongo_connection.MongoConnection.insert_course_index', Mock(side_effect=Exception)): split_course4_id = CourseLocator(org="edx3", course="split3", run="rerun_fail") fields = {'display_name': 'total failure'} CourseRerunState.objects.initiated(split_course3_id, split_course4_id, self.user, fields['display_name']) result = rerun_course.delay(six.text_type(split_course3_id), six.text_type(split_course4_id), self.user.id, json.dumps(fields, cls=EdxJSONEncoder)) self.assertIn("exception: ", result.get()) self.assertIsNone(self.store.get_course(split_course4_id), "Didn't delete course after error") CourseRerunState.objects.find_first( course_key=split_course4_id, state=CourseRerunUIStateManager.State.FAILED)
def test_space_in_asset_name_for_rerun_course(self): """ Tests check the scenario where one course which has an asset with percentage(%) in its name, it should re-run successfully. """ org = 'edX' course_number = 'CS101' course_run = '2015_Q1' display_name = 'rerun' fields = {'display_name': display_name} course_assets = set([u'subs_Introduction%20To%20New.srt.sjson'], ) # Create a course using split modulestore course = CourseFactory.create(org=org, number=course_number, run=course_run, display_name=display_name, default_store=ModuleStoreEnum.Type.split) # add an asset asset_key = course.id.make_asset_key( 'asset', 'subs_Introduction%20To%20New.srt.sjson') content = StaticContent( asset_key, 'Dummy assert', 'application/json', 'dummy data', ) contentstore().save(content) # Get & verify all assets of the course assets, count = contentstore().get_all_content_for_course(course.id) self.assertEqual(count, 1) self.assertEqual( set([asset['asset_key'].block_id for asset in assets]), course_assets) # rerun from split into split split_rerun_id = CourseLocator(org=org, course=course_number, run="2012_Q2") CourseRerunState.objects.initiated(course.id, split_rerun_id, self.user, fields['display_name']) result = rerun_course.delay(six.text_type(course.id), six.text_type(split_rerun_id), self.user.id, json.dumps(fields, cls=EdxJSONEncoder)) # Check if re-run was successful self.assertEqual(result.get(), "succeeded") rerun_state = CourseRerunState.objects.find_first( course_key=split_rerun_id) self.assertEqual(rerun_state.state, CourseRerunUIStateManager.State.SUCCEEDED)