def test_shared_enrollment_engagement(self): """ Verify that correct programs are returned when the user has a single enrollment appearing in multiple programs. """ shared_course_id, solo_course_id = 'org/shared-course/run', 'org/solo-course/run' data = [ factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=shared_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=shared_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=solo_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[factories.RunMode()]), ]), ] self._mock_programs_api(data) # Enrollment for the shared course ID created last (most recently). self._create_enrollments(solo_course_id, shared_course_id) meter = utils.ProgramProgressMeter(self.user) programs = data[:3] self.assertEqual(meter.engaged_programs, programs) self._assert_progress( meter, factories.Progress(id=programs[0]['id'], in_progress=self._extract_names(programs[0], 0)), factories.Progress(id=programs[1]['id'], in_progress=self._extract_names(programs[1], 0)), factories.Progress(id=programs[2]['id'], in_progress=self._extract_names(programs[2], 0))) self.assertEqual(meter.completed_programs, [])
def test_single_program_engagement(self): """ Verify that correct program is returned when the user has a single enrollment appearing in one program. """ course_id = 'org/course/run' data = [ factories.Program(organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[factories.RunMode()]), ]), ] self._mock_programs_api(data) self._create_enrollments(course_id) meter = utils.ProgramProgressMeter(self.user) program = data[0] self.assertEqual(meter.engaged_programs, [program]) self._assert_progress( meter, factories.Progress(id=program['id'], in_progress=self._extract_names(program, 0))) self.assertEqual(meter.completed_programs, [])
def test_nonstandard_run_mode_completion(self, mock_get_completed_courses): """ A valid run mode isn't necessarily verified. Verify that the program can still be completed when this is the case. """ course_id = 'org/course/run' data = [ factories.Program(organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=course_id, mode_slug=MODES.honor), ]), ]), ] self._mock_programs_api(data) enrollments = self._create_enrollments(course_id) meter = utils.ProgramProgressMeter(self.user, enrollments) mock_get_completed_courses.return_value = [ { 'course_id': course_id, 'mode': MODES.honor }, ] program = data[0] self._assert_progress( meter, factories.Progress(id=program['id'], completed=self._extract_names(program, 0)))
def test_mutiple_program_engagement(self): """ Verify that correct programs are returned in the correct order when the user has multiple enrollments. """ first_course_id, second_course_id = 'org/first-course/run', 'org/second-course/run' data = [ factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=first_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=second_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[factories.RunMode()]), ]), ] self._mock_programs_api(data) self._create_enrollments(second_course_id, first_course_id) meter = utils.ProgramProgressMeter(self.user) self._attach_detail_url(data) programs = data[:2] self.assertEqual(meter.engaged_programs(), programs) self._assert_progress( meter, factories.Progress(id=programs[0]['id'], in_progress=self._extract_names(programs[0], 0)), factories.Progress(id=programs[1]['id'], in_progress=self._extract_names(programs[1], 0))) self.assertEqual(meter.completed_programs, [])
def test_simulate_progress(self, mock_get_completed_courses): """Simulate the entirety of a user's progress through a program.""" first_course_id, second_course_id = 'org/first-course/run', 'org/second-course/run' data = [ factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[ factories.RunMode(course_key=first_course_id), ]), factories.CourseCode(run_modes=[ factories.RunMode(course_key=second_course_id), ]), ]), factories.Program( organizations=[factories.Organization()], course_codes=[ factories.CourseCode(run_modes=[factories.RunMode()]), ]), ] self._mock_programs_api(data) # No enrollments, no program engaged. meter = utils.ProgramProgressMeter(self.user) self._assert_progress(meter) self.assertEqual(meter.completed_programs, []) # One enrollment, program engaged. self._create_enrollments(first_course_id) meter = utils.ProgramProgressMeter(self.user) program, program_id = data[0], data[0]['id'] self._assert_progress( meter, factories.Progress(id=program_id, in_progress=self._extract_names(program, 0), not_started=self._extract_names(program, 1))) self.assertEqual(meter.completed_programs, []) # Two enrollments, program in progress. self._create_enrollments(second_course_id) meter = utils.ProgramProgressMeter(self.user) self._assert_progress( meter, factories.Progress(id=program_id, in_progress=self._extract_names(program, 0, 1))) self.assertEqual(meter.completed_programs, []) # One valid certificate earned, one course code complete. mock_get_completed_courses.return_value = [ { 'course_id': first_course_id, 'mode': MODES.verified }, ] meter = utils.ProgramProgressMeter(self.user) self._assert_progress( meter, factories.Progress(id=program_id, completed=self._extract_names(program, 0), in_progress=self._extract_names(program, 1))) self.assertEqual(meter.completed_programs, []) # Invalid certificate earned, still one course code to complete. mock_get_completed_courses.return_value = [ { 'course_id': first_course_id, 'mode': MODES.verified }, { 'course_id': second_course_id, 'mode': MODES.honor }, ] meter = utils.ProgramProgressMeter(self.user) self._assert_progress( meter, factories.Progress(id=program_id, completed=self._extract_names(program, 0), in_progress=self._extract_names(program, 1))) self.assertEqual(meter.completed_programs, []) # Second valid certificate obtained, all course codes complete. mock_get_completed_courses.return_value = [ { 'course_id': first_course_id, 'mode': MODES.verified }, { 'course_id': second_course_id, 'mode': MODES.verified }, ] meter = utils.ProgramProgressMeter(self.user) self._assert_progress( meter, factories.Progress(id=program_id, completed=self._extract_names(program, 0, 1))) self.assertEqual(meter.completed_programs, [program_id])