90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
"""
|
|
Unit tests for the course_mode signals
|
|
"""
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
import ddt
|
|
from mock import patch
|
|
from pytz import UTC
|
|
|
|
from course_modes.models import CourseMode
|
|
from course_modes.signals import _listen_for_course_publish
|
|
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
|
from xmodule.modulestore.tests.factories import CourseFactory
|
|
|
|
|
|
@ddt.ddt
|
|
class CourseModeSignalTest(ModuleStoreTestCase):
|
|
"""
|
|
Tests for the course_mode course_published signal.
|
|
"""
|
|
|
|
def setUp(self):
|
|
super(CourseModeSignalTest, self).setUp()
|
|
self.end = datetime.now(tz=UTC).replace(microsecond=0) + timedelta(days=7)
|
|
self.course = CourseFactory.create(end=self.end)
|
|
CourseMode.objects.all().delete()
|
|
|
|
def create_mode(
|
|
self,
|
|
mode_slug,
|
|
mode_name,
|
|
min_price=0,
|
|
suggested_prices='',
|
|
currency='usd',
|
|
expiration_datetime=None,
|
|
):
|
|
"""
|
|
Create a new course mode
|
|
"""
|
|
return CourseMode.objects.get_or_create(
|
|
course_id=self.course.id,
|
|
mode_display_name=mode_name,
|
|
mode_slug=mode_slug,
|
|
min_price=min_price,
|
|
suggested_prices=suggested_prices,
|
|
currency=currency,
|
|
_expiration_datetime=expiration_datetime,
|
|
)
|
|
|
|
def test_no_verified_mode(self):
|
|
""" Verify expiration not updated by signal for non-verified mode. """
|
|
course_mode, __ = self.create_mode('honor', 'honor')
|
|
|
|
_listen_for_course_publish('store', self.course.id)
|
|
course_mode.refresh_from_db()
|
|
|
|
self.assertIsNone(course_mode.expiration_datetime)
|
|
|
|
@ddt.data(1, 14, 30)
|
|
def test_verified_mode(self, verification_window):
|
|
""" Verify signal updates expiration to configured time period before course end for verified mode. """
|
|
course_mode, __ = self.create_mode('verified', 'verified', 10)
|
|
self.assertIsNone(course_mode.expiration_datetime)
|
|
|
|
with patch('course_modes.models.CourseModeExpirationConfig.current') as config:
|
|
instance = config.return_value
|
|
instance.verification_window = timedelta(days=verification_window)
|
|
|
|
_listen_for_course_publish('store', self.course.id)
|
|
course_mode.refresh_from_db()
|
|
|
|
self.assertEqual(course_mode.expiration_datetime, self.end - timedelta(days=verification_window))
|
|
|
|
@ddt.data(1, 14, 30)
|
|
def test_verified_mode_explicitly_set(self, verification_window):
|
|
""" Verify signal does not update expiration for verified mode with explicitly set expiration. """
|
|
course_mode, __ = self.create_mode('verified', 'verified', 10)
|
|
course_mode.expiration_datetime_is_explicit = True
|
|
self.assertIsNone(course_mode.expiration_datetime)
|
|
|
|
with patch('course_modes.models.CourseModeExpirationConfig.current') as config:
|
|
instance = config.return_value
|
|
instance.verification_window = timedelta(days=verification_window)
|
|
|
|
_listen_for_course_publish('store', self.course.id)
|
|
course_mode.refresh_from_db()
|
|
|
|
self.assertEqual(course_mode.expiration_datetime, self.end - timedelta(days=verification_window))
|