diff --git a/openedx/core/djangoapps/catalog/tests/factories.py b/openedx/core/djangoapps/catalog/tests/factories.py index 32cf716b16..ae916b92e9 100644 --- a/openedx/core/djangoapps/catalog/tests/factories.py +++ b/openedx/core/djangoapps/catalog/tests/factories.py @@ -82,15 +82,16 @@ class SeatFactory(DictFactoryBase): class CourseRunFactory(DictFactoryBase): + eligible_for_financial_aid = True end = factory.LazyFunction(generate_zulu_datetime) enrollment_end = factory.LazyFunction(generate_zulu_datetime) enrollment_start = factory.LazyFunction(generate_zulu_datetime) image = ImageFactory() + is_enrolled = False key = factory.LazyFunction(generate_course_run_key) marketing_url = factory.Faker('url') - eligible_for_financial_aid = True - seats = factory.LazyFunction(partial(generate_instances, SeatFactory)) pacing_type = 'self_paced' + seats = factory.LazyFunction(partial(generate_instances, SeatFactory)) short_description = factory.Faker('sentence') start = factory.LazyFunction(generate_zulu_datetime) title = factory.Faker('catch_phrase') @@ -112,6 +113,7 @@ class ProgramFactory(DictFactoryBase): banner_image = factory.LazyFunction(generate_sized_stdimage) card_image_url = factory.Faker('image_url') courses = factory.LazyFunction(partial(generate_instances, CourseFactory)) + is_program_eligible_for_one_click_purchase = True marketing_slug = factory.Faker('slug') marketing_url = factory.Faker('url') status = 'active' diff --git a/openedx/core/djangoapps/programs/tests/test_utils.py b/openedx/core/djangoapps/programs/tests/test_utils.py index eb177703a8..0ec5f773d0 100644 --- a/openedx/core/djangoapps/programs/tests/test_utils.py +++ b/openedx/core/djangoapps/programs/tests/test_utils.py @@ -766,7 +766,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): courses=[self._create_course(self.course_price) for __ in range(self.number_of_courses)] ) - def _create_course(self, course_price): + def _create_course(self, course_price, is_enrolled=False): """ Creates the course in mongo and update it with the instructor data. Also creates catalog course with respect to course run. @@ -781,6 +781,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): course = self.update_course(course, self.user.id) course_run = CourseRunFactory( + is_enrolled=is_enrolled, key=unicode(course.id), seats=[SeatFactory(price=course_price)] ) @@ -811,3 +812,29 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase): data = ProgramMarketingDataExtender(self.program, self.user).extend() self.assertEqual(data['courses'][0]['course_runs'][0]['can_enroll'], can_enroll) + + def test_learner_eligibility_for_one_click_purchase(self): + """ + Learner should be eligible for one click purchase if: + - program is eligible for one click purchase + - learner is not enrolled in any of the course runs associated with the program + """ + data = ProgramMarketingDataExtender(self.program, self.user).extend() + self.assertTrue(data['is_learner_eligible_for_one_click_purchase']) + + courses = [self._create_course(self.course_price)] + + program = ProgramFactory( + courses=courses, + is_program_eligible_for_one_click_purchase=False + ) + data = ProgramMarketingDataExtender(program, self.user).extend() + self.assertFalse(data['is_learner_eligible_for_one_click_purchase']) + + courses.append(self._create_course(self.course_price, is_enrolled=True)) + program2 = ProgramFactory( + courses=courses, + is_program_eligible_for_one_click_purchase=True + ) + data = ProgramMarketingDataExtender(program2, self.user).extend() + self.assertFalse(data['is_learner_eligible_for_one_click_purchase']) diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index 6f510ff34d..4bf2664d59 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -504,19 +504,27 @@ class ProgramMarketingDataExtender(ProgramDataExtender): uuid=self.data['uuid'] ) program_instructors = cache.get(cache_key) + is_learner_eligible_for_one_click_purchase = self.data['is_program_eligible_for_one_click_purchase'] for course in self.data['courses']: self._execute('_collect_course', course) if not program_instructors: for course_run in course['course_runs']: self._execute('_collect_instructors', course_run) + if is_learner_eligible_for_one_click_purchase: + is_learner_eligible_for_one_click_purchase = not any( + course_run['is_enrolled'] for course_run in course['course_runs'] + ) if not program_instructors: # We cache the program instructors list to avoid repeated modulestore queries program_instructors = self.instructors.values() cache.set(cache_key, program_instructors, 3600) - self.data['instructors'] = program_instructors + self.data.update({ + 'instructors': program_instructors, + 'is_learner_eligible_for_one_click_purchase': is_learner_eligible_for_one_click_purchase, + }) @classmethod def _handlers(cls, prefix):