def test_unpublishing_proctored_exam(self): """ Make sure that if we publish and then unpublish a proctored exam, the exam record stays, but is marked as is_active=False """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') sequence = ItemFactory.create(parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_enabled=True) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) sequence.is_time_limited = False sequence.is_proctored_enabled = False self.store.update_item(sequence, self.user.id) listen_for_course_publish(self, self.course.id) self._verify_exam_data(sequence, False)
def test_advanced_setting_off(self): """ Make sure the feature flag is honored """ self.course = CourseFactory.create(org='edX', course='901', run='test_run2', enable_proctored_exams=False) chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create(parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_enabled=True) listen_for_course_publish(self, self.course.id) # there shouldn't be any exams because we haven't enabled that # advanced setting flag exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 0)
def test_publishing_exam(self, is_time_limited, default_time_limit_minutes, is_procted_enabled, expected_active, republish): """ Happy path testing to see that when a course is published which contains a proctored exam, it will also put an entry into the exam tables """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') sequence = ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=is_time_limited, default_time_limit_minutes=default_time_limit_minutes, is_proctored_enabled=is_procted_enabled) listen_for_course_publish(self, self.course.id) self._verify_exam_data(sequence, expected_active) if republish: # update the sequence sequence.default_time_limit_minutes += sequence.default_time_limit_minutes self.store.update_item(sequence, self.user.id) # simulate a publish listen_for_course_publish(self, self.course.id) # reverify self._verify_exam_data(sequence, expected_active)
def test_dangling_exam(self): """ Make sure we filter out all dangling items """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create(parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_enabled=True) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) self.store.delete_item(chapter.location, self.user.id) # republish course listen_for_course_publish(self, self.course.id) # look through exam table, the dangling exam # should be disabled exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) exam = exams[0] self.assertEqual(exam['is_active'], False)
def test_dangling_exam(self): """ Make sure we filter out all dangling items """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_exam=True, hide_after_due=False, ) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) self.store.delete_item(chapter.location, self.user.id) # republish course listen_for_course_publish(self, self.course.id) # look through exam table, the dangling exam # should be disabled exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) exam = exams[0] self.assertEqual(exam['is_active'], False)
def test_advanced_settings(self, enable_timed_exams, enable_proctored_exams, expected_count): """ Make sure the feature flag is honored """ self.course = CourseFactory.create( org='edX', course='901', run='test_run2', enable_proctored_exams=enable_proctored_exams, enable_timed_exams=enable_timed_exams ) chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_exam=True, exam_review_rules="allow_use_of_paper", hide_after_due=False, ) listen_for_course_publish(self, self.course.id) # there shouldn't be any exams because we haven't enabled that # advanced setting flag exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), expected_count)
def test_unpublishing_proctored_exam(self): """ Make sure that if we publish and then unpublish a proctored exam, the exam record stays, but is marked as is_active=False """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') sequence = ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_exam=True, hide_after_due=False, ) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 1) sequence.is_time_limited = False sequence.is_proctored_exam = False self.store.update_item(sequence, self.user.id) listen_for_course_publish(self, self.course.id) self._verify_exam_data(sequence, False)
def test_publishing_exam(self, is_time_limited, default_time_limit_minutes, is_procted_enabled, expected_active, republish): """ Happy path testing to see that when a course is published which contains a proctored exam, it will also put an entry into the exam tables """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') sequence = ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=is_time_limited, default_time_limit_minutes=default_time_limit_minutes, is_proctored_enabled=is_procted_enabled ) listen_for_course_publish(self, self.course.id) self._verify_exam_data(sequence, expected_active) if republish: # update the sequence sequence.default_time_limit_minutes += sequence.default_time_limit_minutes self.store.update_item(sequence, self.user.id) # simulate a publish listen_for_course_publish(self, self.course.id) # reverify self._verify_exam_data(sequence, expected_active)
def test_task_indexing_course(self): """ Making sure that the receiver correctly fires off the task when invoked by signal """ searcher = SearchEngine.get_search_engine(CoursewareSearchIndexer.INDEX_NAME) response = searcher.search(field_dictionary={"course": unicode(self.course.id)}) self.assertEqual(response["total"], 0) listen_for_course_publish(self, self.course.id) # Note that this test will only succeed if celery is working in inline mode response = searcher.search(field_dictionary={"course": unicode(self.course.id)}) self.assertEqual(response["total"], 3)
def test_task_indexing_course(self): """ Making sure that the receiver correctly fires off the task when invoked by signal """ searcher = SearchEngine.get_search_engine( CoursewareSearchIndexer.INDEX_NAME) response = searcher.search( field_dictionary={"course": unicode(self.course.id)}) self.assertEqual(response["total"], 0) listen_for_course_publish(self, self.course.id) # Note that this test will only succeed if celery is working in inline mode response = searcher.search( field_dictionary={"course": unicode(self.course.id)}) self.assertEqual(response["total"], 3)
def test_feature_flag_off(self): """ Make sure the feature flag is honored """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create(parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_enabled=True) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 0)
def test_feature_flag_off(self): """ Make sure the feature flag is honored """ chapter = ItemFactory.create(parent=self.course, category='chapter', display_name='Test Section') ItemFactory.create( parent=chapter, category='sequential', display_name='Test Proctored Exam', graded=True, is_time_limited=True, default_time_limit_minutes=10, is_proctored_enabled=True ) listen_for_course_publish(self, self.course.id) exams = get_all_exams_for_course(unicode(self.course.id)) self.assertEqual(len(exams), 0)