Exemplo n.º 1
0
    def setUp(self):
        super(RolesTest, self).setUp()

        actions.login(COURSE_ADMIN_EMAIL, is_admin=True)
        payload_dict = {
            'name': COURSE_NAME,
            'title': 'Roles Test',
            'admin_email': COURSE_ADMIN_EMAIL
        }
        request = {
            'payload':
            transforms.dumps(payload_dict),
            'xsrf_token':
            crypto.XsrfTokenManager.create_xsrf_token('add-course-put')
        }
        response = self.testapp.put(
            '/rest/courses/item?%s' %
            urllib.urlencode({'request': transforms.dumps(request)}), {})
        self.assertEquals(response.status_int, 200)
        sites.setup_courses('course:/%s::ns_%s, course:/:/' %
                            (COURSE_NAME, COURSE_NAME))
        actions.logout()

        config.Registry.test_overrides[roles.GCB_ADMIN_LIST.name] = (
            '[%s]' % SITE_ADMIN_EMAIL)

        # pylint: disable-msg=protected-access
        self.old_registered_permission = roles.Roles._REGISTERED_PERMISSIONS
        roles.Roles._REGISTERED_PERMISSIONS = {}

        config.Registry.test_overrides[models.CAN_USE_MEMCACHE.name] = True
Exemplo n.º 2
0
    def setUp(self):
        super(WhitelistTest, self).setUp()

        config.Registry.test_overrides[
            course_explorer.GCB_ENABLE_COURSE_EXPLORER_PAGE.name] = True

        actions.login(ADMIN_EMAIL, is_admin=True)
        payload_dict = {
            'name': COURSE_NAME,
            'title': 'Whitelist Test',
            'admin_email': ADMIN_EMAIL
        }
        request = {
            'payload':
            transforms.dumps(payload_dict),
            'xsrf_token':
            crypto.XsrfTokenManager.create_xsrf_token('add-course-put')
        }
        response = self.testapp.put(
            '/rest/courses/item?%s' %
            urllib.urlencode({'request': transforms.dumps(request)}), {})
        self.assertEquals(response.status_int, 200)
        sites.setup_courses('course:/%s::ns_%s, course:/:/' %
                            (COURSE_NAME, COURSE_NAME))
        actions.logout()
    def test_multiple_course(self):
        """Tests when multiple courses are available."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        name = 'Test completed course'
        email = 'Student'

        # Make the course available.
        get_environ_old = sites.ApplicationContext.get_environ

        def get_environ_new(self):
            environ = get_environ_old(self)
            environ['course']['now_available'] = True
            return environ

        sites.ApplicationContext.get_environ = get_environ_new

        actions.login(email)
        actions.register(self, name)
        response = self.get('/explorer/courses')
        # Assert if 'View course list' text is shown on my course page.
        actions.assert_contains('View course list', response.body)

        # Clean up app_context.
        sites.ApplicationContext.get_environ = get_environ_old
        sites.reset_courses()
Exemplo n.º 4
0
 def setUp(self):
     super(GuideTests, self).setUp()
     entries = []
     for name, availability in self.ALL_COURSES:
         self._import_sample_course(ns=name, availability=availability)
         entries.append("course:/%s::ns_%s\n" % (name, name))
     sites.setup_courses("".join(entries))
Exemplo n.º 5
0
 def setUp(self):
     """Configures EtlMainTestCase."""
     super(EtlTestBase, self).setUp()
     self.url_prefix = '/test'
     self.namespace = 'ns_test'
     self.raw = 'course:%s::%s' % (self.url_prefix, self.namespace)
     sites.setup_courses(self.raw + ', course:/:/')
Exemplo n.º 6
0
    def test_unicode_pages(self):
        # TODO(emichael): Remove try, except, else when the unicode issue
        # is fixed in dev_appserver.
        try:
            sites.setup_courses('course:/test::ns_test, course:/:/')
            course = courses.Course(None,
                                    app_context=sites.get_all_courses()[0])
            unit = course.add_unit()
            unit.now_available = True
            lesson_a = course.add_lesson(unit)
            lesson_a.notes = search_unit_test.UNICODE_PAGE_URL
            lesson_a.now_available = True
            course.update_unit(unit)
            course.save()

            self.index_test_course()

            self.swap(logging, 'error', self.error_report)
            response = self.get('/test/search?query=paradox')
            self.assertEqual('', self.logged_error)
            self.assertNotIn('unavailable', response.body)
            self.assertIn('gcb-search-result', response.body)
        except AssertionError:
            # Failing due to known unicode issue
            pass
        else:
            raise AssertionError('Unicode search test should have failed. The '
                                 'issue might now be fixed in dev_appserver.')
Exemplo n.º 7
0
    def test_unicode_pages(self):
        # TODO(emichael): Remove try, except, else when the unicode issue
        # is fixed in dev_appserver.
        try:
            sites.setup_courses('course:/test::ns_test, course:/:/')
            course = courses.Course(None,
                                    app_context=sites.get_all_courses()[0])
            unit = course.add_unit()
            unit.now_available = True
            lesson_a = course.add_lesson(unit)
            lesson_a.notes = search_unit_test.UNICODE_PAGE_URL
            lesson_a.now_available = True
            course.update_unit(unit)
            course.save()

            self.index_test_course()

            self.swap(logging, 'error', self.error_report)
            response = self.get('/test/search?query=paradox')
            self.assertEqual('', self.logged_error)
            self.assertNotIn('unavailable', response.body)
            self.assertIn('gcb-search-result', response.body)
        except AssertionError:
            # Failing due to known unicode issue
            pass
        else:
            raise AssertionError('Unicode search test should have failed. The '
                                 'issue might now be fixed in dev_appserver.')
Exemplo n.º 8
0
    def test_private_units_and_lessons(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])

        unit1 = course.add_unit()
        lesson11 = course.add_lesson(unit1)
        lesson11.notes = search_unit_tests.VALID_PAGE_URL
        lesson11.objectives = search_unit_tests.VALID_PAGE
        lesson11.video = 'portal'
        unit2 = course.add_unit()
        lesson21 = course.add_lesson(unit2)
        lesson21.notes = search_unit_tests.VALID_PAGE_URL
        lesson21.objectives = search_unit_tests.VALID_PAGE
        lesson21.video = 'portal'

        unit1.availability = courses.AVAILABILITY_AVAILABLE
        lesson11.availability = courses.AVAILABILITY_UNAVAILABLE
        course.update_unit(unit1)

        unit2.availability = courses.AVAILABILITY_UNAVAILABLE
        lesson21.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit2)

        course.save()
        self.index_test_course()

        response = self.get('/test/search?query=cogito%20ergo%20sum')
        self.assertNotIn('gcb-search-result', response.body)

        response = self.get('/test/search?query=apple')
        self.assertNotIn('gcb-search-result', response.body)
        self.assertNotIn('v=portal', response.body)
Exemplo n.º 9
0
    def test_get_entity_id_wrapper_in_progress_works(self):
        """Tests get_entity_id wrappers in progress.ProgressStats."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        progress_stats = ProgressStats(course)
        unit1 = course.add_unit()

        assert_equals(
            progress_stats._get_unit_ids_of_type_unit(), [unit1.unit_id])
        assessment1 = course.add_assessment()
        assert_equals(
            progress_stats._get_assessment_ids(), [assessment1.unit_id])
        lesson11 = course.add_lesson(unit1)
        lesson12 = course.add_lesson(unit1)
        assert_equals(
            progress_stats._get_lesson_ids(unit1.unit_id),
            [lesson11.lesson_id, lesson12.lesson_id])
        lesson11.has_activity = True
        course.set_activity_content(lesson11, u'var activity=[]', [])
        assert_equals(
            progress_stats._get_activity_ids(unit1.unit_id, lesson11.lesson_id),
            [0])
        assert_equals(
            progress_stats._get_activity_ids(unit1.unit_id, lesson12.lesson_id),
            [])
Exemplo n.º 10
0
    def test_external_links(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit = course.add_unit()
        unit.availability = courses.AVAILABILITY_AVAILABLE
        lesson_a = course.add_lesson(unit)
        lesson_a.notes = search_unit_tests.VALID_PAGE_URL
        objectives_link = 'http://objectiveslink.null/'
        lesson_a.objectives = '<a href="%s"></a><a href="%s"></a>' % (
            search_unit_tests.LINKED_PAGE_URL, objectives_link)
        lesson_a.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit)
        course.save()

        self.index_test_course()

        response = self.get('/test/search?query=What%20hath%20God%20wrought')
        self.assertIn('gcb-search-result', response.body)

        response = self.get('/test/search?query=Cogito')
        self.assertIn('gcb-search-result', response.body)
        self.assertIn(search_unit_tests.VALID_PAGE_URL, response.body)
        self.assertIn(objectives_link, response.body)
        self.assertNotIn(search_unit_tests.PDF_URL, response.body)

        # If this test fails, indexing will crawl the entire web
        response = self.get('/test/search?query=ABORT')
        self.assertNotIn('gcb-search-result', response.body)
        self.assertNotIn(search_unit_tests.SECOND_LINK_PAGE_URL, response.body)
    def test_private_units_and_lessons(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])

        unit1 = course.add_unit()
        lesson11 = course.add_lesson(unit1)
        lesson11.notes = search_unit_tests.VALID_PAGE_URL
        lesson11.objectives = search_unit_tests.VALID_PAGE
        lesson11.video = 'portal'
        unit2 = course.add_unit()
        lesson21 = course.add_lesson(unit2)
        lesson21.notes = search_unit_tests.VALID_PAGE_URL
        lesson21.objectives = search_unit_tests.VALID_PAGE
        lesson21.video = 'portal'

        unit1.availability = courses.AVAILABILITY_AVAILABLE
        lesson11.availability = courses.AVAILABILITY_UNAVAILABLE
        course.update_unit(unit1)

        unit2.availability = courses.AVAILABILITY_UNAVAILABLE
        lesson21.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit2)

        course.save()
        self.index_test_course()

        response = self.get('/test/search?query=cogito%20ergo%20sum')
        self.assertNotIn('gcb-search-result', response.body)

        response = self.get('/test/search?query=apple')
        self.assertNotIn('gcb-search-result', response.body)
        self.assertNotIn('v=portal', response.body)
Exemplo n.º 12
0
 def setUp(self):
     super(GuideTests, self).setUp()
     entries = []
     for name, availability in self.ALL_COURSES:
         self._import_sample_course(ns=name, availability=availability)
         entries.append('course:/%s::ns_%s\n' % (name, name))
     sites.setup_courses(''.join(entries))
Exemplo n.º 13
0
 def test_compute_entity_dict_constructs_dict_correctly(self):
     sites.setup_courses('course:/test::ns_test, course:/:/')
     course = courses.Course(None, app_context=sites.get_all_courses()[0])
     progress_stats = ProgressStats(course)
     course_dict = progress_stats.compute_entity_dict('course', [])
     assert_equals(course_dict, {
         'label': 'UNTITLED COURSE', 'u': {}, 's': {}})
    def test_external_links(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit = course.add_unit()
        unit.availability = courses.AVAILABILITY_AVAILABLE
        lesson_a = course.add_lesson(unit)
        lesson_a.notes = search_unit_tests.VALID_PAGE_URL
        objectives_link = 'http://objectiveslink.null/'
        lesson_a.objectives = '<a href="%s"></a><a href="%s"></a>' % (
            search_unit_tests.LINKED_PAGE_URL, objectives_link)
        lesson_a.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit)
        course.save()

        self.index_test_course()

        response = self.get('/test/search?query=What%20hath%20God%20wrought')
        self.assertIn('gcb-search-result', response.body)

        response = self.get('/test/search?query=Cogito')
        self.assertIn('gcb-search-result', response.body)
        self.assertIn(search_unit_tests.VALID_PAGE_URL, response.body)
        self.assertIn(objectives_link, response.body)
        self.assertNotIn(search_unit_tests.PDF_URL, response.body)

        # If this test fails, indexing will crawl the entire web
        response = self.get('/test/search?query=ABORT')
        self.assertNotIn('gcb-search-result', response.body)
        self.assertNotIn(search_unit_tests.SECOND_LINK_PAGE_URL, response.body)
Exemplo n.º 15
0
def update_course_config(name, settings):
    """Merge settings into the saved course.yaml configuration.

    Args:
      name: Name of the course.  E.g., 'my_test_course'.
      settings: A nested dict of name/value settings.  Names for items here
          can be found in modules/dashboard/course_settings.py in
          create_course_registry.  See below in simple_add_course()
          for an example.
    Returns:
      Context object for the modified course.
    """
    site_type = 'course'
    namespace = 'ns_%s' % name
    slug = '/%s' % name
    rule = '%s:%s::%s' % (site_type, slug, namespace)

    context = sites.get_all_courses(rule)[0]
    environ = courses.deep_dict_merge(settings,
                                      courses.Course.get_environ(context))
    course = courses.Course(handler=None, app_context=context)
    course.save_settings(environ)
    course_config = config.Registry.test_overrides.get(
        sites.GCB_COURSES_CONFIG.name, 'course:/:/')
    if rule not in course_config:
        course_config = '%s, %s' % (rule, course_config)
        sites.setup_courses(course_config)
    return context
Exemplo n.º 16
0
    def test_multiple_course(self):
        """Tests when multiple courses are available."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        name = 'Test completed course'
        email = 'Student'

        # Make the course available.
        get_environ_old = sites.ApplicationContext.get_environ

        def get_environ_new(self):
            environ = get_environ_old(self)
            environ['course']['now_available'] = True
            return environ

        sites.ApplicationContext.get_environ = get_environ_new

        actions.login(email)
        actions.register(self, name)
        response = self.get('/explorer/courses')
        # Assert if 'View course list' text is shown on my course page.
        actions.assert_contains('View course list', response.body)

        # Clean up app_context.
        sites.ApplicationContext.get_environ = get_environ_old
        sites.reset_courses()
Exemplo n.º 17
0
    def setUp(self):
        super(RolesTest, self).setUp()

        actions.login(COURSE_ADMIN_EMAIL, is_admin=True)
        payload_dict = {
            'name': COURSE_NAME,
            'title': 'Roles Test',
            'admin_email': COURSE_ADMIN_EMAIL}
        request = {
            'payload': transforms.dumps(payload_dict),
            'xsrf_token': crypto.XsrfTokenManager.create_xsrf_token(
                'add-course-put')}
        response = self.testapp.put('/rest/courses/item?%s' % urllib.urlencode(
            {'request': transforms.dumps(request)}), {})
        self.assertEquals(response.status_int, 200)
        sites.setup_courses('course:/%s::ns_%s, course:/:/' % (
                COURSE_NAME, COURSE_NAME))
        actions.logout()

        config.Registry.test_overrides[roles.GCB_ADMIN_LIST.name] = (
            '[%s]' % SITE_ADMIN_EMAIL)

        # pylint: disable-msg=protected-access
        self.old_registered_permission = roles.Roles._REGISTERED_PERMISSIONS
        roles.Roles._REGISTERED_PERMISSIONS = {}

        config.Registry.test_overrides[models.CAN_USE_MEMCACHE.name] = True
Exemplo n.º 18
0
 def test_compute_entity_dict_constructs_dict_correctly(self):
     sites.setup_courses('course:/test::ns_test, course:/:/')
     course = courses.Course(None, app_context=sites.get_all_courses()[0])
     progress_stats = ProgressStats(course)
     course_dict = progress_stats.compute_entity_dict('course', [])
     assert_equals(course_dict, {
         'label': 'UNTITLED COURSE', 'u': {}, 's': {}})
Exemplo n.º 19
0
    def test_get_entity_id_wrapper_in_progress_works(self):
        """Tests get_entity_id wrappers in progress.ProgressStats."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        progress_stats = ProgressStats(course)
        unit1 = course.add_unit()

        # pylint: disable-msg=protected-access
        assert_equals(
            progress_stats._get_unit_ids_of_type_unit(), [unit1.unit_id])
        assessment1 = course.add_assessment()
        assert_equals(
            progress_stats._get_assessment_ids(), [assessment1.unit_id])
        lesson11 = course.add_lesson(unit1)
        lesson12 = course.add_lesson(unit1)
        assert_equals(
            progress_stats._get_lesson_ids(unit1.unit_id),
            [lesson11.lesson_id, lesson12.lesson_id])
        lesson11.has_activity = True
        course.set_activity_content(lesson11, u'var activity=[]', [])
        assert_equals(
            progress_stats._get_activity_ids(unit1.unit_id, lesson11.lesson_id),
            [0])
        assert_equals(
            progress_stats._get_activity_ids(unit1.unit_id, lesson12.lesson_id),
            [])
Exemplo n.º 20
0
    def test_compute_question_stats_on_empty_course_returns_empty_dicts(self):

        sites.setup_courses('course:/test::ns_test, course:/:/')
        app_context = sites.get_all_courses()[0]

        question_stats_computer = analytics.ComputeQuestionStats(app_context)
        id_to_questions, id_to_assessments = question_stats_computer.run()
        assert_equals({}, id_to_questions)
        assert_equals({}, id_to_assessments)
Exemplo n.º 21
0
 def setUp(self):
     super(UnsubscribeHandlerTests, self).setUp()
     self.slug = "a"
     self.namespace = "ns_a"
     sites.setup_courses("course:/%s::%s" % (self.slug, self.namespace))
     self.app_context = actions.MockAppContext(namespace=self.namespace, slug=self.slug)
     self.handler = actions.MockHandler(base_href="http://localhost/", app_context=self.app_context)
     self.email = "*****@*****.**"
     actions.login(self.email, is_admin=True)
    def test_compute_question_stats_on_empty_course_returns_empty_dicts(self):

        sites.setup_courses('course:/test::ns_test, course:/:/')
        app_context = sites.get_all_courses()[0]

        question_stats_computer = (
            synchronous_providers.QuestionStatsGenerator(app_context))
        id_to_questions, id_to_assessments = question_stats_computer.run()
        assert_equals({}, id_to_questions)
        assert_equals({}, id_to_assessments)
Exemplo n.º 23
0
    def test_compute_question_stats_on_empty_course_returns_empty_dicts(self):

        sites.setup_courses('course:/test::ns_test, course:/:/')
        app_context = sites.get_all_courses()[0]

        question_stats_computer = (
            synchronous_providers.QuestionStatsGenerator(app_context))
        id_to_questions, id_to_assessments = question_stats_computer.run()
        assert_equals({}, id_to_questions)
        assert_equals({}, id_to_assessments)
Exemplo n.º 24
0
 def setUp(self):
     super(UnsubscribeHandlerTests, self).setUp()
     self.slug = 'a'
     self.namespace = 'ns_a'
     sites.setup_courses('course:/%s::%s' % (self.slug, self.namespace))
     self.app_context = actions.MockAppContext(namespace=self.namespace,
                                               slug=self.slug)
     self.handler = actions.MockHandler(base_href='http://localhost/',
                                        app_context=self.app_context)
     self.email = '*****@*****.**'
     actions.login(self.email, is_admin=True)
 def setUp(self):
     super(UnsubscribeHandlerTests, self).setUp()
     self.base = '/a'
     self.namespace = 'ns_a'
     sites.setup_courses('course:/a::ns_a')
     self.app_context = actions.MockAppContext(
         namespace=self.namespace, slug='a')
     self.handler = actions.MockHandler(
         base_href='http://localhost/',
         app_context=self.app_context)
     self.email = '*****@*****.**'
     actions.login(self.email, is_admin=True)
Exemplo n.º 26
0
    def setUp(self):
        super(WebservFunctionalTests, self).setUp()
        sites.setup_courses('')

        # make sure we know of all course availability values; if these change,
        # we will need to revise how to apply rights to webserv content
        self.assertEquals([
            'private', 'public', 'registration_optional',
            'registration_required'
        ], (sorted(courses.COURSE_AVAILABILITY_POLICIES.keys())))
        self.assertEquals(['course', 'private', 'public'],
                          sorted(courses.AVAILABILITY_VALUES))
Exemplo n.º 27
0
    def setUp(self):
        super(WebservFunctionalTests, self).setUp()
        sites.setup_courses('')

        # make sure we know of all course availability values; if these change,
        # we will need to revise how to apply rights to webserv content
        self.assertEquals([
            'private', 'public',
            'registration_optional', 'registration_required'], (
                sorted(courses.COURSE_AVAILABILITY_POLICIES.keys())))
        self.assertEquals(
            ['course', 'private', 'public'],
            sorted(courses.AVAILABILITY_VALUES))
Exemplo n.º 28
0
    def setUp(self):
        """Configures EtlMainTestCase."""
        super(EtlTestBase, self).setUp()
        self.test_environ = copy.deepcopy(os.environ)
        # In etl.main, use test auth scheme to avoid interactive login.
        self.test_environ['SERVER_SOFTWARE'] = remote.TEST_SERVER_SOFTWARE
        self.url_prefix = '/test'
        self.namespace = 'ns_test'
        self.raw = 'course:%s::%s' % (self.url_prefix, self.namespace)
        self.swap(os, 'environ', self.test_environ)
        sites.setup_courses(self.raw + ', course:/:/')

        self.log_stream = cStringIO.StringIO()
        self.old_log_handlers = list(etl._LOG.handlers)
        etl._LOG.handlers = [logging.StreamHandler(self.log_stream)]
Exemplo n.º 29
0
    def setUp(self):
        """Configures EtlMainTestCase."""
        super(EtlTestBase, self).setUp()
        self.test_environ = copy.deepcopy(os.environ)
        # In etl.main, use test auth scheme to avoid interactive login.
        self.test_environ['SERVER_SOFTWARE'] = remote.TEST_SERVER_SOFTWARE
        self.url_prefix = '/test'
        self.namespace = 'ns_test'
        self.raw = 'course:%s::%s' % (self.url_prefix, self.namespace)
        self.swap(os, 'environ', self.test_environ)
        sites.setup_courses(self.raw + ', course:/:/')

        self.log_stream = cStringIO.StringIO()
        self.old_log_handlers = list(etl._LOG.handlers)
        etl._LOG.handlers = [logging.StreamHandler(self.log_stream)]
Exemplo n.º 30
0
    def test_get_summarized_question_list_from_event(self):
        """Tests the transform functions per event type."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])

        question_aggregator = (synchronous_providers.QuestionStatsGenerator
                               .MultipleChoiceQuestionAggregator(course))

        event_payloads = open(os.path.join(
            appengine_config.BUNDLE_ROOT,
            'tests/unit/common/event_payloads.json')).read()

        event_payload_dict = transforms.loads(event_payloads)
        for event_info in event_payload_dict.values():
            questions = question_aggregator._process_event(
                event_info['event_source'], event_info['event_data'])
            assert_equals(questions, event_info['transformed_dict_list'])
    def test_get_summarized_question_list_from_event(self):
        """Tests the transform functions per event type."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])

        question_aggregator = (synchronous_providers.QuestionStatsGenerator.
                               MultipleChoiceQuestionAggregator(course))

        event_payloads = open(
            os.path.join(appengine_config.BUNDLE_ROOT,
                         'tests/unit/common/event_payloads.json')).read()

        event_payload_dict = transforms.loads(event_payloads)
        for event_info in event_payload_dict.values():
            questions = question_aggregator._process_event(
                event_info['event_source'], event_info['event_data'])
            assert_equals(questions, event_info['transformed_dict_list'])
    def test_unicode_pages(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit = course.add_unit()
        unit.availability = courses.AVAILABILITY_AVAILABLE
        lesson_a = course.add_lesson(unit)
        lesson_a.notes = search_unit_tests.UNICODE_PAGE_URL
        lesson_a.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit)
        course.save()

        self.index_test_course()

        self.swap(logging, 'error', self.error_report)
        response = self.get('/test/search?query=paradox')
        self.assertEqual('', self.logged_error)
        self.assertNotIn('unavailable', response.body)
        self.assertIn('gcb-search-result', response.body)
Exemplo n.º 33
0
    def test_youtube(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        default_namespace = namespace_manager.get_namespace()
        try:
            namespace_manager.set_namespace('ns_test')

            course = courses.Course(None,
                                    app_context=sites.get_all_courses()[0])
            unit = course.add_unit()
            unit.now_available = True
            lesson_a = course.add_lesson(unit)
            lesson_a.video = 'portal'
            lesson_a.now_available = True
            lesson_b = course.add_lesson(unit)
            lesson_b.objectives = '<gcb-youtube videoid="glados">'
            lesson_b.now_available = True
            course.update_unit(unit)
            course.save()

            entity = announcements.AnnouncementEntity()
            entity.html = '<gcb-youtube videoid="aperature">'
            entity.title = 'Sample Announcement'
            entity.date = datetime.datetime.now().date()
            entity.is_draft = False
            entity.put()

            self.index_test_course()

            response = self.get('/test/search?query=apple')
            self.assertIn('gcb-search-result', response.body)
            self.assertIn('start=3.14', response.body)
            self.assertIn('v=portal', response.body)
            self.assertIn('v=glados', response.body)
            self.assertIn('v=aperature', response.body)
            self.assertIn('lemon', response.body)
            self.assertIn('Medicus Quis', response.body)
            self.assertIn('- YouTube', response.body)
            self.assertIn('http://thumbnail.null', response.body)

            # Test to make sure empty notes field doesn't cause a urlfetch
            response = self.get('/test/search?query=cogito')
            self.assertNotIn('gcb-search-result', response.body)
        finally:
            namespace_manager.set_namespace(default_namespace)
    def test_youtube(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        default_namespace = namespace_manager.get_namespace()
        try:
            namespace_manager.set_namespace('ns_test')

            course = courses.Course(None,
                                    app_context=sites.get_all_courses()[0])
            unit = course.add_unit()
            unit.now_available = True
            lesson_a = course.add_lesson(unit)
            lesson_a.video = 'portal'
            lesson_a.now_available = True
            lesson_b = course.add_lesson(unit)
            lesson_b.objectives = '<gcb-youtube videoid="glados">'
            lesson_b.now_available = True
            course.update_unit(unit)
            course.save()

            entity = announcements.AnnouncementEntity()
            entity.html = '<gcb-youtube videoid="aperature">'
            entity.title = 'Sample Announcement'
            entity.date = datetime.datetime.now().date()
            entity.is_draft = False
            entity.put()

            self.index_test_course()

            response = self.get('/test/search?query=apple')
            self.assertIn('gcb-search-result', response.body)
            self.assertIn('start=3.14', response.body)
            self.assertIn('v=portal', response.body)
            self.assertIn('v=glados', response.body)
            self.assertIn('v=aperature', response.body)
            self.assertIn('lemon', response.body)
            self.assertIn('Medicus Quis', response.body)
            self.assertIn('- YouTube', response.body)
            self.assertIn('http://thumbnail.null', response.body)

            # Test to make sure empty notes field doesn't cause a urlfetch
            response = self.get('/test/search?query=cogito')
            self.assertNotIn('gcb-search-result', response.body)
        finally:
            namespace_manager.set_namespace(default_namespace)
Exemplo n.º 35
0
    def test_unicode_pages(self):
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None,
                                app_context=sites.get_all_courses()[0])
        unit = course.add_unit()
        unit.availability = courses.AVAILABILITY_AVAILABLE
        lesson_a = course.add_lesson(unit)
        lesson_a.notes = search_unit_tests.UNICODE_PAGE_URL
        lesson_a.availability = courses.AVAILABILITY_AVAILABLE
        course.update_unit(unit)
        course.save()

        self.index_test_course()

        self.swap(logging, 'error', self.error_report)
        response = self.get('/test/search?query=paradox')
        self.assertEqual('', self.logged_error)
        self.assertNotIn('unavailable', response.body)
        self.assertIn('gcb-search-result', response.body)
Exemplo n.º 36
0
    def setUp(self):
        super(WhitelistTest, self).setUp()

        config.Registry.test_overrides[
            course_explorer.GCB_ENABLE_COURSE_EXPLORER_PAGE.name] = True

        actions.login(ADMIN_EMAIL, is_admin=True)
        payload_dict = {
            'name': COURSE_NAME,
            'title': 'Whitelist Test',
            'admin_email': ADMIN_EMAIL}
        request = {
            'payload': transforms.dumps(payload_dict),
            'xsrf_token': crypto.XsrfTokenManager.create_xsrf_token(
                'add-course-put')}
        response = self.testapp.put('/rest/courses/item?%s' % urllib.urlencode(
            {'request': transforms.dumps(request)}), {})
        self.assertEquals(response.status_int, 200)
        sites.setup_courses('course:/%s::ns_%s, course:/:/' % (
                COURSE_NAME, COURSE_NAME))
        actions.logout()
Exemplo n.º 37
0
    def setUp(self):
        super(RolesTest, self).setUp()

        actions.login(COURSE_ADMIN_EMAIL, is_admin=True)
        payload_dict = {"name": COURSE_NAME, "title": "Roles Test", "admin_email": COURSE_ADMIN_EMAIL}
        request = {
            "payload": transforms.dumps(payload_dict),
            "xsrf_token": crypto.XsrfTokenManager.create_xsrf_token("add-course-put"),
        }
        response = self.testapp.put(
            "/rest/courses/item?%s" % urllib.urlencode({"request": transforms.dumps(request)}), {}
        )
        self.assertEquals(response.status_int, 200)
        sites.setup_courses("course:/%s::ns_%s, course:/:/" % (COURSE_NAME, COURSE_NAME))
        actions.logout()

        config.Registry.test_overrides[roles.GCB_ADMIN_LIST.name] = "[%s]" % SITE_ADMIN_EMAIL

        self.old_registered_permission = roles.Roles._REGISTERED_PERMISSIONS
        roles.Roles._REGISTERED_PERMISSIONS = {}

        config.Registry.test_overrides[models.CAN_USE_MEMCACHE.name] = True
Exemplo n.º 38
0
    def test_get_entity_label_wrapper_in_progress_works(self):
        """Tests get_entity_label wrappers in progress.ProgressStats."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        progress_stats = ProgressStats(course)
        unit1 = course.add_unit()

        # pylint: disable-msg=protected-access
        assert_equals(
            progress_stats._get_unit_label(unit1.unit_id),
            'Unit %s' % unit1.index)
        assessment1 = course.add_assessment()
        assert_equals(
            progress_stats._get_assessment_label(assessment1.unit_id),
            assessment1.title)
        lesson11 = course.add_lesson(unit1)
        lesson12 = course.add_lesson(unit1)
        assert_equals(
            progress_stats._get_lesson_label(unit1.unit_id, lesson11.lesson_id),
            lesson11.index)
        lesson11.has_activity = True
        course.set_activity_content(lesson11, u'var activity=[]', [])
        assert_equals(
            progress_stats._get_activity_label(
                unit1.unit_id, lesson11.lesson_id, 0), 'L1.1')
        assert_equals(
            progress_stats._get_activity_label(
                unit1.unit_id, lesson12.lesson_id, 0), 'L1.2')
        lesson12.objectives = """
            <question quid="123" weight="1" instanceid=1></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="456" instanceid=2></question-group>
            yet_more_random_text
        """
        assert_equals(
            progress_stats._get_component_ids(
                unit1.unit_id, lesson12.lesson_id, 0), [u'1', u'2'])
Exemplo n.º 39
0
 def _init_course(self, slug):
     course = self._import_sample_course()
     sites.setup_courses('course:/%s::ns_webserv' % slug)
     return course
Exemplo n.º 40
0
    def test_compute_entity_dict_for_non_empty_course_correctly(self):
        """Tests correct entity_structure is built."""

        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        assessment1 = course.add_assessment()
        progress_stats = ProgressStats(course)
        expected = {
            'label': 'UNTITLED COURSE',
            'u':
                [{
                    'child_id': unit1.unit_id,
                    'child_val': {
                        'label': 'Unit %s' % unit1.index,
                        'l': [],
                        's': []
                    }
            }],
            's':
                [{
                    'child_id': assessment1.unit_id,
                    'child_val': {'label': assessment1.title}
            }]
        }
        assert_equals(
            expected, progress_stats.compute_entity_dict('course', []))

        lesson11 = course.add_lesson(unit1)
        expected = {
            's': [{
                'child_id': assessment1.unit_id,
                'child_val': {
                    'label': assessment1.title}
                }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [],
                    'l': [{
                        'child_id': lesson11.lesson_id,
                        'child_val': {
                            'a': [],
                            'h': [{
                                'child_id': 0,
                                'child_val': {
                                    'c': [],
                                    'label': 'L1.1'
                                }}],
                            'label': lesson11.index
                        }}],
                    'label': 'Unit %s' % unit1.index}
                }],
            'label': 'UNTITLED COURSE'
        }
        assert_equals(
            expected, progress_stats.compute_entity_dict('course', []))

        lesson11.objectives = """
            <question quid="123" weight="1" instanceid="1"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="456" instanceid="2"></question-group>
            yet_more_random_text
        """
        expected = {
            'label': 'UNTITLED COURSE',
            's': [{
                'child_id': assessment1.unit_id,
                'child_val': {'label': assessment1.title}}],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    'label': 'Unit %s' % unit1.index,
                    's': [],
                    'l': [{
                        'child_id': lesson11.lesson_id,
                        'child_val': {
                            'label': lesson11.index,
                            'a': [],
                            'h': [{
                                'child_id': 0,
                                'child_val': {
                                    'c': [{
                                        'child_id': '1',
                                        'child_val': {
                                            'label': 'L1.1.1'
                                        }}, {
                                        'child_id': '2',
                                        'child_val': {
                                            'label': 'L1.1.2'
                                        }
                                        }],
                                    'label': 'L1.1'
                                }
                            }]
                        }
                    }]
                }
            }]
        }
        assert_equals(
            expected, progress_stats.compute_entity_dict('course', []))
Exemplo n.º 41
0
    def _get_sample_v15_course(self):
        """Creates a course with different types of questions and returns it."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        lesson1 = course.add_lesson(unit1)
        assessment_old = course.add_assessment()
        assessment_old.title = 'Old assessment'
        assessment_new = course.add_assessment()
        assessment_new.title = 'New assessment'
        assessment_peer = course.add_assessment()
        assessment_peer.title = 'Peer review assessment'

        # Create a multiple choice question.
        mcq_new_dict = {
            'description': 'mcq_new',
            'type': 0,  # Multiple choice question.
            'choices': [{
                'text': 'answer',
                'score': 1.0
            }],
            'version': '1.5'
        }
        mcq_new_dto = models.QuestionDTO(None, mcq_new_dict)
        mcq_new_id = models.QuestionDAO.save(mcq_new_dto)

        # Create a short answer question.
        frq_new_dict = {
            'defaultFeedback': '',
            'rows': 1,
            'description': 'short answer',
            'hint': '',
            'graders': [{
                'matcher': 'case_insensitive',
                'score': '1.0',
                'response': 'hi',
                'feedback': ''
            }],
            'question': 'short answer question',
            'version': '1.5',
            'type': 1,  # Short answer question.
            'columns': 100
        }
        frq_new_dto = models.QuestionDTO(None, frq_new_dict)
        frq_new_id = models.QuestionDAO.save(frq_new_dto)

        # Create a question group.
        question_group_dict = {
            'description': 'question_group',
            'items': [
                {'question': str(mcq_new_id)},
                {'question': str(frq_new_id)},
                {'question': str(mcq_new_id)}
            ],
            'version': '1.5',
            'introduction': ''
        }
        question_group_dto = models.QuestionGroupDTO(None, question_group_dict)
        question_group_id = models.QuestionGroupDAO.save(question_group_dto)

        # Add a MC question and a question group to leesson1.
        lesson1.objectives = """
            <question quid="%s" weight="1" instanceid="QN"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="%s" instanceid="QG"></question-group>
        """ % (mcq_new_id, question_group_id)

        # Add a MC question, a short answer question, and a question group to
        # new style assessment.
        assessment_new.html_content = """
            <question quid="%s" weight="1" instanceid="QN2"></question>
            <question quid="%s" weight="1" instanceid="FRQ2"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="%s" instanceid="QG2"></question-group>
        """ % (mcq_new_id, frq_new_id, question_group_id)

        return course
Exemplo n.º 42
0
 def _init_course(self, slug):
     course = self._import_sample_course()
     sites.setup_courses('course:/%s::ns_webserv' % slug)
     return course
 def setUp(self):
     super(CourseElementsTest, self).setUp()
     sites.setup_courses('course:/test::ns_test, course:/:/')
     self._course = courses.Course(
         None, app_context=sites.get_all_courses()[0])
     actions.login('*****@*****.**', is_admin=True)
Exemplo n.º 44
0
 def test_compute_entity_dict_constructs_dict_for_empty_course_correctly(
     self):
     """Tests correct entity_structure is built."""
     sites.setup_courses('course:/test::ns_test, course:/:/')
     course = courses.Course(None, app_context=sites.get_all_courses()[0])
     unit1 = course.add_unit()
     assessment1 = course.add_assessment()
     progress_stats = ProgressStats(course)
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {'label': 'UNTITLED COURSE', 'u': {unit1.unit_id: {
             'label': 'Unit %s' % unit1.index, 'l': {}}}, 's': {
                 assessment1.unit_id: {'label': assessment1.title}}})
     lesson11 = course.add_lesson(unit1)
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {
             "s": {
                 assessment1.unit_id: {
                     "label": assessment1.title
                 }
             },
             "u": {
                 unit1.unit_id: {
                     "l": {
                         lesson11.lesson_id: {
                             "a": {},
                             "h": {
                                 0: {
                                     "c": {},
                                     "label": "L1.1"
                                 }
                             },
                             "label": lesson11.index
                         }
                     },
                     "label": "Unit %s" % unit1.index
                 }
             },
             'label': 'UNTITLED COURSE'
         })
     lesson11.objectives = """
         <question quid="123" weight="1" instanceid="1"></question>
         random_text
         <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
         more_random_text
         <question-group qgid="456" instanceid="2"></question-group>
         yet_more_random_text
     """
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {
             "s": {
                 assessment1.unit_id: {
                     "label": assessment1.title
                 }
             },
             "u": {
                 unit1.unit_id: {
                     "l": {
                         lesson11.lesson_id: {
                             "a": {},
                             "h": {
                                 0: {
                                     "c": {
                                         u'1': {
                                             "label": "L1.1.1"
                                         },
                                         u'2': {
                                             "label": "L1.1.2"
                                         }
                                     },
                                     "label": "L1.1"
                                 }
                             },
                             "label": lesson11.index
                         }
                     },
                     "label": "Unit %s" % unit1.index
                 }
             },
             "label": 'UNTITLED COURSE'
         })
Exemplo n.º 45
0
 def test_compute_entity_dict_constructs_dict_for_empty_course_correctly(
     self):
     """Tests correct entity_structure is built."""
     sites.setup_courses('course:/test::ns_test, course:/:/')
     course = courses.Course(None, app_context=sites.get_all_courses()[0])
     unit1 = course.add_unit()
     assessment1 = course.add_assessment()
     progress_stats = ProgressStats(course)
     # pylint: disable-msg=g-inconsistent-quotes
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {'label': 'UNTITLED COURSE', 'u': {unit1.unit_id: {
             'label': 'Unit %s' % unit1.index, 'l': {}}}, 's': {
                 assessment1.unit_id: {'label': assessment1.title}}})
     lesson11 = course.add_lesson(unit1)
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {
             "s": {
                 assessment1.unit_id: {
                     "label": assessment1.title
                 }
             },
             "u": {
                 unit1.unit_id: {
                     "l": {
                         lesson11.lesson_id: {
                             "a": {},
                             "h": {
                                 0: {
                                     "c": {},
                                     "label": "L1.1"
                                 }
                             },
                             "label": lesson11.index
                         }
                     },
                     "label": "Unit %s" % unit1.index
                 }
             },
             'label': 'UNTITLED COURSE'
         })
     lesson11.objectives = """
         <question quid="123" weight="1" instanceid="1"></question>
         random_text
         <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
         more_random_text
         <question-group qgid="456" instanceid="2"></question-group>
         yet_more_random_text
     """
     assert_equals(
         progress_stats.compute_entity_dict('course', []),
         {
             "s": {
                 assessment1.unit_id: {
                     "label": assessment1.title
                 }
             },
             "u": {
                 unit1.unit_id: {
                     "l": {
                         lesson11.lesson_id: {
                             "a": {},
                             "h": {
                                 0: {
                                     "c": {
                                         u'1': {
                                             "label": "L1.1.1"
                                         },
                                         u'2': {
                                             "label": "L1.1.2"
                                         }
                                     },
                                     "label": "L1.1"
                                 }
                             },
                             "label": lesson11.index
                         }
                     },
                     "label": "Unit %s" % unit1.index
                 }
             },
             "label": 'UNTITLED COURSE'
         })
Exemplo n.º 46
0
    def _get_sample_v15_course(self):
        """Creates a course with different types of questions and returns it."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        lesson1 = course.add_lesson(unit1)
        assessment_old = course.add_assessment()
        assessment_old.title = 'Old assessment'
        assessment_new = course.add_assessment()
        assessment_new.title = 'New assessment'
        assessment_peer = course.add_assessment()
        assessment_peer.title = 'Peer review assessment'

        # Create a multiple choice question.
        mcq_new_id = 1
        mcq_new_dict = {
            'description': 'mcq_new',
            'type': 0,  # Multiple choice question.
            'choices': [{
                'text': 'answer',
                'score': 1.0
            }],
            'version': '1.5'
        }
        mcq_new_dto = models.QuestionDTO(mcq_new_id, mcq_new_dict)

        # Create a short answer question.
        frq_new_id = 2
        frq_new_dict = {
            'defaultFeedback': '',
            'rows': 1,
            'description': 'short answer',
            'hint': '',
            'graders': [{
                'matcher': 'case_insensitive',
                'score': '1.0',
                'response': 'hi',
                'feedback': ''
            }],
            'question': 'short answer question',
            'version': '1.5',
            'type': 1,  # Short answer question.
            'columns': 100
        }
        frq_new_dto = models.QuestionDTO(frq_new_id, frq_new_dict)

        # Save these questions to datastore.
        models.QuestionDAO.save_all([mcq_new_dto, frq_new_dto])

        # Create a question group.
        question_group_id = 3
        question_group_dict = {
            'description': 'question_group',
            'items': [
                {'question': str(mcq_new_id)},
                {'question': str(frq_new_id)},
                {'question': str(mcq_new_id)}
            ],
            'version': '1.5',
            'introduction': ''
        }
        question_group_dto = models.QuestionGroupDTO(
            question_group_id, question_group_dict)

        # Save the question group to datastore.
        models.QuestionGroupDAO.save_all([question_group_dto])

        # Add a MC question and a question group to leesson1.
        lesson1.objectives = """
            <question quid="1" weight="1" instanceid="QN"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="3" instanceid="QG"></question-group>
        """

        # Add a MC question, a short answer question, and a question group to
        # new style assessment.
        assessment_new.html_content = """
            <question quid="1" weight="1" instanceid="QN2"></question>
            <question quid="2" weight="1" instanceid="FRQ2"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="3" instanceid="QG2"></question-group>
        """

        return course
Exemplo n.º 47
0
    def test_entity_dict_for_pre_post_assessment(self):
        """Tests correct entity_structure is built."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        pre_assessment = course.add_assessment()
        pre_assessment.title = 'Pre Assessment'
        post_assessment = course.add_assessment()
        post_assessment.title = 'Post Assessment'

        # Neither pre nor post assessment for unit
        unit1.pre_assessment = None
        unit1.post_assessment = None
        progress_stats = ProgressStats(course)
        assert_equals(
            progress_stats.compute_entity_dict('course', []),
            {'s': {
                pre_assessment.unit_id: {'label': 'Pre Assessment'},
                post_assessment.unit_id: {'label': 'Post Assessment'}},
             'u': {unit1.unit_id: {
                 's': {},
                 'l': {},
                 'label': 'Unit 1'}},
             'label': 'UNTITLED COURSE'})

        # Only pre
        unit1.pre_assessment = pre_assessment.unit_id
        unit1.post_assessment = None
        progress_stats = ProgressStats(course)
        assert_equals(
            progress_stats.compute_entity_dict('course', []),
            {'s': {post_assessment.unit_id: {'label': 'Post Assessment'}},
             'u': {unit1.unit_id: {
                 's': {pre_assessment.unit_id: {'label': 'Pre Assessment'}},
                 'l': {},
                 'label': 'Unit 1'}},
             'label': 'UNTITLED COURSE'})

        # Only post
        unit1.pre_assessment = None
        unit1.post_assessment = post_assessment.unit_id
        progress_stats = ProgressStats(course)
        assert_equals(
            progress_stats.compute_entity_dict('course', []),
            {'s': {pre_assessment.unit_id: {'label': 'Pre Assessment'}},
             'u': {unit1.unit_id: {
                 's': {post_assessment.unit_id: {'label': 'Post Assessment'}},
                 'l': {},
                 'label': 'Unit 1'}},
             'label': 'UNTITLED COURSE'})

        # Pre and post assessment set.
        unit1.pre_assessment = pre_assessment.unit_id
        unit1.post_assessment = post_assessment.unit_id
        progress_stats = ProgressStats(course)
        assert_equals(
            progress_stats.compute_entity_dict('course', []),
            {'s': {},
             'u': {unit1.unit_id: {
                 's': {
                     pre_assessment.unit_id: {'label': 'Pre Assessment'},
                     post_assessment.unit_id: {'label': 'Post Assessment'}},
                 'l': {},
                 'label': 'Unit 1'}},
             'label': 'UNTITLED COURSE'})
    def test_compute_entity_dict_for_non_empty_course_correctly(self):
        """Tests correct entity_structure is built."""

        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        assessment1 = course.add_assessment()
        progress_stats = ProgressStats(course)
        expected = {
            'label':
            'UNTITLED COURSE',
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    'label': 'Unit %s' % unit1.index,
                    'l': [],
                    's': []
                }
            }],
            's': [{
                'child_id': assessment1.unit_id,
                'child_val': {
                    'label': assessment1.title
                }
            }]
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))

        lesson11 = course.add_lesson(unit1)
        expected = {
            's': [{
                'child_id': assessment1.unit_id,
                'child_val': {
                    'label': assessment1.title
                }
            }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [],
                    'l': [{
                        'child_id': lesson11.lesson_id,
                        'child_val': {
                            'a': [],
                            'h': [{
                                'child_id': 0,
                                'child_val': {
                                    'c': [],
                                    'label': 'L1.1'
                                }
                            }],
                            'label':
                            lesson11.index
                        }
                    }],
                    'label':
                    'Unit %s' % unit1.index
                }
            }],
            'label':
            'UNTITLED COURSE'
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))

        lesson11.objectives = """
            <question quid="123" weight="1" instanceid="1"></question>
            random_text
            <gcb-youtube videoid="Kdg2drcUjYI" instanceid="VD"></gcb-youtube>
            more_random_text
            <question-group qgid="456" instanceid="2"></question-group>
            yet_more_random_text
        """
        expected = {
            'label':
            'UNTITLED COURSE',
            's': [{
                'child_id': assessment1.unit_id,
                'child_val': {
                    'label': assessment1.title
                }
            }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    'label':
                    'Unit %s' % unit1.index,
                    's': [],
                    'l': [{
                        'child_id': lesson11.lesson_id,
                        'child_val': {
                            'label':
                            lesson11.index,
                            'a': [],
                            'h': [{
                                'child_id': 0,
                                'child_val': {
                                    'c': [{
                                        'child_id': '1',
                                        'child_val': {
                                            'label': 'L1.1.1'
                                        }
                                    }, {
                                        'child_id': '2',
                                        'child_val': {
                                            'label': 'L1.1.2'
                                        }
                                    }],
                                    'label':
                                    'L1.1'
                                }
                            }]
                        }
                    }]
                }
            }]
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))
    def test_entity_dict_for_pre_post_assessment(self):
        """Tests correct entity_structure is built."""
        sites.setup_courses('course:/test::ns_test, course:/:/')
        course = courses.Course(None, app_context=sites.get_all_courses()[0])
        unit1 = course.add_unit()
        pre_assessment = course.add_assessment()
        pre_assessment.title = 'Pre Assessment'
        post_assessment = course.add_assessment()
        post_assessment.title = 'Post Assessment'

        # Neither pre nor post assessment for unit
        unit1.pre_assessment = None
        unit1.post_assessment = None
        progress_stats = ProgressStats(course)
        expected = {
            's': [{
                'child_id': pre_assessment.unit_id,
                'child_val': {
                    'label': 'Pre Assessment'
                }
            }, {
                'child_id': post_assessment.unit_id,
                'child_val': {
                    'label': 'Post Assessment'
                }
            }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [],
                    'l': [],
                    'label': 'Unit 1'
                }
            }],
            'label':
            'UNTITLED COURSE'
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))

        # Only pre
        unit1.pre_assessment = pre_assessment.unit_id
        unit1.post_assessment = None
        progress_stats = ProgressStats(course)
        expected = {
            's': [{
                'child_id': post_assessment.unit_id,
                'child_val': {
                    'label': 'Post Assessment'
                }
            }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [{
                        'child_id': pre_assessment.unit_id,
                        'child_val': {
                            'label': 'Pre Assessment'
                        }
                    }],
                    'l': [],
                    'label':
                    'Unit 1'
                }
            }],
            'label':
            'UNTITLED COURSE'
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))

        # Only post
        unit1.pre_assessment = None
        unit1.post_assessment = post_assessment.unit_id
        progress_stats = ProgressStats(course)
        expected = {
            's': [{
                'child_id': pre_assessment.unit_id,
                'child_val': {
                    'label': 'Pre Assessment'
                }
            }],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [{
                        'child_id': post_assessment.unit_id,
                        'child_val': {
                            'label': 'Post Assessment'
                        }
                    }],
                    'l': [],
                    'label':
                    'Unit 1'
                }
            }],
            'label':
            'UNTITLED COURSE'
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))

        # Pre and post assessment set.
        unit1.pre_assessment = pre_assessment.unit_id
        unit1.post_assessment = post_assessment.unit_id
        progress_stats = ProgressStats(course)
        expected = {
            's': [],
            'u': [{
                'child_id': unit1.unit_id,
                'child_val': {
                    's': [{
                        'child_id': pre_assessment.unit_id,
                        'child_val': {
                            'label': 'Pre Assessment'
                        }
                    }, {
                        'child_id': post_assessment.unit_id,
                        'child_val': {
                            'label': 'Post Assessment'
                        }
                    }],
                    'l': [],
                    'label':
                    'Unit 1'
                }
            }],
            'label':
            'UNTITLED COURSE'
        }
        assert_equals(expected,
                      progress_stats.compute_entity_dict('course', []))