Authors can upload an image (or choose an existing one) from the settings page, using the in-context uploader from PDF textbooks. Includes tests for backwards compatibility with XML courses -- they used a magic filename (images/course_image.jpg) which is mapped to a location in the Mongo contentstore. Still needs some UX work, though the backend plumbing is there.
164 lines
7.6 KiB
Python
164 lines
7.6 KiB
Python
""" Tests for utils. """
|
|
from contentstore import utils
|
|
import mock
|
|
import collections
|
|
import copy
|
|
from django.test import TestCase
|
|
from django.test.utils import override_settings
|
|
from xmodule.modulestore.tests.factories import CourseFactory
|
|
|
|
|
|
class LMSLinksTestCase(TestCase):
|
|
""" Tests for LMS links. """
|
|
def about_page_test(self):
|
|
""" Get URL for about page, no marketing site """
|
|
# default for ENABLE_MKTG_SITE is False.
|
|
self.assertEquals(self.get_about_page_link(), "//localhost:8000/courses/mitX/101/test/about")
|
|
|
|
@override_settings(MKTG_URLS={'ROOT': 'dummy-root'})
|
|
def about_page_marketing_site_test(self):
|
|
""" Get URL for about page, marketing root present. """
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
|
|
self.assertEquals(self.get_about_page_link(), "//dummy-root/courses/mitX/101/test/about")
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': False}):
|
|
self.assertEquals(self.get_about_page_link(), "//localhost:8000/courses/mitX/101/test/about")
|
|
|
|
@override_settings(MKTG_URLS={'ROOT': 'http://www.dummy'})
|
|
def about_page_marketing_site_remove_http_test(self):
|
|
""" Get URL for about page, marketing root present, remove http://. """
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
|
|
self.assertEquals(self.get_about_page_link(), "//www.dummy/courses/mitX/101/test/about")
|
|
|
|
@override_settings(MKTG_URLS={'ROOT': 'https://www.dummy'})
|
|
def about_page_marketing_site_remove_https_test(self):
|
|
""" Get URL for about page, marketing root present, remove https://. """
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
|
|
self.assertEquals(self.get_about_page_link(), "//www.dummy/courses/mitX/101/test/about")
|
|
|
|
@override_settings(MKTG_URLS={'ROOT': 'www.dummyhttps://x'})
|
|
def about_page_marketing_site_https__edge_test(self):
|
|
""" Get URL for about page, only remove https:// at the beginning of the string. """
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
|
|
self.assertEquals(self.get_about_page_link(), "//www.dummyhttps://x/courses/mitX/101/test/about")
|
|
|
|
@override_settings(MKTG_URLS={})
|
|
def about_page_marketing_urls_not_set_test(self):
|
|
""" Error case. ENABLE_MKTG_SITE is True, but there is either no MKTG_URLS, or no MKTG_URLS Root property. """
|
|
with mock.patch.dict('django.conf.settings.MITX_FEATURES', {'ENABLE_MKTG_SITE': True}):
|
|
self.assertEquals(self.get_about_page_link(), None)
|
|
|
|
@override_settings(LMS_BASE=None)
|
|
def about_page_no_lms_base_test(self):
|
|
""" No LMS_BASE, nor is ENABLE_MKTG_SITE True """
|
|
self.assertEquals(self.get_about_page_link(), None)
|
|
|
|
def get_about_page_link(self):
|
|
""" create mock course and return the about page link """
|
|
location = 'i4x', 'mitX', '101', 'course', 'test'
|
|
return utils.get_lms_link_for_about_page(location)
|
|
|
|
def lms_link_test(self):
|
|
""" Tests get_lms_link_for_item. """
|
|
location = 'i4x', 'mitX', '101', 'vertical', 'contacting_us'
|
|
link = utils.get_lms_link_for_item(location, False, "mitX/101/test")
|
|
self.assertEquals(link, "//localhost:8000/courses/mitX/101/test/jump_to/i4x://mitX/101/vertical/contacting_us")
|
|
link = utils.get_lms_link_for_item(location, True, "mitX/101/test")
|
|
self.assertEquals(
|
|
link,
|
|
"//preview/courses/mitX/101/test/jump_to/i4x://mitX/101/vertical/contacting_us"
|
|
)
|
|
|
|
# If no course_id is passed in, it is obtained from the location. This is the case for
|
|
# Studio dashboard.
|
|
location = 'i4x', 'mitX', '101', 'course', 'test'
|
|
link = utils.get_lms_link_for_item(location)
|
|
self.assertEquals(
|
|
link,
|
|
"//localhost:8000/courses/mitX/101/test/jump_to/i4x://mitX/101/course/test"
|
|
)
|
|
|
|
|
|
class ExtraPanelTabTestCase(TestCase):
|
|
""" Tests adding and removing extra course tabs. """
|
|
|
|
def get_tab_type_dicts(self, tab_types):
|
|
""" Returns an array of tab dictionaries. """
|
|
if tab_types:
|
|
return [{'tab_type': tab_type} for tab_type in tab_types.split(',')]
|
|
else:
|
|
return []
|
|
|
|
def get_course_with_tabs(self, tabs=[]):
|
|
""" Returns a mock course object with a tabs attribute. """
|
|
course = collections.namedtuple('MockCourse', ['tabs'])
|
|
if isinstance(tabs, basestring):
|
|
course.tabs = self.get_tab_type_dicts(tabs)
|
|
else:
|
|
course.tabs = tabs
|
|
return course
|
|
|
|
def test_add_extra_panel_tab(self):
|
|
""" Tests if a tab can be added to a course tab list. """
|
|
for tab_type in utils.EXTRA_TAB_PANELS.keys():
|
|
tab = utils.EXTRA_TAB_PANELS.get(tab_type)
|
|
|
|
# test adding with changed = True
|
|
for tab_setup in ['', 'x', 'x,y,z']:
|
|
course = self.get_course_with_tabs(tab_setup)
|
|
expected_tabs = copy.copy(course.tabs)
|
|
expected_tabs.append(tab)
|
|
changed, actual_tabs = utils.add_extra_panel_tab(tab_type, course)
|
|
self.assertTrue(changed)
|
|
self.assertEqual(actual_tabs, expected_tabs)
|
|
|
|
# test adding with changed = False
|
|
tab_test_setup = [
|
|
[tab],
|
|
[tab, self.get_tab_type_dicts('x,y,z')],
|
|
[self.get_tab_type_dicts('x,y'), tab, self.get_tab_type_dicts('z')],
|
|
[self.get_tab_type_dicts('x,y,z'), tab]]
|
|
|
|
for tab_setup in tab_test_setup:
|
|
course = self.get_course_with_tabs(tab_setup)
|
|
expected_tabs = copy.copy(course.tabs)
|
|
changed, actual_tabs = utils.add_extra_panel_tab(tab_type, course)
|
|
self.assertFalse(changed)
|
|
self.assertEqual(actual_tabs, expected_tabs)
|
|
|
|
def test_remove_extra_panel_tab(self):
|
|
""" Tests if a tab can be removed from a course tab list. """
|
|
for tab_type in utils.EXTRA_TAB_PANELS.keys():
|
|
tab = utils.EXTRA_TAB_PANELS.get(tab_type)
|
|
|
|
# test removing with changed = True
|
|
tab_test_setup = [
|
|
[tab],
|
|
[tab, self.get_tab_type_dicts('x,y,z')],
|
|
[self.get_tab_type_dicts('x,y'), tab, self.get_tab_type_dicts('z')],
|
|
[self.get_tab_type_dicts('x,y,z'), tab]]
|
|
|
|
for tab_setup in tab_test_setup:
|
|
course = self.get_course_with_tabs(tab_setup)
|
|
expected_tabs = [t for t in course.tabs if t != utils.EXTRA_TAB_PANELS.get(tab_type)]
|
|
changed, actual_tabs = utils.remove_extra_panel_tab(tab_type, course)
|
|
self.assertTrue(changed)
|
|
self.assertEqual(actual_tabs, expected_tabs)
|
|
|
|
# test removing with changed = False
|
|
for tab_setup in ['', 'x', 'x,y,z']:
|
|
course = self.get_course_with_tabs(tab_setup)
|
|
expected_tabs = copy.copy(course.tabs)
|
|
changed, actual_tabs = utils.remove_extra_panel_tab(tab_type, course)
|
|
self.assertFalse(changed)
|
|
self.assertEqual(actual_tabs, expected_tabs)
|
|
|
|
|
|
class CourseImageTestCase(TestCase):
|
|
"""Tests for course image URLs."""
|
|
|
|
def test_get_image_url(self):
|
|
"""Test image URL formatting."""
|
|
course = CourseFactory.create(org='edX', course='999')
|
|
url = utils.course_image_url(course)
|
|
self.assertEquals(url, '/c4x/edX/999/asset/{0}'.format(course.course_image))
|