Files
edx-platform/openedx/features/course_experience/tests/test_course_updates.py

122 lines
5.7 KiB
Python

"""
Tests for the course updates utility methods.
"""
from django.test.client import RequestFactory
from openedx.core.djangoapps.user_api.course_tag.api import get_course_tag, set_course_tag
from openedx.features.course_experience.course_updates import (
dismiss_current_update_for_user, get_current_update_for_user, get_ordered_updates,
)
from openedx.features.course_experience.tests import BaseCourseUpdatesTestCase
class TestCourseUpdatesUtils(BaseCourseUpdatesTestCase):
"""Tests for the course update utility methods."""
UPDATES_TAG = 'view-welcome-message'
@classmethod
def setUpTestData(cls):
super().setUpTestData()
cls.request = RequestFactory().get('/')
cls.request.user = cls.user
def test_update_structure(self):
"""Test that returned item dictionary is as we expect."""
content = '<em>HTML Content</em>'
date = 'January 1, 2000'
self.create_course_update(content, date=date)
updates = get_ordered_updates(self.request, self.course)
self.assertListEqual(updates, [{
'id': 1,
'content': content,
'date': date,
'status': 'visible',
}])
def test_ordered_updates(self):
"""Test that order of returned items follows our rules."""
first = self.create_course_update('2000', date='January 1, 2000')
second = self.create_course_update('2017', date='January 1, 2017')
third = self.create_course_update('Also 2017', date='January 1, 2017')
injected = self.create_course_update('Injected out of order', date='January 1, 2010')
ill_formed = self.create_course_update('Ill-formed date is parsed as now()', date='foobar')
self.create_course_update('Deleted is ignored', deleted=True)
updates = get_ordered_updates(self.request, self.course)
self.assertListEqual(updates, [ill_formed, third, second, injected, first])
def test_replace_urls(self):
"""We should be replacing static URLs with course specific ones."""
self.create_course_update("<img src='/static/img.png'>")
updates = get_ordered_updates(self.request, self.course)
expected = "<img src='/asset-v1:{org}+{course}+{run}+type@asset+block/img.png'>".format(
org=self.course.id.org,
course=self.course.id.course,
run=self.course.id.run,
)
assert updates[0]['content'] == expected
def test_ordered_update_includes_dismissed_updates(self):
"""Ordered update list should still have dismissed updates."""
self.create_course_update('Dismissed')
dismiss_current_update_for_user(self.request, self.course)
updates = get_ordered_updates(self.request, self.course)
assert len(updates) == 1
def test_get_current_update_is_newest(self):
"""Tests that the current update is also the newest."""
self.create_course_update('Oldest', date='January 1, 1900')
self.create_course_update('New', date='January 1, 2017')
self.create_course_update('Oldish', date='January 1, 2000')
assert get_current_update_for_user(self.request, self.course) == 'New'
def test_get_current_update_when_dismissed(self):
"""Tests that a dismissed update is not returned."""
self.create_course_update('Dismissed')
dismiss_current_update_for_user(self.request, self.course)
assert get_current_update_for_user(self.request, self.course) is None
def test_get_current_update_when_dismissed_but_edited(self):
"""Tests that a dismissed but edited update is returned."""
self.create_course_update('Original')
dismiss_current_update_for_user(self.request, self.course)
assert get_current_update_for_user(self.request, self.course) is None
self.edit_course_update(1, content='Edited')
assert get_current_update_for_user(self.request, self.course) is not None
def test_get_current_update_remembers_dismissals(self):
"""Tests that older dismissed updates are remembered."""
self.create_course_update('First')
self.create_course_update('Second')
dismiss_current_update_for_user(self.request, self.course)
self.create_course_update('Third')
dismiss_current_update_for_user(self.request, self.course)
self.create_course_update('Fourth')
assert get_current_update_for_user(self.request, self.course) == 'Fourth'
self.edit_course_update(4, deleted=True)
assert get_current_update_for_user(self.request, self.course) is None
self.edit_course_update(3, deleted=True)
assert get_current_update_for_user(self.request, self.course) is None
self.edit_course_update(2, deleted=True)
assert get_current_update_for_user(self.request, self.course) == 'First'
def test_legacy_ignore_all_support(self):
"""Storing 'False' as the dismissal ignores all updates."""
self.create_course_update('First')
assert get_current_update_for_user(self.request, self.course) == 'First'
set_course_tag(self.user, self.course.id, self.UPDATES_TAG, 'False')
assert get_current_update_for_user(self.request, self.course) is None
def test_dismissal_hashing(self):
"""Confirm that the stored dismissal values are what we expect, to catch accidentally changing formats."""
self.create_course_update('First')
dismiss_current_update_for_user(self.request, self.course)
self.create_course_update('Second')
dismiss_current_update_for_user(self.request, self.course)
tag = get_course_tag(self.user, self.course.id, self.UPDATES_TAG)
assert tag == '7fb55ed0b7a30342ba6da306428cae04,c22cf8376b1893dcfcef0649fe1a7d87'