223 lines
8.7 KiB
Python
223 lines
8.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# pylint: disable=E1101
|
|
"""
|
|
Tests for import_from_xml using the mongo modulestore.
|
|
"""
|
|
|
|
from django.test.client import Client
|
|
from django.test.utils import override_settings
|
|
from django.conf import settings
|
|
from path import path
|
|
import copy
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
|
from contentstore.tests.modulestore_config import TEST_MODULESTORE
|
|
|
|
from xmodule.modulestore import Location
|
|
from xmodule.modulestore.django import modulestore
|
|
from xmodule.contentstore.django import contentstore
|
|
from xmodule.modulestore.xml_importer import import_from_xml
|
|
from xmodule.contentstore.content import StaticContent
|
|
from xmodule.contentstore.django import _CONTENTSTORE
|
|
|
|
from xmodule.course_module import CourseDescriptor
|
|
|
|
from xmodule.exceptions import NotFoundError
|
|
from uuid import uuid4
|
|
from pymongo import MongoClient
|
|
|
|
TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
|
|
TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex
|
|
|
|
|
|
@override_settings(CONTENTSTORE=TEST_DATA_CONTENTSTORE, MODULESTORE=TEST_MODULESTORE)
|
|
class ContentStoreImportTest(ModuleStoreTestCase):
|
|
"""
|
|
Tests that rely on the toy and test_import_course courses.
|
|
NOTE: refactor using CourseFactory so they do not.
|
|
"""
|
|
def setUp(self):
|
|
|
|
settings.MODULESTORE['default']['OPTIONS']['fs_root'] = path('common/test/data')
|
|
settings.MODULESTORE['direct']['OPTIONS']['fs_root'] = path('common/test/data')
|
|
uname = 'testuser'
|
|
email = 'test+courses@edx.org'
|
|
password = 'foo'
|
|
|
|
# Create the use so we can log them in.
|
|
self.user = User.objects.create_user(uname, email, password)
|
|
|
|
# Note that we do not actually need to do anything
|
|
# for registration if we directly mark them active.
|
|
self.user.is_active = True
|
|
# Staff has access to view all courses
|
|
self.user.is_staff = True
|
|
|
|
# Save the data that we've just changed to the db.
|
|
self.user.save()
|
|
|
|
self.client = Client()
|
|
self.client.login(username=uname, password=password)
|
|
|
|
def tearDown(self):
|
|
MongoClient().drop_database(TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'])
|
|
_CONTENTSTORE.clear()
|
|
|
|
def load_test_import_course(self):
|
|
'''
|
|
Load the standard course used to test imports (for do_import_static=False behavior).
|
|
'''
|
|
content_store = contentstore()
|
|
module_store = modulestore('direct')
|
|
import_from_xml(module_store, 'common/test/data/', ['test_import_course'], static_content_store=content_store, do_import_static=False, verbose=True)
|
|
course_location = CourseDescriptor.id_to_location('edX/test_import_course/2012_Fall')
|
|
course = module_store.get_item(course_location)
|
|
self.assertIsNotNone(course)
|
|
|
|
return module_store, content_store, course, course_location
|
|
|
|
def test_unicode_chars_in_course_name_import(self):
|
|
"""
|
|
# Test that importing course with unicode 'id' and 'display name' doesn't give UnicodeEncodeError
|
|
"""
|
|
module_store = modulestore('direct')
|
|
target_location = Location(['i4x', u'Юникода', 'unicode_course', 'course', u'échantillon'])
|
|
import_from_xml(
|
|
module_store,
|
|
'common/test/data/',
|
|
['2014_Uni'],
|
|
target_location_namespace=target_location
|
|
)
|
|
|
|
course = module_store.get_item(target_location)
|
|
self.assertIsNotNone(course)
|
|
|
|
# test that course 'display_name' same as imported course 'display_name'
|
|
self.assertEqual(course.display_name, u"Φυσικά το όνομα Unicode")
|
|
|
|
def test_static_import(self):
|
|
'''
|
|
Stuff in static_import should always be imported into contentstore
|
|
'''
|
|
_, content_store, course, course_location = self.load_test_import_course()
|
|
|
|
# make sure we have ONE asset in our contentstore ("should_be_imported.html")
|
|
all_assets, count = content_store.get_all_content_for_course(course_location)
|
|
print "len(all_assets)=%d" % len(all_assets)
|
|
self.assertEqual(len(all_assets), 1)
|
|
self.assertEqual(count, 1)
|
|
|
|
content = None
|
|
try:
|
|
location = StaticContent.get_location_from_path('/c4x/edX/test_import_course/asset/should_be_imported.html')
|
|
content = content_store.find(location)
|
|
except NotFoundError:
|
|
pass
|
|
|
|
self.assertIsNotNone(content)
|
|
|
|
# make sure course.static_asset_path is correct
|
|
print "static_asset_path = {0}".format(course.static_asset_path)
|
|
self.assertEqual(course.static_asset_path, 'test_import_course')
|
|
|
|
def test_asset_import_nostatic(self):
|
|
'''
|
|
This test validates that an image asset is NOT imported when do_import_static=False
|
|
'''
|
|
content_store = contentstore()
|
|
|
|
module_store = modulestore('direct')
|
|
import_from_xml(module_store, 'common/test/data/', ['toy'], static_content_store=content_store, do_import_static=False, verbose=True)
|
|
|
|
course_location = CourseDescriptor.id_to_location('edX/toy/2012_Fall')
|
|
module_store.get_item(course_location)
|
|
|
|
# make sure we have NO assets in our contentstore
|
|
all_assets, count = content_store.get_all_content_for_course(course_location)
|
|
self.assertEqual(len(all_assets), 0)
|
|
self.assertEqual(count, 0)
|
|
|
|
def test_no_static_link_rewrites_on_import(self):
|
|
module_store = modulestore('direct')
|
|
import_from_xml(module_store, 'common/test/data/', ['toy'], do_import_static=False, verbose=True)
|
|
|
|
handouts = module_store.get_item(Location(['i4x', 'edX', 'toy', 'course_info', 'handouts', None]))
|
|
self.assertIn('/static/', handouts.data)
|
|
|
|
handouts = module_store.get_item(Location(['i4x', 'edX', 'toy', 'html', 'toyhtml', None]))
|
|
self.assertIn('/static/', handouts.data)
|
|
|
|
def test_tab_name_imports_correctly(self):
|
|
_module_store, _content_store, course, _course_location = self.load_test_import_course()
|
|
print "course tabs = {0}".format(course.tabs)
|
|
self.assertEqual(course.tabs[2]['name'], 'Syllabus')
|
|
|
|
def test_rewrite_reference_list(self):
|
|
module_store = modulestore('direct')
|
|
target_location = Location(['i4x', 'testX', 'conditional_copy', 'course', 'copy_run'])
|
|
import_from_xml(
|
|
module_store,
|
|
'common/test/data/',
|
|
['conditional'],
|
|
target_location_namespace=target_location
|
|
)
|
|
conditional_module = module_store.get_item(
|
|
Location(['i4x', 'testX', 'conditional_copy', 'conditional', 'condone'])
|
|
)
|
|
self.assertIsNotNone(conditional_module)
|
|
self.assertListEqual(
|
|
[
|
|
u'i4x://testX/conditional_copy/problem/choiceprob',
|
|
u'i4x://edX/different_course/html/for_testing_import_rewrites'
|
|
],
|
|
conditional_module.sources_list
|
|
)
|
|
self.assertListEqual(
|
|
[
|
|
u'i4x://testX/conditional_copy/html/congrats',
|
|
u'i4x://testX/conditional_copy/html/secret_page'
|
|
],
|
|
conditional_module.show_tag_list
|
|
)
|
|
|
|
def test_rewrite_reference(self):
|
|
module_store = modulestore('direct')
|
|
target_location = Location(['i4x', 'testX', 'peergrading_copy', 'course', 'copy_run'])
|
|
import_from_xml(
|
|
module_store,
|
|
'common/test/data/',
|
|
['open_ended'],
|
|
target_location_namespace=target_location
|
|
)
|
|
peergrading_module = module_store.get_item(
|
|
Location(['i4x', 'testX', 'peergrading_copy', 'peergrading', 'PeerGradingLinked'])
|
|
)
|
|
self.assertIsNotNone(peergrading_module)
|
|
self.assertEqual(
|
|
u'i4x://testX/peergrading_copy/combinedopenended/SampleQuestion',
|
|
peergrading_module.link_to_location
|
|
)
|
|
|
|
def test_rewrite_reference_value_dict(self):
|
|
module_store = modulestore('direct')
|
|
target_location = Location(['i4x', 'testX', 'split_test_copy', 'course', 'copy_run'])
|
|
import_from_xml(
|
|
module_store,
|
|
'common/test/data/',
|
|
['split_test_module'],
|
|
target_location_namespace=target_location
|
|
)
|
|
split_test_module = module_store.get_item(
|
|
Location(['i4x', 'testX', 'split_test_copy', 'split_test', 'split1'])
|
|
)
|
|
self.assertIsNotNone(split_test_module)
|
|
self.assertEqual(
|
|
{
|
|
"0": "i4x://testX/split_test_copy/vertical/sample_0",
|
|
"2": "i4x://testX/split_test_copy/vertical/sample_2",
|
|
},
|
|
split_test_module.group_id_to_child,
|
|
)
|