diff --git a/openedx/core/djangoapps/catalog/tests/test_utils.py b/openedx/core/djangoapps/catalog/tests/test_utils.py index e8541027aa84f35e29a8a7615ea77210c4702091..0d447cbc13c02fc156d01a055cfdf2117fdf7ce5 100644 --- a/openedx/core/djangoapps/catalog/tests/test_utils.py +++ b/openedx/core/djangoapps/catalog/tests/test_utils.py @@ -481,10 +481,10 @@ class TestSessionEntitlement(CatalogIntegrationMixin, TestCase): """ Test retrieval of visible session entitlements. """ - catalog_course_runs = CourseRunFactory.create() - catalog_course = CourseFactory(course_runs=[catalog_course_runs]) + catalog_course_run = CourseRunFactory.create() + catalog_course = CourseFactory(course_runs=[catalog_course_run]) mock_get_edx_api_data.return_value = catalog_course - course_key = CourseKey.from_string(catalog_course_runs.get('key')) + course_key = CourseKey.from_string(catalog_course_run.get('key')) course_overview = CourseOverviewFactory.create(id=course_key, start=self.tomorrow) CourseModeFactory.create(mode_slug=CourseMode.VERIFIED, min_price=100, course_id=course_overview.id) course_enrollment = CourseEnrollmentFactory( @@ -495,18 +495,23 @@ class TestSessionEntitlement(CatalogIntegrationMixin, TestCase): ) session_entitlements = get_visible_sessions_for_entitlement(entitlement) - self.assertEqual(session_entitlements, [catalog_course_runs]) + self.assertEqual(session_entitlements, [catalog_course_run]) - def test_unpublished_sessions_for_entitlement(self, mock_get_edx_api_data): + def test_get_visible_sessions_for_entitlement_expired_mode(self, mock_get_edx_api_data): """ - Test unpublished course runs are not part of visible session entitlements. + Test retrieval of visible session entitlements. """ - catalog_course_runs = CourseRunFactory.create(status=COURSE_UNPUBLISHED) - catalog_course = CourseFactory(course_runs=[catalog_course_runs]) + catalog_course_run = CourseRunFactory.create() + catalog_course = CourseFactory(course_runs=[catalog_course_run]) mock_get_edx_api_data.return_value = catalog_course - course_key = CourseKey.from_string(catalog_course_runs.get('key')) + course_key = CourseKey.from_string(catalog_course_run.get('key')) course_overview = CourseOverviewFactory.create(id=course_key, start=self.tomorrow) - CourseModeFactory.create(mode_slug=CourseMode.VERIFIED, min_price=100, course_id=course_overview.id) + CourseModeFactory.create( + mode_slug=CourseMode.VERIFIED, + min_price=100, + course_id=course_overview.id, + expiration_datetime=now() - timedelta(days=1) + ) course_enrollment = CourseEnrollmentFactory( user=self.user, course_id=unicode(course_overview.id), mode=CourseMode.VERIFIED ) @@ -514,6 +519,50 @@ class TestSessionEntitlement(CatalogIntegrationMixin, TestCase): user=self.user, enrollment_course_run=course_enrollment, mode=CourseMode.VERIFIED ) + session_entitlements = get_visible_sessions_for_entitlement(entitlement) + self.assertEqual(session_entitlements, [catalog_course_run]) + + def test_unpublished_sessions_for_entitlement_when_enrolled(self, mock_get_edx_api_data): + """ + Test unpublished course runs are part of visible session entitlements when the user + is enrolled. + """ + catalog_course_run = CourseRunFactory.create(status=COURSE_UNPUBLISHED) + catalog_course = CourseFactory(course_runs=[catalog_course_run]) + mock_get_edx_api_data.return_value = catalog_course + course_key = CourseKey.from_string(catalog_course_run.get('key')) + course_overview = CourseOverviewFactory.create(id=course_key, start=self.tomorrow) + CourseModeFactory.create( + mode_slug=CourseMode.VERIFIED, + min_price=100, + course_id=course_overview.id, + expiration_datetime=now() - timedelta(days=1) + ) + course_enrollment = CourseEnrollmentFactory( + user=self.user, course_id=unicode(course_overview.id), mode=CourseMode.VERIFIED + ) + entitlement = CourseEntitlementFactory( + user=self.user, enrollment_course_run=course_enrollment, mode=CourseMode.VERIFIED + ) + + session_entitlements = get_visible_sessions_for_entitlement(entitlement) + self.assertEqual(session_entitlements, [catalog_course_run]) + + def test_unpublished_sessions_for_entitlement(self, mock_get_edx_api_data): + """ + Test unpublished course runs are not part of visible session entitlements when the user + is not enrolled. + """ + catalog_course_run = CourseRunFactory.create(status=COURSE_UNPUBLISHED) + catalog_course = CourseFactory(course_runs=[catalog_course_run]) + mock_get_edx_api_data.return_value = catalog_course + course_key = CourseKey.from_string(catalog_course_run.get('key')) + course_overview = CourseOverviewFactory.create(id=course_key, start=self.tomorrow) + CourseModeFactory.create(mode_slug=CourseMode.VERIFIED, min_price=100, course_id=course_overview.id) + entitlement = CourseEntitlementFactory( + user=self.user, mode=CourseMode.VERIFIED + ) + session_entitlements = get_visible_sessions_for_entitlement(entitlement) self.assertEqual(session_entitlements, []) diff --git a/openedx/core/djangoapps/catalog/utils.py b/openedx/core/djangoapps/catalog/utils.py index 7d05a8cfb8ff992374f74e4bfddb32fab6f54641..ece807f53d81e17efc2c318877cba249be207cf2 100644 --- a/openedx/core/djangoapps/catalog/utils.py +++ b/openedx/core/djangoapps/catalog/utils.py @@ -460,13 +460,15 @@ def get_fulfillable_course_runs_for_entitlement(entitlement, course_runs): course_id=course_id ) is_enrolled_in_mode = is_active and (user_enrollment_mode == entitlement.mode) - if (course_run.get('status') == COURSE_PUBLISHED and - is_course_run_entitlement_fulfillable(course_id, entitlement, search_time)): - if (is_enrolled_in_mode and - entitlement.enrollment_course_run and - course_id == entitlement.enrollment_course_run.course_id): - enrollable_sessions.append(course_run) - elif not is_enrolled_in_mode: + if (is_enrolled_in_mode and + entitlement.enrollment_course_run and + course_id == entitlement.enrollment_course_run.course_id): + # User is enrolled in the course so we should include it in the list of enrollable sessions always + # this will ensure it is available for the UI + enrollable_sessions.append(course_run) + elif (course_run.get('status') == COURSE_PUBLISHED and not + is_enrolled_in_mode and + is_course_run_entitlement_fulfillable(course_id, entitlement, search_time)): enrollable_sessions.append(course_run) enrollable_sessions.sort(key=lambda session: session.get('start'))