123 lines
4.3 KiB
Python
123 lines
4.3 KiB
Python
"""
|
|
Utilities for tests within the django_comment_client module.
|
|
"""
|
|
from mock import patch
|
|
|
|
from django_comment_common.models import ForumsConfig, Role
|
|
from django_comment_common.utils import CourseDiscussionSettings, seed_permissions_roles, set_course_discussion_settings
|
|
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory
|
|
from student.tests.factories import CourseEnrollmentFactory, UserFactory
|
|
from util.testing import UrlResetMixin
|
|
from xmodule.modulestore import ModuleStoreEnum
|
|
from xmodule.modulestore.django import modulestore
|
|
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
|
from xmodule.modulestore.tests.factories import CourseFactory
|
|
|
|
|
|
class ForumsEnableMixin(object):
|
|
"""
|
|
Ensures that the forums are enabled for a given test class.
|
|
"""
|
|
def setUp(self):
|
|
super(ForumsEnableMixin, self).setUp()
|
|
|
|
config = ForumsConfig.current()
|
|
config.enabled = True
|
|
config.save()
|
|
|
|
|
|
class CohortedTestCase(ForumsEnableMixin, UrlResetMixin, SharedModuleStoreTestCase):
|
|
"""
|
|
Sets up a course with a student, a moderator and their cohorts.
|
|
"""
|
|
@classmethod
|
|
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_DISCUSSION_SERVICE": True})
|
|
def setUpClass(cls):
|
|
super(CohortedTestCase, cls).setUpClass()
|
|
cls.course = CourseFactory.create(
|
|
cohort_config={
|
|
"cohorted": True,
|
|
"cohorted_discussions": ["cohorted_topic"]
|
|
}
|
|
)
|
|
cls.course.discussion_topics["cohorted topic"] = {"id": "cohorted_topic"}
|
|
cls.course.discussion_topics["non-cohorted topic"] = {"id": "non_cohorted_topic"}
|
|
fake_user_id = 1
|
|
cls.store.update_item(cls.course, fake_user_id)
|
|
|
|
@patch.dict("django.conf.settings.FEATURES", {"ENABLE_DISCUSSION_SERVICE": True})
|
|
def setUp(self):
|
|
super(CohortedTestCase, self).setUp()
|
|
|
|
seed_permissions_roles(self.course.id)
|
|
self.student = UserFactory.create()
|
|
self.moderator = UserFactory.create()
|
|
CourseEnrollmentFactory(user=self.student, course_id=self.course.id)
|
|
CourseEnrollmentFactory(user=self.moderator, course_id=self.course.id)
|
|
self.moderator.roles.add(Role.objects.get(name="Moderator", course_id=self.course.id))
|
|
self.student_cohort = CohortFactory.create(
|
|
name="student_cohort",
|
|
course_id=self.course.id,
|
|
users=[self.student]
|
|
)
|
|
self.moderator_cohort = CohortFactory.create(
|
|
name="moderator_cohort",
|
|
course_id=self.course.id,
|
|
users=[self.moderator]
|
|
)
|
|
|
|
|
|
# pylint: disable=dangerous-default-value
|
|
def config_course_discussions(
|
|
course,
|
|
discussion_topics={},
|
|
divided_discussions=[],
|
|
always_divide_inline_discussions=False
|
|
):
|
|
"""
|
|
Set discussions and configure divided discussions for a course.
|
|
|
|
Arguments:
|
|
course: CourseDescriptor
|
|
discussion_topics (Dict): Discussion topic names. Picks ids and
|
|
sort_keys automatically.
|
|
divided_discussions: Discussion topics to divide. Converts the
|
|
list to use the same ids as discussion topic names.
|
|
always_divide_inline_discussions (bool): Whether inline discussions
|
|
should be divided by default.
|
|
|
|
Returns:
|
|
Nothing -- modifies course in place.
|
|
"""
|
|
|
|
def to_id(name):
|
|
"""Convert name to id."""
|
|
return topic_name_to_id(course, name)
|
|
|
|
set_course_discussion_settings(
|
|
course.id,
|
|
divided_discussions=[to_id(name) for name in divided_discussions],
|
|
always_divide_inline_discussions=always_divide_inline_discussions,
|
|
division_scheme=CourseDiscussionSettings.COHORT,
|
|
)
|
|
|
|
course.discussion_topics = dict((name, {"sort_key": "A", "id": to_id(name)})
|
|
for name in discussion_topics)
|
|
try:
|
|
# Not implemented for XMLModulestore, which is used by test_cohorts.
|
|
modulestore().update_item(course, ModuleStoreEnum.UserID.test)
|
|
except NotImplementedError:
|
|
pass
|
|
|
|
|
|
def topic_name_to_id(course, name):
|
|
"""
|
|
Given a discussion topic name, return an id for that name (includes
|
|
course and url_name).
|
|
"""
|
|
return "{course}_{run}_{name}".format(
|
|
course=course.location.course,
|
|
run=course.url_name,
|
|
name=name
|
|
)
|