Files
edx-platform/openedx/features/course_experience/tests/__init__.py
2021-12-06 13:58:45 +05:00

105 lines
4.8 KiB
Python

"""
Common test code for course_experience, like shared base classes.
"""
from common.djangoapps.student.models import CourseEnrollment
from common.djangoapps.student.tests.factories import UserFactory
from lms.djangoapps.courseware.courses import get_course_info_usage_key
from xmodule.modulestore import ModuleStoreEnum # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.exceptions import ItemNotFoundError # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory # lint-amnesty, pylint: disable=wrong-import-order
class BaseCourseUpdatesTestCase(SharedModuleStoreTestCase):
"""Base class for working with course updates."""
@classmethod
def setUpClass(cls):
"""Set up the simplest course possible."""
# pylint: disable=super-method-not-called
with super().setUpClassAndTestData():
with cls.store.default_store(ModuleStoreEnum.Type.split):
cls.course = CourseFactory.create()
with cls.store.bulk_operations(cls.course.id):
# Create a basic course structure
chapter = ItemFactory.create(category='chapter', parent_location=cls.course.location)
section = ItemFactory.create(category='sequential', parent_location=chapter.location)
ItemFactory.create(category='vertical', parent_location=section.location)
@classmethod
def setUpTestData(cls):
"""Set up and enroll our fake user in the course."""
super().setUpTestData()
cls.user = UserFactory(password=cls.TEST_PASSWORD)
CourseEnrollment.enroll(cls.user, cls.course.id)
def setUp(self):
super().setUp()
self.client.login(username=self.user.username, password=self.TEST_PASSWORD)
def tearDown(self):
self.remove_course_updates()
super().tearDown()
def remove_course_updates(self, user=None, course=None):
"""Remove any course updates in the specified course."""
user = user or self.user
course = course or self.course
updates_usage_key = get_course_info_usage_key(course, 'updates')
try:
course_updates = modulestore().get_item(updates_usage_key)
modulestore().delete_item(course_updates.location, user.id)
except (ItemNotFoundError, ValueError):
pass
def edit_course_update(self, index, content=None, course=None, user=None, date=None, deleted=None):
"""Edits a course update item. Only changes explicitly provided parameters."""
user = user or self.user
course = course or self.course
updates_usage_key = get_course_info_usage_key(course, 'updates')
course_updates = modulestore().get_item(updates_usage_key)
for item in course_updates.items:
if item['id'] == index:
if date is not None:
item['date'] = date
if content is not None:
item['content'] = content
if deleted is not None:
item['status'] = 'deleted' if deleted else 'visible'
break
modulestore().update_item(course_updates, user.id)
def create_course_update(self, content, course=None, user=None, date='December 31, 1999', deleted=False):
"""Creates a test welcome message for the specified course."""
user = user or self.user
course = course or self.course
updates_usage_key = get_course_info_usage_key(course, 'updates')
try:
course_updates = modulestore().get_item(updates_usage_key)
except ItemNotFoundError:
course_updates = self.create_course_updates_block(course=course, user=user)
item = {
'id': len(course_updates.items) + 1,
'date': date,
'content': content,
'status': 'deleted' if deleted else 'visible',
}
course_updates.items.append(item)
modulestore().update_item(course_updates, user.id)
return item
def create_course_updates_block(self, course=None, user=None):
"""Create a course updates block."""
user = user or self.user
course = course or self.course
updates_usage_key = get_course_info_usage_key(course, 'updates')
course_updates = modulestore().create_item(
user.id,
updates_usage_key.course_key,
updates_usage_key.block_type,
block_id=updates_usage_key.block_id
)
course_updates.data = ''
return course_updates