diff --git a/cms/djangoapps/contentstore/tests/test_import.py b/cms/djangoapps/contentstore/tests/test_import.py index d648c00c28..73b65197da 100644 --- a/cms/djangoapps/contentstore/tests/test_import.py +++ b/cms/djangoapps/contentstore/tests/test_import.py @@ -5,6 +5,7 @@ Tests for import_course_from_xml using the mongo modulestore. import copy +from unittest import skip from unittest.mock import patch from uuid import uuid4 @@ -174,29 +175,29 @@ class ContentStoreImportTest(ModuleStoreTestCase): print(f"course tabs = {course.tabs}") self.assertEqual(course.tabs[1]['name'], 'Syllabus') - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) - def test_reimport(self, default_ms_type): - with modulestore().default_store(default_ms_type): - __, __, course = self.load_test_import_course(create_if_not_present=True) - self.load_test_import_course(target_id=course.id) + def test_reimport(self): + __, __, course = self.load_test_import_course(create_if_not_present=True) + self.load_test_import_course(target_id=course.id) + @skip("OldMongo Deprecation") def test_rewrite_reference_list(self): # This test fails with split modulestore (the HTML component is not in "different_course_id" namespace). # More investigation needs to be done. - module_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) + module_store = modulestore() target_id = module_store.make_course_key('testX', 'conditional_copy', 'copy_run') import_course_from_xml( module_store, self.user.id, TEST_DATA_DIR, ['conditional'], - target_id=target_id + target_id=target_id, + create_if_not_present=True ) conditional_block = module_store.get_item( target_id.make_usage_key('conditional', 'condone') ) self.assertIsNotNone(conditional_block) - different_course_id = module_store.make_course_key('edX', 'different_course', None) + different_course_id = module_store.make_course_key('edX', 'different_course', 'course_run') self.assertListEqual( [ target_id.make_usage_key('problem', 'choiceprob'), @@ -256,22 +257,20 @@ class ContentStoreImportTest(ModuleStoreTestCase): self.assertEqual(remapped_verticals, split_test_block.group_id_to_child) - @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) - def test_video_components_present_while_import(self, store): + def test_video_components_present_while_import(self): """ Test that video components with same edx_video_id are present while re-importing """ - with modulestore().default_store(store): - module_store = modulestore() - course_id = module_store.make_course_key('edX', 'test_import_course', '2012_Fall') + module_store = modulestore() + course_id = module_store.make_course_key('edX', 'test_import_course', '2012_Fall') - # Import first time - __, __, course = self.load_test_import_course(target_id=course_id, module_store=module_store) + # Import first time + __, __, course = self.load_test_import_course(target_id=course_id, module_store=module_store) - # Re-import - __, __, re_course = self.load_test_import_course(target_id=course.id, module_store=module_store) + # Re-import + __, __, re_course = self.load_test_import_course(target_id=course.id, module_store=module_store) - vertical = module_store.get_item(re_course.id.make_usage_key('vertical', 'vertical_test')) + vertical = module_store.get_item(re_course.id.make_usage_key('vertical', 'vertical_test')) - video = module_store.get_item(vertical.children[1]) - self.assertEqual(video.display_name, 'default') + video = module_store.get_item(vertical.children[1]) + self.assertEqual(video.display_name, 'default') diff --git a/cms/djangoapps/contentstore/views/tests/test_course_index.py b/cms/djangoapps/contentstore/views/tests/test_course_index.py index 010505c255..5bff99d6be 100644 --- a/cms/djangoapps/contentstore/views/tests/test_course_index.py +++ b/cms/djangoapps/contentstore/views/tests/test_course_index.py @@ -5,7 +5,7 @@ Unit tests for getting the list of courses and the course outline. import datetime import json -from unittest import SkipTest, mock, skip +from unittest import mock, skip from unittest.mock import patch import ddt @@ -35,6 +35,7 @@ from openedx.core.djangoapps.content.course_overviews.tests.factories import Cou from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES from xmodule.modulestore.django import modulestore # lint-amnesty, pylint: disable=wrong-import-order from xmodule.modulestore.exceptions import ItemNotFoundError # lint-amnesty, pylint: disable=wrong-import-order +from xmodule.modulestore.tests.django_utils import TEST_DATA_SPLIT_MODULESTORE from xmodule.modulestore.tests.factories import CourseFactory, BlockFactory, LibraryFactory, check_mongo_calls # lint-amnesty, pylint: disable=wrong-import-order from ..course import _deprecated_blocks_info, course_outline_initial_state, reindex_course_and_check_access @@ -46,6 +47,8 @@ class TestCourseIndex(CourseTestCase): Unit tests for getting the list of courses and the course outline. """ + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE + def setUp(self): """ Add a course with odd characters in the fields @@ -333,6 +336,9 @@ class TestCourseIndexArchived(CourseTestCase): """ Unit tests for testing the course index list when there are archived courses. """ + + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE + NOW = datetime.datetime.now(pytz.utc) DAY = datetime.timedelta(days=1) YESTERDAY = NOW - DAY @@ -415,16 +421,15 @@ class TestCourseIndexArchived(CourseTestCase): archived_course_tab = parsed_html.find_class('archived-courses') self.assertEqual(len(archived_course_tab), 1 if separate_archived_courses else 0) - @skip('Skip test for old mongo course') @ddt.data( # Staff user has course staff access (True, 'staff', None, 0, 20), (False, 'staff', None, 0, 20), # Base user has global staff access - (True, 'user', ORG, 1, 20), - (False, 'user', ORG, 1, 20), - (True, 'user', None, 1, 20), - (False, 'user', None, 1, 20), + (True, 'user', ORG, 2, 20), + (False, 'user', ORG, 2, 20), + (True, 'user', None, 2, 20), + (False, 'user', None, 2, 20), ) @ddt.unpack def test_separate_archived_courses(self, separate_archived_courses, username, org, mongo_queries, sql_queries): @@ -452,6 +457,9 @@ class TestCourseOutline(CourseTestCase): """ Unit tests for the course outline. """ + + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE + ENABLED_SIGNALS = ['course_published'] def setUp(self): @@ -550,7 +558,7 @@ class TestCourseOutline(CourseTestCase): if create_blocks: for block_type in block_types: BlockFactory.create( - parent_location=self.vertical.location, + parent=self.vertical, category=block_type, display_name=f'{block_type} Problem' ) @@ -558,6 +566,8 @@ class TestCourseOutline(CourseTestCase): if not publish: self.store.unpublish(self.vertical.location, self.user.id) + # get updated vertical + self.vertical = modulestore().get_item(self.vertical.location) course_block.advanced_modules.extend(block_types) def _verify_deprecated_info(self, course_id, advanced_modules, info, deprecated_block_types): @@ -584,6 +594,7 @@ class TestCourseOutline(CourseTestCase): reverse_course_url('advanced_settings_handler', course_id) ) + @skip('OldMongo Deprecation. HiddenDescriptorWithMixins is not created for split.') @ddt.data( [{'publish': True}, ['notes']], [{'publish': False}, ['notes']], @@ -596,6 +607,9 @@ class TestCourseOutline(CourseTestCase): """ course_block = modulestore().get_item(self.course.location) self._create_test_data(course_block, create_blocks=True, block_types=block_types, publish=publish) + # get updated course_block + course_block = modulestore().get_item(self.course.location) + info = _deprecated_blocks_info(course_block, block_types) self._verify_deprecated_info( course_block.id, @@ -604,6 +618,7 @@ class TestCourseOutline(CourseTestCase): block_types ) + @skip('OldMongo Deprecation. HiddenDescriptorWithMixins is not created for split.') @ddt.data( (["a", "b", "c"], ["a", "b", "c"]), (["a", "b", "c"], ["a", "b", "d"]), @@ -618,6 +633,8 @@ class TestCourseOutline(CourseTestCase): expected_block_types = list(set(enabled_block_types) & set(deprecated_block_types)) course_block = modulestore().get_item(self.course.location) self._create_test_data(course_block, create_blocks=True, block_types=enabled_block_types) + # get updated course_module + course_block = modulestore().get_item(self.course.location) info = _deprecated_blocks_info(course_block, deprecated_block_types) self._verify_deprecated_info( course_block.id, @@ -632,8 +649,6 @@ class TestCourseOutline(CourseTestCase): """ Test to check proctored exam settings mfe url is rendering properly """ - if self.course.id.deprecated: - raise SkipTest("Skip test for old mongo course") mock_validate_proctoring_settings.return_value = [ { 'key': 'proctoring_provider', @@ -655,6 +670,9 @@ class TestCourseReIndex(CourseTestCase): """ Unit tests for the course outline. """ + + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE + SUCCESSFUL_RESPONSE = _("Course has been successfully reindexed.") ENABLED_SIGNALS = ['course_published'] @@ -835,7 +853,7 @@ class TestCourseReIndex(CourseTestCase): with self.assertRaises(SearchIndexingError): reindex_course_and_check_access(self.course.id, self.user) - @mock.patch('xmodule.modulestore.mongo.base.MongoModuleStore.get_course') + @mock.patch('xmodule.modulestore.split_mongo.split.SplitMongoModuleStore.get_course') def test_reindex_no_item(self, mock_get_course): """ Test system logs an error if no item found. @@ -945,7 +963,7 @@ class TestCourseReIndex(CourseTestCase): with self.assertRaises(SearchIndexingError): CoursewareSearchIndexer.do_course_reindex(modulestore(), self.course.id) - @mock.patch('xmodule.modulestore.mongo.base.MongoModuleStore.get_course') + @mock.patch('xmodule.modulestore.split_mongo.split.SplitMongoModuleStore.get_course') def test_indexing_no_item(self, mock_get_course): """ Test system logs an error if no item found. diff --git a/openedx/core/djangoapps/contentserver/test/test_contentserver.py b/openedx/core/djangoapps/contentserver/test/test_contentserver.py index cf5ae5b509..700eff6427 100644 --- a/openedx/core/djangoapps/contentserver/test/test_contentserver.py +++ b/openedx/core/djangoapps/contentserver/test/test_contentserver.py @@ -20,7 +20,7 @@ from opaque_keys import InvalidKeyError from xmodule.contentstore.django import contentstore from xmodule.contentstore.content import StaticContent, VERSIONED_ASSETS_PREFIX from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import TEST_DATA_MONGO_MODULESTORE, SharedModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import TEST_DATA_SPLIT_MODULESTORE, SharedModuleStoreTestCase from xmodule.modulestore.xml_importer import import_course_from_xml from xmodule.assetstore.assetmgr import AssetManager from xmodule.modulestore.exceptions import ItemNotFoundError @@ -73,7 +73,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase): """ Tests that use the toy course. """ - MODULESTORE = TEST_DATA_MONGO_MODULESTORE + MODULESTORE = TEST_DATA_SPLIT_MODULESTORE @classmethod def setUpClass(cls): @@ -82,23 +82,23 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase): cls.contentstore = contentstore() cls.modulestore = modulestore() - cls.course_key = cls.modulestore.make_course_key('edX', 'toy', '2012_Fall') - - import_course_from_xml( + course_items = import_course_from_xml( cls.modulestore, 1, TEST_DATA_DIR, ['toy'], - static_content_store=cls.contentstore, verbose=True + static_content_store=cls.contentstore, verbose=True, create_if_not_present=True ) + cls.course = course_items[0] + cls.course_key = cls.course.id # A locked asset cls.locked_asset = cls.course_key.make_asset_key('asset', 'sample_static.html') - cls.url_locked = str(cls.locked_asset) + cls.url_locked = '/' + str(cls.locked_asset) cls.url_locked_versioned = get_versioned_asset_url(cls.url_locked) cls.url_locked_versioned_old_style = get_old_style_versioned_asset_url(cls.url_locked) cls.contentstore.set_attr(cls.locked_asset, 'locked', True) # An unlocked asset cls.unlocked_asset = cls.course_key.make_asset_key('asset', 'another_static.txt') - cls.url_unlocked = str(cls.unlocked_asset) + cls.url_unlocked = '/' + str(cls.unlocked_asset) cls.url_unlocked_versioned = get_versioned_asset_url(cls.url_unlocked) cls.url_unlocked_versioned_old_style = get_old_style_versioned_asset_url(cls.url_unlocked) cls.length_unlocked = cls.contentstore.get_attr(cls.unlocked_asset, 'length') @@ -134,7 +134,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase): Test that unlocked assets that are versioned (old-style) are being served. """ self.client.logout() - resp = self.client.get(self.url_unlocked_versioned_old_style) + resp = self.client.get(self.url_unlocked_versioned_old_style, follow=True) assert resp.status_code == 200 def test_unlocked_versioned_asset_with_nonexistent_version(self): @@ -168,7 +168,7 @@ class ContentStoreToyCourseTest(SharedModuleStoreTestCase): assert CourseEnrollment.is_enrolled(self.non_staff_usr, self.course_key) self.client.login(username=self.non_staff_usr, password='test') - resp = self.client.get(self.url_locked_versioned_old_style) + resp = self.client.get(self.url_locked_versioned_old_style, follow=True) assert resp.status_code == 200 def test_locked_asset_not_logged_in(self): diff --git a/xmodule/contentstore/content.py b/xmodule/contentstore/content.py index 76f18d115b..35dfc60c47 100644 --- a/xmodule/contentstore/content.py +++ b/xmodule/contentstore/content.py @@ -143,9 +143,9 @@ class StaticContent: # lint-amnesty, pylint: disable=missing-class-docstring return AssetKey.from_string(path) except InvalidKeyError: # TODO - re-address this once LMS-11198 is tackled. - if path.startswith('/'): + if path.startswith('/') or path.endswith('/'): # try stripping off the leading slash and try again - return AssetKey.from_string(path[1:]) + return AssetKey.from_string(path.strip('/')) @staticmethod def is_versioned_asset_path(path):