test_tasks.py 4.49 KB
Newer Older
1 2 3 4
"""
Tests for celery tasks defined in tasks module
"""

5
from ccx_keys.locator import CCXLocator
6 7
from mock_django import mock_signal_receiver

8
from lms.djangoapps.ccx.tasks import send_ccx_course_published
9
from lms.djangoapps.ccx.tests.factories import CcxFactory
10 11
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.content.course_structures.models import CourseStructure
12
from student.roles import CourseCcxCoachRole
13
from student.tests.factories import AdminFactory
14
from xmodule.modulestore.django import SignalHandler
15
from xmodule.modulestore.tests.django_utils import TEST_DATA_SPLIT_MODULESTORE, ModuleStoreTestCase
16 17 18 19 20 21 22 23
from xmodule.modulestore.tests.factories import CourseFactory


class TestSendCCXCoursePublished(ModuleStoreTestCase):
    """unit tests for the send ccx course published task
    """
    MODULESTORE = TEST_DATA_SPLIT_MODULESTORE

24 25
    ENABLED_SIGNALS = ['course_published']

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
    def setUp(self):
        """
        Set up tests
        """
        super(TestSendCCXCoursePublished, self).setUp()
        course = self.course = CourseFactory.create(org="edX", course="999", display_name="Run 666")
        course2 = self.course2 = CourseFactory.create(org="edX", course="999a", display_name="Run 667")
        coach = AdminFactory.create()
        role = CourseCcxCoachRole(course.id)
        role.add_users(coach)
        self.ccx = CcxFactory(course_id=course.id, coach=coach)
        self.ccx2 = CcxFactory(course_id=course.id, coach=coach)
        self.ccx3 = CcxFactory(course_id=course.id, coach=coach)
        self.ccx4 = CcxFactory(course_id=course2.id, coach=coach)

    def call_fut(self, course_key):
        """Call the function under test
        """
        send_ccx_course_published(unicode(course_key))

    def test_signal_not_sent_for_ccx(self):
        """Check that course published signal is not sent when course key is for a ccx
        """
        course_key = CCXLocator.from_course_locator(self.course.id, self.ccx.id)
        with mock_signal_receiver(SignalHandler.course_published) as receiver:
            self.call_fut(course_key)
            self.assertEqual(receiver.call_count, 0)

    def test_signal_sent_for_ccx(self):
        """Check that course published signal is sent when course key is not for a ccx.
        We have 4 ccx's, but only 3 are derived from the course id used here, so call
        count must be 3 to confirm that all derived courses and no more got the signal.
        """
        with mock_signal_receiver(SignalHandler.course_published) as receiver:
            self.call_fut(self.course.id)
            self.assertEqual(receiver.call_count, 3)

    def test_course_structure_generated(self):
        """Check that course structure is generated after course published signal is sent
        """
        ccx_structure = {
            u"blocks": {
                u"ccx-block-v1:edX+999+Run_666+ccx@1+type@course+block@course": {
                    u"block_type": u"course",
                    u"graded": False,
                    u"format": None,
                    u"usage_key": u"ccx-block-v1:edX+999+Run_666+ccx@1+type@course+block@course",
                    u"children": [
                    ],
                    u"display_name": u"Run 666"
                }
            },
            u"root": u"ccx-block-v1:edX+999+Run_666+ccx@1+type@course+block@course"
        }
        course_key = CCXLocator.from_course_locator(self.course.id, self.ccx.id)
        structure = CourseStructure.objects.filter(course_id=course_key)
        # no structure exists before signal is called
        self.assertEqual(len(structure), 0)
        with mock_signal_receiver(SignalHandler.course_published) as receiver:
            self.call_fut(self.course.id)
            self.assertEqual(receiver.call_count, 3)
            structure = CourseStructure.objects.get(course_id=course_key)
            self.assertEqual(structure.structure, ccx_structure)

90 91
    def test_course_overview_cached(self):
        """Check that course overview is cached after course published signal is sent
92 93 94
        """
        course_key = CCXLocator.from_course_locator(self.course.id, self.ccx.id)
        overview = CourseOverview.objects.filter(id=course_key)
95
        self.assertEqual(len(overview), 0)
96 97 98 99
        with mock_signal_receiver(SignalHandler.course_published) as receiver:
            self.call_fut(self.course.id)
            self.assertEqual(receiver.call_count, 3)
            overview = CourseOverview.objects.filter(id=course_key)
100
            self.assertEqual(len(overview), 1)