Files
edx-platform/lms/djangoapps/courseware/tests/test_course_tools.py
Dillon Dumesnil 89c463ff29 refactor: Switch to using course_overview start and end everywhere
In DE-1822, we believed we needed to switch to start_date and end_date.
It was determined this was not the case, so this updates the comment
to ensure future users use the correct fields (start and end) and
updates any pieces of code that may have used start_date or end_date.
2021-05-06 16:42:10 -04:00

192 lines
7.8 KiB
Python

"""
Unit tests for course tools.
"""
import datetime
from unittest.mock import patch
import crum
import pytz
from django.test import RequestFactory
from common.djangoapps.course_modes.models import CourseMode
from common.djangoapps.course_modes.tests.factories import CourseModeFactory
from lms.djangoapps.courseware.course_tools import FinancialAssistanceTool, VerifiedUpgradeTool
from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from common.djangoapps.student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
class VerifiedUpgradeToolTest(SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.now = datetime.datetime.now(pytz.UTC)
cls.course = CourseFactory.create(
org='edX',
number='test',
display_name='Test Course',
self_paced=True,
start=cls.now - datetime.timedelta(days=30),
)
cls.course_overview = CourseOverview.get_from_id(cls.course.id)
def setUp(self):
super().setUp()
self.course_verified_mode = CourseModeFactory(
course_id=self.course.id,
mode_slug=CourseMode.VERIFIED,
expiration_datetime=self.now + datetime.timedelta(days=30),
)
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
self.request = RequestFactory().request()
crum.set_current_request(self.request)
self.addCleanup(crum.set_current_request, None)
self.enrollment = CourseEnrollmentFactory(
course_id=self.course.id,
mode=CourseMode.AUDIT,
course=self.course_overview,
)
self.request.user = self.enrollment.user
def test_tool_visible(self):
assert VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_no_enrollment_exists(self):
self.enrollment.delete()
request = RequestFactory().request()
request.user = UserFactory()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_using_deadline_from_course_mode(self):
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=False)
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_enrollment_is_inactive(self):
self.enrollment.is_active = False
self.enrollment.save()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_already_verified(self):
self.enrollment.mode = CourseMode.VERIFIED
self.enrollment.save()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_no_verified_track(self):
self.course_verified_mode.delete()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_course_deadline_has_passed(self):
self.course_verified_mode.expiration_datetime = self.now - datetime.timedelta(days=1)
self.course_verified_mode.save()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
def test_not_visible_when_course_mode_has_no_deadline(self):
self.course_verified_mode.expiration_datetime = None
self.course_verified_mode.save()
assert not VerifiedUpgradeTool().is_enabled(self.request, self.course.id)
class FinancialAssistanceToolTest(SharedModuleStoreTestCase):
"""
Tests for FinancialAssistanceTool
"""
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.now = datetime.datetime.now(pytz.UTC)
cls.course = CourseFactory.create(
org='edX',
number='test',
display_name='Test Course',
self_paced=True,
)
cls.course_overview = CourseOverview.get_from_id(cls.course.id)
def setUp(self):
super().setUp()
self.course_financial_mode = CourseModeFactory(
course_id=self.course.id,
mode_slug=CourseMode.VERIFIED,
expiration_datetime=self.now + datetime.timedelta(days=1),
)
DynamicUpgradeDeadlineConfiguration.objects.create(enabled=True)
self.request = RequestFactory().request()
crum.set_current_request(self.request)
self.addCleanup(crum.set_current_request, None)
# baseline course enrollment, future upgrade deadline
self.enrollment = CourseEnrollmentFactory(
course_id=self.course.id,
mode=CourseMode.AUDIT,
course=self.course_overview,
)
self.request.user = self.enrollment.user
# enrollment where learner has upgraded
self.enrollment_upgraded = CourseEnrollmentFactory(
course_id=self.course.id,
mode=CourseMode.VERIFIED,
course=self.course_overview,
)
# course enrollment for mock: upgrade deadline in the past
self.enrollment_deadline_past = self.enrollment
self.enrollment_deadline_past.course_upgrade_deadline = self.now - datetime.timedelta(days=1)
self.enrollment_deadline_past.save()
# course enrollment for mock: no upgrade deadline
self.enrollment_deadline_missing = self.enrollment
self.enrollment_deadline_missing.course_upgrade_deadline = None
self.enrollment_deadline_missing.save()
def test_tool_visible_logged_in(self):
self.course_financial_mode.save()
assert FinancialAssistanceTool().is_enabled(self.request, self.course.id)
def test_tool_not_visible_when_not_eligible(self):
self.course_overview.eligible_for_financial_aid = False
self.course_overview.save()
assert not FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id)
def test_tool_not_visible_when_user_not_enrolled(self):
self.course_financial_mode.save()
self.request.user = None
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
# mock the response from get_enrollment to use enrollment with course_upgrade_deadline in the past
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
def test_not_visible_when_upgrade_deadline_has_passed(self, get_enrollment_mock):
get_enrollment_mock.return_value = self.enrollment_deadline_past
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
# mock the response from get_enrollment to use enrollment with no course_upgrade_deadline
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
def test_not_visible_when_no_upgrade_deadline(self, get_enrollment_mock):
get_enrollment_mock.return_value = self.enrollment_deadline_missing
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)
def test_tool_not_visible_when_end_date_passed(self):
self.course_overview.end = self.now - datetime.timedelta(days=30)
self.course_overview.save()
assert not FinancialAssistanceTool().is_enabled(self.request, self.course_overview.id)
# mock the response from get_enrollment to use enrollment where learner upgraded
@patch('lms.djangoapps.courseware.course_tools.CourseEnrollment.get_enrollment')
def test_tool_not_visible_when_already_upgraded(self, get_enrollment_mock):
self.course_financial_mode.save()
get_enrollment_mock.return_value = self.enrollment_upgraded
assert not FinancialAssistanceTool().is_enabled(self.request, self.course.id)