utils.py 4.43 KB
Newer Older
1 2 3
"""
Utilities for tests within the django_comment_client module.
"""
4
from mock import patch
5

cahrens committed
6 7
from django_comment_common.models import ForumsConfig, Role
from django_comment_common.utils import CourseDiscussionSettings, seed_permissions_roles, set_course_discussion_settings
8
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory
9
from student.tests.factories import CourseEnrollmentFactory, UserFactory
10
from util.testing import UrlResetMixin
11 12
from xmodule.modulestore import ModuleStoreEnum
from xmodule.modulestore.django import modulestore
13
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
cahrens committed
14
from xmodule.modulestore.tests.factories import CourseFactory
15

16

17 18 19 20 21 22 23 24 25 26 27 28 29
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):
30 31 32
    """
    Sets up a course with a student, a moderator and their cohorts.
    """
33
    @classmethod
34
    @patch.dict("django.conf.settings.FEATURES", {"ENABLE_DISCUSSION_SERVICE": True})
35 36 37
    def setUpClass(cls):
        super(CohortedTestCase, cls).setUpClass()
        cls.course = CourseFactory.create(
38 39 40 41 42
            cohort_config={
                "cohorted": True,
                "cohorted_discussions": ["cohorted_topic"]
            }
        )
43 44 45 46 47 48 49 50 51
        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()

52 53 54 55 56 57
        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))
58 59 60 61 62 63 64 65 66 67
        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]
        )
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122


# 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
    )