def test_mix_of_curriculums_with_and_without_programs(self): course_a = self._create_course_and_runs('a') course_b = self._create_course_and_runs('b') course_c = self._create_course_and_runs('c') program_1 = factories.ProgramFactory(title='program_1') program_2 = factories.ProgramFactory(title='program_2') curriculum_1 = factories.CurriculumFactory(program=program_1) curriculum_2 = factories.CurriculumFactory(program=program_2) curriculum_3 = factories.CurriculumFactory(program=None) curriculum_4 = factories.CurriculumFactory(program=None) self._add_courses_to_curriculum(curriculum_1, course_a, course_b) self._add_courses_to_curriculum(curriculum_2, course_a, course_b) self._add_courses_to_curriculum(curriculum_3, course_a, course_b, course_c) self._add_courses_to_curriculum(curriculum_4, course_a, course_b, course_c) course_run = course_a.course_runs.first() course_run_ca = CourseRun.objects.get(external_key='ext-key-course-ca') message = _duplicate_external_key_message([course_run_ca]) with self.assertNumQueries(FuzzyInt(6, 1)): # 3 Selects with self.assertRaisesRegex(ValidationError, escape(message)): course_run.external_key = course_run_ca.external_key course_run.save() with self.assertNumQueries(FuzzyInt(36, 1)): course_run.external_key = 'some-safe-key' course_run.save()
def test_multiple_collisions__curriculum(self): message = _duplicate_external_key_message( [self.course_run_2b, self.course_run_3c]) with self.assertNumQueries(5): with self.assertRaisesRegex(ValidationError, escape(message)): self.curriculum.program = self.program_2 self.curriculum.save()
def test_create_course_run__curriculum_only(self): course_run, _ = self._create_single_course_curriculum( 'colliding-key', 'curriculum_1') message = _duplicate_external_key_message([course_run]) with self.assertNumQueries(11, threshold=0): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory(course=course_run.course, external_key='colliding-key')
def test_create_course_run__course_run_only(self): course = self._create_course_and_runs() course_run = course.course_runs.first() message = _duplicate_external_key_message([course_run]) with self.assertNumQueries(11, threshold=0): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory( course=course, external_key=course_run.external_key)
def test_modify_curriculum_course_membership__curriculum_only(self): course_run_1, curriculum_1 = self._create_single_course_curriculum('colliding-key', 'curriculum_1') course_run_2, _ = self._create_single_course_curriculum('colliding-key', 'curriculum_2') curriculum_course_membership_2 = course_run_2.course.curriculum_course_membership.first() message = _duplicate_external_key_message([course_run_1]) with self.assertNumQueries(2): with self.assertRaisesRegex(ValidationError, escape(message)): curriculum_course_membership_2.curriculum = curriculum_1 curriculum_course_membership_2.save()
def test_modify_course_run__course_run_only(self): course = self._create_course_and_runs(1) course_run_1a = course.course_runs.get(external_key='ext-key-course-1a') course_run_1b = course.course_runs.get(external_key='ext-key-course-1b') message = _duplicate_external_key_message([course_run_1a]) with self.assertNumQueries(6): with self.assertRaisesRegex(ValidationError, escape(message)): course_run_1b.external_key = 'ext-key-course-1a' course_run_1b.save()
def test_modify_course_run(self, copy_key): copied_course_run = CourseRun.objects.get(key=copy_key) message = _duplicate_external_key_message([copied_course_run]) course_run = CourseRun.objects.get(key='course-run-id/course-2a/test') # This number may seem high but only 3 are select statements caused by the external key signal with self.assertNumQueries(9): with self.assertRaisesRegex(ValidationError, escape(message)): course_run.external_key = copied_course_run.external_key course_run.save()
def test_draft_collides_with_nondraft(self): course_run_1a = self.course_1.course_runs.get(external_key='ext-key-course-1a') message = _duplicate_external_key_message([course_run_1a]) with self.assertNumQueries(12, threshold=0): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory( course=self.course_1, draft=True, external_key='ext-key-course-1a', )
def test_create_course_run(self, copy_key): copied_course_run = CourseRun.objects.get(key=copy_key) message = _duplicate_external_key_message([copied_course_run]) # This number may seem high but only 2 are select statements caused by the external key signal with self.assertNumQueries(12, threshold=0): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory( course=self.course_2, external_key=copied_course_run.external_key, )
def test_modify_course_run__curriculum_only(self): course_run_1a, _ = self._create_single_course_curriculum('colliding-key', 'curriculum_1') course_run_1b = factories.CourseRunFactory( course=course_run_1a.course, external_key='this-is-a-different-external-key' ) message = _duplicate_external_key_message([course_run_1a]) with self.assertNumQueries(6): with self.assertRaisesRegex(ValidationError, escape(message)): course_run_1b.external_key = 'colliding-key' course_run_1b.save()
def test_create_curriculum_course_membership__curriculum_only(self): course_run_1, curriculum_1 = self._create_single_course_curriculum( 'colliding-key', 'curriculum_1') course_run_2 = factories.CourseRunFactory(external_key='colliding-key') message = _duplicate_external_key_message([course_run_1]) with self.assertNumQueries(2): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CurriculumCourseMembershipFactory( course=course_run_2.course, curriculum=curriculum_1, )
def test_modify_curriculum(self): course_run_1a = CourseRun.objects.get(key='course-run-id/course-1a/test') _, curriculum_4 = self._create_single_course_curriculum('ext-key-course-1a', 'curriculum_4') new_program = factories.ProgramFactory( curricula=[curriculum_4] ) message = _duplicate_external_key_message([course_run_1a]) with self.assertNumQueries(5): with self.assertRaisesRegex(ValidationError, escape(message)): curriculum_4.program = self.program_1 curriculum_4.save() curriculum_4.refresh_from_db() assert curriculum_4.program == new_program
def test_create_curriculum_course_membership(self, curriculum_id): new_course_run = factories.CourseRunFactory( external_key='ext-key-course-1a' ) new_course = new_course_run.course course_run_1a = CourseRun.objects.get(key='course-run-id/course-1a/test') message = _duplicate_external_key_message([course_run_1a]) with self.assertNumQueries(2): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CurriculumCourseMembershipFactory( course=new_course, curriculum=self.curriculums[curriculum_id], )
def test_collision_does_not_include_drafts(self): with self.assertNumQueries(80, threshold=0): course_run = factories.CourseRunFactory( course=self.course_1, draft=False, external_key='external-key-drafttest') message = _duplicate_external_key_message([course_run ]) # Not draft_course_run_1 with self.assertNumQueries(11, threshold=0): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory( course=self.course_1, draft=False, external_key='external-key-drafttest')
def test_collision_does_not_include_drafts(self): with self.assertNumQueries(FuzzyInt(75, 1)): course_run = factories.CourseRunFactory( course=self.course_1, draft=False, external_key='external-key-drafttest', end=datetime.datetime(2014, 1, 1, tzinfo=UTC), enrollment_end=datetime.datetime(2014, 1, 1, tzinfo=UTC), ) message = _duplicate_external_key_message([course_run]) # Not draft_course_run_1 with self.assertNumQueries(FuzzyInt(11, 1)): with self.assertRaisesRegex(ValidationError, escape(message)): factories.CourseRunFactory( course=self.course_1, draft=False, external_key='external-key-drafttest', end=datetime.datetime(2014, 1, 1, tzinfo=UTC), enrollment_end=datetime.datetime(2014, 1, 1, tzinfo=UTC), )
def test_multiple_collisions__curriculum_course_membership(self): message = _duplicate_external_key_message([self.course_run_1a, self.course_run_2b]) with self.assertNumQueries(2): with self.assertRaisesRegex(ValidationError, escape(message)): self._add_courses_to_curriculum(self.curriculum_2, self.course)