Files
edx-platform/openedx/features/calendar_sync/tests/test_ics.py
Carla Duarte 01b693a5c3 AA-173: Assignment Type on Dates Page
Appending the assignment type to each graded
assignment on the Dates Tab. Exposed the 'format'
field, which corresponds to the graded assignment type.
2020-06-08 10:27:50 -04:00

101 lines
3.8 KiB
Python

""" Tests for the Calendar Sync .ics methods """
from datetime import datetime, timedelta
import pytz
from django.test import RequestFactory, TestCase
from freezegun import freeze_time
from mock import patch
from lms.djangoapps.courseware.courses import _Assignment
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory
from openedx.features.calendar_sync import get_calendar_event_id
from openedx.features.calendar_sync.ics import generate_ics_for_user_course
from student.tests.factories import UserFactory
class TestIcsGeneration(TestCase):
""" Test icalendar file generator """
def setUp(self):
super().setUp()
freezer = freeze_time(datetime(2013, 10, 3, 8, 24, 55, tzinfo=pytz.utc))
self.addCleanup(freezer.stop)
freezer.start()
self.course = CourseOverviewFactory()
self.user = UserFactory()
self.request = RequestFactory().request()
self.request.site = SiteFactory()
self.request.user = self.user
def make_assigment(
self, block_key=None, title=None, url=None, date=None, contains_gated_content=False, complete=False,
past_due=False, assignment_type=None
):
""" Bundles given info into a namedtupled like get_course_assignments returns """
return _Assignment(block_key, title, url, date, contains_gated_content, complete, past_due, assignment_type)
def expected_ics(self, *assignments):
""" Returns hardcoded expected ics strings for given assignments """
template = '''BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Open edX//calendar_sync//EN
METHOD:REQUEST
BEGIN:VEVENT
SUMMARY:{summary}
DTSTART;VALUE=DATE-TIME:{timedue}
DURATION:P0D
DTSTAMP;VALUE=DATE-TIME:20131003T082455Z
UID:{uid}
DESCRIPTION:{summary} is due for {course}.
ORGANIZER;CN=édX:mailto:registration@example.com
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
'''
return (
template.format(
summary=assignment.title,
course=self.course.display_name_with_default,
timedue=assignment.date.strftime('%Y%m%dT%H%M%SZ'),
uid=get_calendar_event_id(self.user, str(assignment.block_key), 'due', self.request.site.domain),
)
for assignment in assignments
)
def generate_ics(self, *assignments):
""" Uses generate_ics_for_user_course to create ics files for the given assignments """
with patch('openedx.features.calendar_sync.ics.get_course_assignments') as mock_get_assignments:
mock_get_assignments.return_value = assignments
return generate_ics_for_user_course(self.course, self.user, self.request)
def assert_ics(self, *assignments):
""" Asserts that the generated and expected ics for the given assignments are equal """
generated = [ics.decode('utf8').replace('\r\n', '\n') for ics in self.generate_ics(*assignments)]
self.assertEqual(len(generated), len(assignments))
self.assertListEqual(generated, list(self.expected_ics(*assignments)))
def test_generate_ics_for_user_course(self):
""" Tests that a simple sample set of course assignments is generated correctly """
now = datetime.now(pytz.utc)
day1 = now + timedelta(1)
day2 = now + timedelta(1)
self.assert_ics(
self.make_assigment(
block_key='block1',
title='Block1',
url='https://example.com/block1',
date=day1,
),
self.make_assigment(
block_key='block2',
title='Block2',
url='https://example.com/block2',
date=day2,
),
)