diff --git a/common/djangoapps/entitlements/tests/factories.py b/common/djangoapps/entitlements/tests/factories.py index cd60f3e83f..949078b258 100644 --- a/common/djangoapps/entitlements/tests/factories.py +++ b/common/djangoapps/entitlements/tests/factories.py @@ -4,6 +4,7 @@ from uuid import uuid4 import factory from factory.fuzzy import FuzzyChoice, FuzzyText +from student.tests.factories import UserFactory from course_modes.helpers import CourseMode from entitlements.models import CourseEntitlement, CourseEntitlementPolicy from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory @@ -29,4 +30,5 @@ class CourseEntitlementFactory(factory.django.DjangoModelFactory): mode = FuzzyChoice([CourseMode.VERIFIED, CourseMode.PROFESSIONAL]) user = factory.SubFactory(UserFactory) order_number = FuzzyText(prefix='TEXTX', chars=string.digits) + enrollment_course_run = None policy = factory.SubFactory(CourseEntitlementPolicyFactory) diff --git a/common/djangoapps/student/tests/test_verification_status.py b/common/djangoapps/student/tests/test_verification_status.py index 08093f2448..f320be7aa2 100644 --- a/common/djangoapps/student/tests/test_verification_status.py +++ b/common/djangoapps/student/tests/test_verification_status.py @@ -371,8 +371,7 @@ class TestCourseVerificationStatus(UrlResetMixin, ModuleStoreTestCase): # Verify that the correct banner color is rendered self.assertContains( response, - "
".format( - self.MODE_CLASSES[status], self.course.id) + "
', response.content) + + @patch('student.views.get_course_runs_for_course') + @patch.object(CourseOverview, 'get_from_id') + def test_unfulfilled_entitlement(self, mock_course_overview, mock_course_runs): + """ + When a learner has an unfulfilled entitlement, their course dashboard should have: + - a hidden 'View Course' button + - the text 'In order to view the course you must select a session:' + - an unhidden course-entitlement-selection-container + """ + CourseEntitlementFactory(user=self.user) + mock_course_overview.return_value = CourseOverviewFactory(start=self.TOMORROW) + mock_course_runs.return_value = [ + { + 'key': 'course-v1:FAKE+FA1-MA1.X+3T2017', + 'enrollment_end': self.TOMORROW, + 'pacing_type': 'instructor_paced', + 'type': 'verified' + } + ] + response = self.client.get(self.path) + self.assertIn('class="enter-course hidden"', response.content) + self.assertIn('You must select a session to access the course.', response.content) + self.assertIn('
', response.content) + + @patch('student.views.get_course_runs_for_course') + @patch.object(CourseOverview, 'get_from_id') + @patch('opaque_keys.edx.keys.CourseKey.from_string') + def test_fulfilled_entitlement(self, mock_course_key, mock_course_overview, mock_course_runs): + """ + When a learner has a fulfilled entitlement, their course dashboard should have: + - exactly one course item, meaning it: + - has an entitlement card + - does NOT have a course card referencing the selected session + - an unhidden Change Session button + """ + mocked_course_overview = CourseOverviewFactory( + start=self.TOMORROW, self_paced=True, enrollment_end=self.TOMORROW + ) + mock_course_overview.return_value = mocked_course_overview + mock_course_key.return_value = mocked_course_overview.id + course_enrollment = CourseEnrollmentFactory(user=self.user, course_id=unicode(mocked_course_overview.id)) + mock_course_runs.return_value = [ + { + 'key': mocked_course_overview.id, + 'enrollment_end': mocked_course_overview.enrollment_end, + 'pacing_type': 'self_paced', + 'type': 'verified' + } + ] + CourseEntitlementFactory(user=self.user, enrollment_course_run=course_enrollment) + response = self.client.get(self.path) + self.assertEqual(response.content.count('
  • '), 1) + self.assertIn(' + % endif +
  • - % if show_courseware_link: + % if show_courseware_link or is_unfulfilled_entitlement: % if course_overview.has_ended(): % if not is_course_blocked: ${_('View Archived Course')} ${course_overview.display_name_with_default} @@ -146,7 +156,7 @@ from util.course import get_link_for_about_page, get_encoded_course_sharing_utm_ % endif % else: % if not is_course_blocked: - ${_('View Course')} ${course_overview.display_name_with_default} + ${_('View Course')} ${course_overview.display_name_with_default} % else: ${_('View Course')} ${course_overview.display_name_with_default} % endif @@ -205,68 +215,91 @@ from util.course import get_link_for_about_page, get_encoded_course_sharing_utm_ % endif % endif - % endif -
    - -
    - +
    +
    + % endif
    - + - +