[LEARNER-5275] Update the endtitlement fulfillment logic to work for users who have enrolled, enrollment window has closed, but upgrade window is still open. These users should be able to use that enrollment on their course run that they are enrolled in.
168 lines
6.1 KiB
Python
168 lines
6.1 KiB
Python
"""
|
|
Test entitlements utilities
|
|
"""
|
|
|
|
from datetime import timedelta
|
|
from opaque_keys.edx.keys import CourseKey
|
|
|
|
from django.conf import settings
|
|
from django.utils.timezone import now
|
|
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
|
|
|
from course_modes.models import CourseMode
|
|
from course_modes.tests.factories import CourseModeFactory
|
|
from openedx.core.djangolib.testing.utils import skip_unless_lms
|
|
from student.tests.factories import (TEST_PASSWORD, UserFactory, CourseOverviewFactory, CourseEnrollmentFactory)
|
|
|
|
# Entitlements is not in CMS' INSTALLED_APPS so these imports will error during test collection
|
|
if settings.ROOT_URLCONF == 'lms.urls':
|
|
from entitlements.tests.factories import CourseEntitlementFactory
|
|
from entitlements.utils import is_course_run_entitlement_fulfillable
|
|
|
|
|
|
@skip_unless_lms
|
|
class TestCourseRunFulfillableForEntitlement(ModuleStoreTestCase):
|
|
"""
|
|
Tests for the utility function is_course_run_entitlement_fulfillable
|
|
"""
|
|
|
|
def setUp(self):
|
|
super(TestCourseRunFulfillableForEntitlement, self).setUp()
|
|
|
|
self.user = UserFactory(is_staff=True)
|
|
self.client.login(username=self.user.username, password=TEST_PASSWORD)
|
|
|
|
def create_course(
|
|
self,
|
|
start_from_now,
|
|
end_from_now,
|
|
enrollment_start_from_now,
|
|
enrollment_end_from_now,
|
|
upgraded_ended_from_now=1
|
|
):
|
|
course_overview = CourseOverviewFactory.create(
|
|
start=now() + timedelta(days=start_from_now),
|
|
end=now() + timedelta(days=end_from_now),
|
|
enrollment_start=now() + timedelta(days=enrollment_start_from_now),
|
|
enrollment_end=now() + timedelta(days=enrollment_end_from_now)
|
|
)
|
|
|
|
CourseModeFactory(
|
|
course_id=course_overview.id,
|
|
mode_slug=CourseMode.VERIFIED,
|
|
# This must be in the future to ensure it is returned by downstream code.
|
|
expiration_datetime=now() + timedelta(days=upgraded_ended_from_now)
|
|
)
|
|
return course_overview
|
|
|
|
def test_course_run_fulfillable(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-2,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-1,
|
|
enrollment_end_from_now=1
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_missing_overview_not_fulfillable(self):
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(
|
|
CourseKey.from_string('course-v1:edx+FakeCourse+3T2017'),
|
|
entitlement
|
|
)
|
|
|
|
def test_course_run_not_fulfillable_no_start_date(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-2,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-1,
|
|
enrollment_end_from_now=1
|
|
)
|
|
course_overview.start = None
|
|
course_overview.save()
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_not_fulfillable_run_ended(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=-1,
|
|
enrollment_start_from_now=-3,
|
|
enrollment_end_from_now=-2
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_not_fulfillable_enroll_period_ended(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-2,
|
|
enrollment_end_from_now=-1
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_not_fulfillable_enrollment_start_in_future(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=2,
|
|
enrollment_end_from_now=4
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_fulfillable_user_enrolled(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-2,
|
|
enrollment_end_from_now=1
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
# Enroll User in the Course, but do not update the entitlement
|
|
CourseEnrollmentFactory.create(user=entitlement.user, course_id=course_overview.id)
|
|
|
|
assert is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_fulfillable_enrollment_ended_upgrade_open(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-2,
|
|
enrollment_end_from_now=-1,
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
# Enroll User in the Course, but do not update the entitlement
|
|
CourseEnrollmentFactory.create(user=entitlement.user, course_id=course_overview.id)
|
|
|
|
assert is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|
|
|
|
def test_course_run_not_fulfillable_upgrade_ended(self):
|
|
course_overview = self.create_course(
|
|
start_from_now=-3,
|
|
end_from_now=2,
|
|
enrollment_start_from_now=-2,
|
|
enrollment_end_from_now=1,
|
|
upgraded_ended_from_now=-1
|
|
)
|
|
|
|
entitlement = CourseEntitlementFactory.create(mode=CourseMode.VERIFIED)
|
|
|
|
assert not is_course_run_entitlement_fulfillable(course_overview.id, entitlement)
|