From 6f71706b171300ede7c2aae68f7d2c27efc89ede Mon Sep 17 00:00:00 2001 From: cahrens Date: Fri, 4 Aug 2017 14:25:34 -0400 Subject: [PATCH] Remove SlashSeparatedCourseKey from tests. --- .../commands/tests/test_cleanup_assets.py | 4 +- .../commands/tests/test_delete_course.py | 8 ++-- .../commands/tests/test_git_export.py | 6 +-- .../contentstore/tests/test_clone_course.py | 9 ---- .../contentstore/tests/test_utils.py | 12 +++--- cms/djangoapps/contentstore/tests/utils.py | 5 ++- .../contentstore/views/tests/test_access.py | 4 +- .../contentstore/views/tests/test_assets.py | 13 +++--- .../course_modes/tests/factories.py | 4 +- .../course_modes/tests/test_models.py | 5 +-- .../test/test_static_replace.py | 4 +- .../djangoapps/util/tests/test_sandboxing.py | 14 +++---- .../tests/test_mixed_modulestore.py | 4 +- .../xmodule/modulestore/tests/test_mongo.py | 42 +++++++++---------- .../bulk_email/tests/test_err_handling.py | 6 +-- lms/djangoapps/bulk_email/tests/test_forms.py | 4 +- lms/djangoapps/bulk_email/tests/test_tasks.py | 4 +- lms/djangoapps/courseware/tests/factories.py | 7 ++-- .../courseware/tests/test_access.py | 18 ++++---- .../tests/test_draft_modulestore.py | 4 +- .../courseware/tests/test_module_render.py | 5 +-- lms/djangoapps/courseware/tests/test_views.py | 7 ++-- lms/djangoapps/courseware/tests/tests.py | 4 +- .../commands/tests/test_git_add_course.py | 6 +-- .../dashboard/tests/test_sysadmin.py | 14 +++---- lms/djangoapps/instructor/tests/test_api.py | 6 +-- lms/djangoapps/instructor/tests/test_email.py | 6 +-- .../instructor/tests/test_enrollment.py | 6 +-- .../tests/test_distributions.py | 6 +-- .../instructor_task/tests/factories.py | 4 +- .../instructor_task/tests/test_base.py | 5 ++- .../lms_xblock/test/test_runtime.py | 6 +-- .../verify_student/tests/test_views.py | 4 +- 33 files changed, 125 insertions(+), 131 deletions(-) diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_cleanup_assets.py b/cms/djangoapps/contentstore/management/commands/tests/test_cleanup_assets.py index 4fd4004fbb..4824779dab 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_cleanup_assets.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_cleanup_assets.py @@ -4,7 +4,7 @@ or with filename which starts with "._") """ from django.core.management import call_command -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from xmodule.contentstore.content import XASSET_LOCATION_TAG from xmodule.contentstore.django import contentstore from xmodule.modulestore.django import modulestore @@ -44,7 +44,7 @@ class ExportAllCourses(ModuleStoreTestCase): verbose=True ) - course = self.module_store.get_course(SlashSeparatedCourseKey('edX', 'dot-underscore', '2014_Fall')) + course = self.module_store.get_course(CourseKey.from_string('/'.join(['edX', 'dot-underscore', '2014_Fall']))) self.assertIsNotNone(course) # check that there are two assets ['example.txt', '.example.txt'] in contentstore for imported course diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_delete_course.py b/cms/djangoapps/contentstore/management/commands/tests/test_delete_course.py index 28a26b41ed..c4ad14c8e9 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_delete_course.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_delete_course.py @@ -4,7 +4,7 @@ Unittests for deleting a course in an chosen modulestore import mock -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from django.core.management import call_command, CommandError from django.contrib.auth.models import User from contentstore.tests.utils import CourseTestCase @@ -54,14 +54,14 @@ class DeleteCourseTest(CourseTestCase): """ Testing if the entered course was deleted """ - + course_key = CourseKey.from_string('/'.join(["TestX", "TS01", "2015_Q1"])) #Test if the course that is about to be deleted exists - self.assertIsNotNone(modulestore().get_course(SlashSeparatedCourseKey("TestX", "TS01", "2015_Q1"))) + self.assertIsNotNone(modulestore().get_course(course_key)) with mock.patch(self.YESNO_PATCH_LOCATION) as patched_yes_no: patched_yes_no.return_value = True call_command('delete_course', 'TestX/TS01/2015_Q1') - self.assertIsNone(modulestore().get_course(SlashSeparatedCourseKey("TestX", "TS01", "2015_Q1"))) + self.assertIsNone(modulestore().get_course(course_key)) def test_course_deletion_with_keep_instructors(self): """ diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_git_export.py b/cms/djangoapps/contentstore/management/commands/tests/test_git_export.py index a8dfe03cd0..14c36448c2 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_git_export.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_git_export.py @@ -18,7 +18,7 @@ from django.test.utils import override_settings from contentstore.tests.utils import CourseTestCase import contentstore.git_export_utils as git_export_utils from contentstore.git_export_utils import GitExportError -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator FEATURES_WITH_EXPORT_GIT = settings.FEATURES.copy() FEATURES_WITH_EXPORT_GIT['ENABLE_EXPORT_GIT'] = True @@ -88,7 +88,7 @@ class TestGitExport(CourseTestCase): """ Test several bad URLs for validation """ - course_key = SlashSeparatedCourseKey('org', 'course', 'run') + course_key = CourseLocator('org', 'course', 'run') with self.assertRaisesRegexp(GitExportError, unicode(GitExportError.URL_BAD)): git_export_utils.export_to_git(course_key, 'Sillyness') @@ -105,7 +105,7 @@ class TestGitExport(CourseTestCase): """ test_repo_path = '{}/test_repo'.format(git_export_utils.GIT_REPO_EXPORT_DIR) self.assertFalse(os.path.isdir(test_repo_path)) - course_key = SlashSeparatedCourseKey('foo', 'blah', '100-') + course_key = CourseLocator('foo', 'blah', '100-') # Test bad clones with self.assertRaisesRegexp(GitExportError, unicode(GitExportError.CANNOT_PULL)): diff --git a/cms/djangoapps/contentstore/tests/test_clone_course.py b/cms/djangoapps/contentstore/tests/test_clone_course.py index 82b931a54f..9ef484c91b 100644 --- a/cms/djangoapps/contentstore/tests/test_clone_course.py +++ b/cms/djangoapps/contentstore/tests/test_clone_course.py @@ -28,15 +28,6 @@ class CloneCourseTest(CourseTestCase): """Tests cloning of a course as follows: XML -> Mongo (+ data) -> Mongo -> Split -> Split""" # 1. import and populate test toy course mongo_course1_id = self.import_and_populate_course() - - # 2. clone course (mongo -> mongo) - # TODO - This is currently failing since clone_course doesn't handle Private content - fails on Publish - # mongo_course2_id = SlashSeparatedCourseKey('edX2', 'toy2', '2013_Fall') - # self.store.clone_course(mongo_course1_id, mongo_course2_id, self.user.id) - # self.assertCoursesEqual(mongo_course1_id, mongo_course2_id) - # self.check_populated_course(mongo_course2_id) - - # NOTE: When the code above is uncommented this can be removed. mongo_course2_id = mongo_course1_id # 3. clone course (mongo -> split) diff --git a/cms/djangoapps/contentstore/tests/test_utils.py b/cms/djangoapps/contentstore/tests/test_utils.py index a2e137f3b4..0d5d640c78 100644 --- a/cms/djangoapps/contentstore/tests/test_utils.py +++ b/cms/djangoapps/contentstore/tests/test_utils.py @@ -3,7 +3,7 @@ import collections from datetime import datetime, timedelta from django.test import TestCase -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from pytz import UTC from contentstore import utils @@ -21,26 +21,26 @@ class LMSLinksTestCase(TestCase): def lms_link_test(self): """ Tests get_lms_link_for_item. """ - course_key = SlashSeparatedCourseKey('mitX', '101', 'test') + course_key = CourseLocator('mitX', '101', 'test') location = course_key.make_usage_key('vertical', 'contacting_us') link = utils.get_lms_link_for_item(location, False) - self.assertEquals(link, "//localhost:8000/courses/mitX/101/test/jump_to/i4x://mitX/101/vertical/contacting_us") + self.assertEquals(link, "//localhost:8000/courses/course-v1:mitX+101+test/jump_to/block-v1:mitX+101+test+type@vertical+block@contacting_us") # test preview link = utils.get_lms_link_for_item(location, True) self.assertEquals( link, - "//preview.localhost/courses/mitX/101/test/jump_to/i4x://mitX/101/vertical/contacting_us" + "//preview.localhost/courses/course-v1:mitX+101+test/jump_to/block-v1:mitX+101+test+type@vertical+block@contacting_us" ) # now test with the course' location location = course_key.make_usage_key('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") + self.assertEquals(link, "//localhost:8000/courses/course-v1:mitX+101+test/jump_to/block-v1:mitX+101+test+type@course+block@test") def lms_link_for_certificate_web_view_test(self): """ Tests get_lms_link_for_certificate_web_view. """ - course_key = SlashSeparatedCourseKey('mitX', '101', 'test') + course_key = CourseLocator('mitX', '101', 'test') dummy_user = ModuleStoreEnum.UserID.test mode = 'professional' diff --git a/cms/djangoapps/contentstore/tests/utils.py b/cms/djangoapps/contentstore/tests/utils.py index 0c62bddbc9..87975ce395 100644 --- a/cms/djangoapps/contentstore/tests/utils.py +++ b/cms/djangoapps/contentstore/tests/utils.py @@ -8,7 +8,8 @@ from django.conf import settings from django.contrib.auth.models import User from django.test.client import Client from mock import Mock -from opaque_keys.edx.locations import AssetLocation, SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey +from opaque_keys.edx.locations import AssetLocation from contentstore.utils import reverse_url from student.models import Registration @@ -129,7 +130,7 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase): """ content_store = contentstore() import_course_from_xml(self.store, self.user.id, TEST_DATA_DIR, ['toy'], static_content_store=content_store) - course_id = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + course_id = CourseKey.from_string('/'.join(['edX', 'toy', '2012_Fall'])) # create an Orphan # We had a bug where orphaned draft nodes caused export to fail. This is here to cover that case. diff --git a/cms/djangoapps/contentstore/views/tests/test_access.py b/cms/djangoapps/contentstore/views/tests/test_access.py index 235193b980..a9aefbd4c4 100644 --- a/cms/djangoapps/contentstore/views/tests/test_access.py +++ b/cms/djangoapps/contentstore/views/tests/test_access.py @@ -3,7 +3,7 @@ Tests access.py """ from django.contrib.auth.models import User from django.test import TestCase -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from contentstore.views.access import get_user_role from student.auth import add_users @@ -22,7 +22,7 @@ class RolesTest(TestCase): self.global_admin = AdminFactory() self.instructor = User.objects.create_user('testinstructor', 'testinstructor+courses@edx.org', 'foo') self.staff = User.objects.create_user('teststaff', 'teststaff+courses@edx.org', 'foo') - self.course_key = SlashSeparatedCourseKey('mitX', '101', 'test') + self.course_key = CourseLocator('mitX', '101', 'test') def test_get_user_role_instructor(self): """ diff --git a/cms/djangoapps/contentstore/views/tests/test_assets.py b/cms/djangoapps/contentstore/views/tests/test_assets.py index 57fe05d064..4275c33cf6 100644 --- a/cms/djangoapps/contentstore/views/tests/test_assets.py +++ b/cms/djangoapps/contentstore/views/tests/test_assets.py @@ -10,7 +10,8 @@ from ddt import data, ddt from django.conf import settings from django.test.utils import override_settings from mock import patch -from opaque_keys.edx.locations import AssetLocation, SlashSeparatedCourseKey +from opaque_keys.edx.locations import AssetLocation +from opaque_keys.edx.locator import CourseLocator from PIL import Image from pytz import UTC @@ -80,7 +81,7 @@ class BasicAssetsTestCase(AssetsTestCase): def test_static_url_generation(self): - course_key = SlashSeparatedCourseKey('org', 'class', 'run') + course_key = CourseLocator('org', 'class', 'run') location = course_key.make_asset_key('asset', 'my_file_name.jpg') path = StaticContent.get_static_path_from_location(location) self.assertEquals(path, '/static/my_file_name.jpg') @@ -348,7 +349,7 @@ class AssetToJsonTestCase(AssetsTestCase): def test_basic(self): upload_date = datetime(2013, 6, 1, 10, 30, tzinfo=UTC) content_type = 'image/jpg' - course_key = SlashSeparatedCourseKey('org', 'class', 'run') + course_key = CourseLocator('org', 'class', 'run') location = course_key.make_asset_key('asset', 'my_file_name.jpg') thumbnail_location = course_key.make_asset_key('thumbnail', 'my_file_name_thumb.jpg') @@ -357,10 +358,10 @@ class AssetToJsonTestCase(AssetsTestCase): self.assertEquals(output["display_name"], "my_file") self.assertEquals(output["date_added"], "Jun 01, 2013 at 10:30 UTC") - self.assertEquals(output["url"], "/c4x/org/class/asset/my_file_name.jpg") - self.assertEquals(output["external_url"], "lms_base_url/c4x/org/class/asset/my_file_name.jpg") + self.assertEquals(output["url"], "/asset-v1:org+class+run+type@asset+block@my_file_name.jpg") + self.assertEquals(output["external_url"], "lms_base_url/asset-v1:org+class+run+type@asset+block@my_file_name.jpg") self.assertEquals(output["portable_url"], "/static/my_file_name.jpg") - self.assertEquals(output["thumbnail"], "/c4x/org/class/thumbnail/my_file_name_thumb.jpg") + self.assertEquals(output["thumbnail"], "/asset-v1:org+class+run+type@thumbnail+block@my_file_name_thumb.jpg") self.assertEquals(output["id"], unicode(location)) self.assertEquals(output['locked'], True) diff --git a/common/djangoapps/course_modes/tests/factories.py b/common/djangoapps/course_modes/tests/factories.py index 3f3d876997..f170059adb 100644 --- a/common/djangoapps/course_modes/tests/factories.py +++ b/common/djangoapps/course_modes/tests/factories.py @@ -5,7 +5,7 @@ import random from factory import lazy_attribute from factory.django import DjangoModelFactory -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from course_modes.models import CourseMode @@ -16,7 +16,7 @@ class CourseModeFactory(DjangoModelFactory): class Meta(object): model = CourseMode - course_id = SlashSeparatedCourseKey('MITx', '999', 'Robot_Super_Course') + course_id = CourseLocator('MITx', '999', 'Robot_Super_Course') mode_slug = 'audit' currency = 'usd' expiration_datetime = None diff --git a/common/djangoapps/course_modes/tests/test_models.py b/common/djangoapps/course_modes/tests/test_models.py index bbc8b27482..90dab57cae 100644 --- a/common/djangoapps/course_modes/tests/test_models.py +++ b/common/djangoapps/course_modes/tests/test_models.py @@ -13,7 +13,6 @@ import pytz from django.core.exceptions import ValidationError from django.test import TestCase, override_settings from mock import patch -from opaque_keys.edx.locations import SlashSeparatedCourseKey from opaque_keys.edx.locator import CourseLocator from course_modes.helpers import enrollment_mode_display @@ -33,7 +32,7 @@ class CourseModeModelTest(TestCase): def setUp(self): super(CourseModeModelTest, self).setUp() - self.course_key = SlashSeparatedCourseKey('Test', 'TestCourse', 'TestCourseRun') + self.course_key = CourseLocator('Test', 'TestCourse', 'TestCourseRun') CourseMode.objects.all().delete() def tearDown(self): @@ -156,7 +155,7 @@ class CourseModeModelTest(TestCase): modes = CourseMode.modes_for_course(self.course_key) self.assertEqual([expired_mode_value, mode1], modes) - modes = CourseMode.modes_for_course(SlashSeparatedCourseKey('TestOrg', 'TestCourse', 'TestRun')) + modes = CourseMode.modes_for_course(CourseLocator('TestOrg', 'TestCourse', 'TestRun')) self.assertEqual([CourseMode.DEFAULT_MODE], modes) def test_verified_mode_for_course(self): diff --git a/common/djangoapps/static_replace/test/test_static_replace.py b/common/djangoapps/static_replace/test/test_static_replace.py index 0e8443c815..7c259fed36 100644 --- a/common/djangoapps/static_replace/test/test_static_replace.py +++ b/common/djangoapps/static_replace/test/test_static_replace.py @@ -10,7 +10,7 @@ from django.test import override_settings from django.utils.http import urlencode, urlquote from mock import Mock, patch from nose.tools import assert_equals, assert_false, assert_true # pylint: disable=no-name-in-module -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from PIL import Image from static_replace import ( @@ -32,7 +32,7 @@ from xmodule.modulestore.tests.factories import CourseFactory, check_mongo_calls from xmodule.modulestore.xml import XMLModuleStore DATA_DIRECTORY = 'data_dir' -COURSE_KEY = SlashSeparatedCourseKey('org', 'course', 'run') +COURSE_KEY = CourseKey.from_string('org/course/run') STATIC_SOURCE = '"/static/file.png"' diff --git a/common/djangoapps/util/tests/test_sandboxing.py b/common/djangoapps/util/tests/test_sandboxing.py index 2b944a25a4..2dd9ae6c60 100644 --- a/common/djangoapps/util/tests/test_sandboxing.py +++ b/common/djangoapps/util/tests/test_sandboxing.py @@ -4,8 +4,8 @@ Tests for sandboxing.py in util app from django.test import TestCase from django.test.utils import override_settings -from opaque_keys.edx.locations import SlashSeparatedCourseKey -from opaque_keys.edx.locator import LibraryLocator +from opaque_keys.edx.keys import CourseKey +from opaque_keys.edx.locator import CourseLocator, LibraryLocator from util.sandboxing import can_execute_unsafe_code @@ -19,7 +19,7 @@ class SandboxingTest(TestCase): """ Test to make sure that a non-match returns false """ - self.assertFalse(can_execute_unsafe_code(SlashSeparatedCourseKey('edX', 'notful', 'empty'))) + self.assertFalse(can_execute_unsafe_code(CourseLocator('edX', 'notful', 'empty'))) self.assertFalse(can_execute_unsafe_code(LibraryLocator('edY', 'test_bank'))) @override_settings(COURSES_WITH_UNSAFE_CODE=['edX/full/.*']) @@ -27,14 +27,14 @@ class SandboxingTest(TestCase): """ Test to make sure that a match works across course runs """ - self.assertTrue(can_execute_unsafe_code(SlashSeparatedCourseKey('edX', 'full', '2012_Fall'))) - self.assertTrue(can_execute_unsafe_code(SlashSeparatedCourseKey('edX', 'full', '2013_Spring'))) + self.assertTrue(can_execute_unsafe_code(CourseKey.from_string('edX/full/2012_Fall'))) + self.assertTrue(can_execute_unsafe_code(CourseKey.from_string('edX/full/2013_Spring'))) self.assertFalse(can_execute_unsafe_code(LibraryLocator('edX', 'test_bank'))) def test_courselikes_with_unsafe_code_default(self): """ Test that the default setting for COURSES_WITH_UNSAFE_CODE is an empty setting, e.g. we don't use @override_settings in these tests """ - self.assertFalse(can_execute_unsafe_code(SlashSeparatedCourseKey('edX', 'full', '2012_Fall'))) - self.assertFalse(can_execute_unsafe_code(SlashSeparatedCourseKey('edX', 'full', '2013_Spring'))) + self.assertFalse(can_execute_unsafe_code(CourseLocator('edX', 'full', '2012_Fall'))) + self.assertFalse(can_execute_unsafe_code(CourseLocator('edX', 'full', '2013_Spring'))) self.assertFalse(can_execute_unsafe_code(LibraryLocator('edX', 'test_bank'))) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py index b25a07415b..ef72921691 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mixed_modulestore.py @@ -40,7 +40,7 @@ from xblock.test.tools import TestRuntime if not settings.configured: settings.configure() -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import BlockUsageLocator, CourseLocator, LibraryLocator from xmodule.exceptions import InvalidVersionError from xmodule.modulestore import ModuleStoreEnum @@ -323,7 +323,7 @@ class TestMixedModuleStore(CommonMixedModuleStoreSetup): ) # try an unknown mapping, it should be the 'default' store self.assertEqual(self.store.get_modulestore_type( - SlashSeparatedCourseKey('foo', 'bar', '2012_Fall')), default_ms + CourseKey.from_string('foo/bar/2012_Fall')), default_ms ) @ddt.data(ModuleStoreEnum.Type.mongo, ModuleStoreEnum.Type.split) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py index 90b6fd395b..57423b4170 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py @@ -29,7 +29,7 @@ from opaque_keys.edx.locations import Location from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.mongo import MongoKeyValueStore from xmodule.modulestore.draft import DraftModuleStore -from opaque_keys.edx.locations import SlashSeparatedCourseKey, AssetLocation +from opaque_keys.edx.locations import AssetLocation from opaque_keys.edx.locator import LibraryLocator, CourseLocator from opaque_keys.edx.keys import UsageKey from xmodule.modulestore.xml_exporter import export_course_to_xml @@ -160,7 +160,7 @@ class TestMongoModuleStoreBase(unittest.TestCase): static_content_store=content_store, do_import_static=False, verbose=True, - target_id=SlashSeparatedCourseKey('guestx', 'foo', 'bar') + target_id=CourseKey.from_string('guestx/foo/bar') ) return content_store, draft_store @@ -216,7 +216,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): for course_key in [ - SlashSeparatedCourseKey(*fields) + CourseKey.from_string('/'.join(fields)) for fields in [ ['edX', 'simple', '2012_Fall'], ['edX', 'simple_with_draft', '2012_Fall'], @@ -230,8 +230,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course = self.draft_store.get_course(course_key) assert_not_none(course) assert_true(self.draft_store.has_course(course_key)) - mix_cased = SlashSeparatedCourseKey( - course_key.org.upper(), course_key.course.upper(), course_key.run.lower() + mix_cased = CourseKey.from_string( + '/'.join([course_key.org.upper(), course_key.course.upper(), course_key.run.lower()]) ) assert_false(self.draft_store.has_course(mix_cased)) assert_true(self.draft_store.has_course(mix_cased, ignore_case=True)) @@ -247,7 +247,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course_ids = [course.id for course in courses] for course_key in [ - SlashSeparatedCourseKey(*fields) + CourseKey.from_string('/'.join(fields)) for fields in [ ['guestx', 'foo', 'bar'] ] @@ -259,7 +259,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course_ids = [course.id for course in courses] for course_key in [ - SlashSeparatedCourseKey(*fields) + CourseKey.from_string('/'.join(fields)) for fields in [ ['edX', 'simple', '2012_Fall'], ['edX', 'simple_with_draft', '2012_Fall'], @@ -276,7 +276,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): """ for course_key in [ - SlashSeparatedCourseKey(*fields) + CourseKey.from_string('/'.join(fields)) for fields in [ ['edX', 'simple', 'no_such_course'], ['edX', 'no_such_course', '2012_Fall'], ['NO_SUCH_COURSE', 'Test_iMport_courSe', '2012_Fall'], @@ -285,8 +285,8 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course = self.draft_store.get_course(course_key) assert_is_none(course) assert_false(self.draft_store.has_course(course_key)) - mix_cased = SlashSeparatedCourseKey( - course_key.org.lower(), course_key.course.upper(), course_key.run.upper() + mix_cased = CourseKey.from_string( + '/'.join([course_key.org.lower(), course_key.course.upper(), course_key.run.upper()]) ) assert_false(self.draft_store.has_course(mix_cased)) assert_false(self.draft_store.has_course(mix_cased, ignore_case=True)) @@ -449,13 +449,13 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): for course_number in self.courses: course_locations = self.draft_store.get_courses_for_wiki(course_number) assert_equals(len(course_locations), 1) - assert_equals(SlashSeparatedCourseKey('edX', course_number, '2012_Fall'), course_locations[0]) + assert_equals(CourseKey.from_string('/'.join(['edX', course_number, '2012_Fall'])), course_locations[0]) course_locations = self.draft_store.get_courses_for_wiki('no_such_wiki') assert_equals(len(course_locations), 0) # set toy course to share the wiki with simple course - toy_course = self.draft_store.get_course(SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')) + toy_course = self.draft_store.get_course(CourseKey.from_string('edX/toy/2012_Fall')) toy_course.wiki_slug = 'simple' self.draft_store.update_item(toy_course, ModuleStoreEnum.UserID.test) @@ -467,23 +467,23 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course_locations = self.draft_store.get_courses_for_wiki('simple') assert_equals(len(course_locations), 2) for course_number in ['toy', 'simple']: - assert_in(SlashSeparatedCourseKey('edX', course_number, '2012_Fall'), course_locations) + assert_in(CourseKey.from_string('/'.join(['edX', course_number, '2012_Fall'])), course_locations) # configure simple course to use unique wiki_slug. - simple_course = self.draft_store.get_course(SlashSeparatedCourseKey('edX', 'simple', '2012_Fall')) + simple_course = self.draft_store.get_course(CourseKey.from_string('edX/simple/2012_Fall')) simple_course.wiki_slug = 'edX.simple.2012_Fall' self.draft_store.update_item(simple_course, ModuleStoreEnum.UserID.test) # it should be retrievable with its new wiki_slug course_locations = self.draft_store.get_courses_for_wiki('edX.simple.2012_Fall') assert_equals(len(course_locations), 1) - assert_in(SlashSeparatedCourseKey('edX', 'simple', '2012_Fall'), course_locations) + assert_in(CourseKey.from_string('edX/simple/2012_Fall'), course_locations) @XBlock.register_temp_plugin(ReferenceTestXBlock, 'ref_test') def test_reference_converters(self): """ Test that references types get deserialized correctly """ - course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + course_key = CourseKey.from_string('edX/toy/2012_Fall') def setup_test(): course = self.draft_store.get_course(course_key) @@ -563,7 +563,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): Test to make sure that we have a course image in the contentstore, then export it to ensure it gets copied to both file locations. """ - course_key = SlashSeparatedCourseKey('edX', 'simple', '2012_Fall') + course_key = CourseKey.from_string('edX/simple/2012_Fall') location = course_key.make_asset_key('asset', 'images_course_image.jpg') # This will raise if the course image is missing @@ -581,7 +581,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): Make sure that if a non-default image path is specified that we don't export it to the static default location """ - course = self.draft_store.get_course(SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')) + course = self.draft_store.get_course(CourseKey.from_string('edX/toy/2012_Fall')) assert_true(course.course_image, 'just_a_test.jpg') root_dir = path(mkdtemp()) @@ -595,7 +595,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): Make sure we elegantly passover our code when there isn't a static image """ - course = self.draft_store.get_course(SlashSeparatedCourseKey('edX', 'simple_with_draft', '2012_Fall')) + course = self.draft_store.get_course(CourseKey.from_string('edX/simple_with_draft/2012_Fall')) root_dir = path(mkdtemp()) self.addCleanup(shutil.rmtree, root_dir) export_course_to_xml(self.draft_store, self.content_store, course.id, root_dir, 'test_export') @@ -619,7 +619,7 @@ class TestMongoModuleStore(TestMongoModuleStoreBase): course = 'tree{}'.format(name) run = name - if not self.draft_store.has_course(SlashSeparatedCourseKey(org, course, run)): + if not self.draft_store.has_course(CourseKey.from_string('/'.join[org, course, run])): self.draft_store.create_course(org, course, run, user_id) locations = { @@ -755,7 +755,7 @@ class TestMongoKeyValueStore(unittest.TestCase): def setUp(self): super(TestMongoKeyValueStore, self).setUp() self.data = {'foo': 'foo_value'} - self.course_id = SlashSeparatedCourseKey('org', 'course', 'run') + self.course_id = CourseKey.from_string('org/course/run') self.parent = self.course_id.make_usage_key('parent', 'p') self.children = [self.course_id.make_usage_key('child', 'a'), self.course_id.make_usage_key('child', 'b')] self.metadata = {'meta': 'meta_val'} diff --git a/lms/djangoapps/bulk_email/tests/test_err_handling.py b/lms/djangoapps/bulk_email/tests/test_err_handling.py index bad8c185d7..c82d05c2b4 100644 --- a/lms/djangoapps/bulk_email/tests/test_err_handling.py +++ b/lms/djangoapps/bulk_email/tests/test_err_handling.py @@ -14,7 +14,7 @@ from django.core.urlresolvers import reverse from django.db import DatabaseError from mock import Mock, patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from bulk_email.models import SEND_TO_MYSELF, BulkEmailFlag, CourseEmail from bulk_email.tasks import perform_delegate_email_batches, send_course_email @@ -193,7 +193,7 @@ class TestEmailErrors(ModuleStoreTestCase): """ Tests exception when the course in the email doesn't exist """ - course_id = SlashSeparatedCourseKey("I", "DONT", "EXIST") + course_id = CourseLocator("I", "DONT", "EXIST") email = CourseEmail(course_id=course_id) email.save() entry = InstructorTask.create(course_id, "task_type", "task_key", "task_input", self.instructor) @@ -250,7 +250,7 @@ class TestEmailErrors(ModuleStoreTestCase): Tests exception when the course_id in CourseEmail is not the same as one explicitly passed in. """ email = CourseEmail.create( - SlashSeparatedCourseKey("bogus", "course", "id"), + CourseLocator("bogus", "course", "id"), self.instructor, [SEND_TO_MYSELF], "re: subject", diff --git a/lms/djangoapps/bulk_email/tests/test_forms.py b/lms/djangoapps/bulk_email/tests/test_forms.py index d36b93dacf..2915b49602 100644 --- a/lms/djangoapps/bulk_email/tests/test_forms.py +++ b/lms/djangoapps/bulk_email/tests/test_forms.py @@ -4,7 +4,7 @@ Unit tests for bulk-email-related forms. """ from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from bulk_email.forms import CourseAuthorizationAdminForm, CourseEmailTemplateForm from bulk_email.models import BulkEmailFlag, CourseEmailTemplate @@ -70,7 +70,7 @@ class CourseAuthorizationFormTest(ModuleStoreTestCase): def test_form_typo(self): # Munge course id - bad_id = SlashSeparatedCourseKey(u'Broken{}'.format(self.course.id.org), 'hello', self.course.id.run + '_typo') + bad_id = CourseLocator(u'Broken{}'.format(self.course.id.org), 'hello', self.course.id.run + '_typo') form_data = {'course_id': bad_id.to_deprecated_string(), 'email_enabled': True} form = CourseAuthorizationAdminForm(data=form_data) diff --git a/lms/djangoapps/bulk_email/tests/test_tasks.py b/lms/djangoapps/bulk_email/tests/test_tasks.py index b50796bd42..7d11dd6caa 100644 --- a/lms/djangoapps/bulk_email/tests/test_tasks.py +++ b/lms/djangoapps/bulk_email/tests/test_tasks.py @@ -28,7 +28,7 @@ from django.conf import settings from django.core.management import call_command from mock import Mock, patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from bulk_email.models import SEND_TO_LEARNERS, SEND_TO_MYSELF, SEND_TO_STAFF, CourseEmail, Optout from bulk_email.tasks import _get_course_email_context @@ -120,7 +120,7 @@ class TestBulkEmailInstructorTask(InstructorTaskCourseTestCase): def test_email_undefined_course(self): # Check that we fail when passing in a course that doesn't exist. - task_entry = self._create_input_entry(course_id=SlashSeparatedCourseKey("bogus", "course", "id")) + task_entry = self._create_input_entry(course_id=CourseLocator("bogus", "course", "id")) with self.assertRaises(ValueError): self._run_task_with_mock_celery(send_bulk_course_email, task_entry.id, task_entry.task_id) diff --git a/lms/djangoapps/courseware/tests/factories.py b/lms/djangoapps/courseware/tests/factories.py index 3a0974e924..2ca83d493f 100644 --- a/lms/djangoapps/courseware/tests/factories.py +++ b/lms/djangoapps/courseware/tests/factories.py @@ -5,7 +5,8 @@ from functools import partial import factory from factory.django import DjangoModelFactory -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey +from opaque_keys.edx.locator import CourseLocator from courseware.models import ( StudentModule, @@ -27,7 +28,7 @@ from student.tests.factories import UserFactory # Imported to re-export # TODO fix this (course_id and location are invalid names as constants, and course_id should really be COURSE_KEY) # pylint: disable=invalid-name -course_id = SlashSeparatedCourseKey(u'edX', u'test_course', u'test') +course_id = CourseKey.from_string('edX/test_course/test') location = partial(course_id.make_usage_key, u'problem') @@ -128,7 +129,7 @@ class StudentModuleFactory(DjangoModelFactory): module_type = "problem" student = factory.SubFactory(UserFactory) - course_id = SlashSeparatedCourseKey("MITx", "999", "Robot_Super_Course") + course_id = CourseLocator("MITx", "999", "Robot_Super_Course") state = None grade = None max_grade = None diff --git a/lms/djangoapps/courseware/tests/test_access.py b/lms/djangoapps/courseware/tests/test_access.py index 8afa9f2c2d..d7a4732d46 100644 --- a/lms/djangoapps/courseware/tests/test_access.py +++ b/lms/djangoapps/courseware/tests/test_access.py @@ -15,7 +15,7 @@ from django.test.client import RequestFactory from milestones.tests.utils import MilestonesTestCaseMixin from mock import Mock, patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator import courseware.access as access import courseware.access_response as access_response @@ -500,7 +500,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes user = UserFactory.create() course = Mock( enrollment_start=tomorrow, enrollment_end=tomorrow, - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), enrollment_domain='' + id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='' ) CourseEnrollmentAllowedFactory(email=user.email, course_id=course.id) self.assertTrue(access._has_access_course(user, 'enroll', course)) @@ -513,7 +513,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes # and not specifically allowed course = Mock( enrollment_start=yesterday, enrollment_end=tomorrow, - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), enrollment_domain='', + id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='', invitation_only=True ) user = UserFactory.create() @@ -522,7 +522,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes # Non-staff can enroll if it is between the start and end dates and not invitation only course = Mock( enrollment_start=yesterday, enrollment_end=tomorrow, - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), enrollment_domain='', + id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='', invitation_only=False ) self.assertTrue(access._has_access_course(user, 'enroll', course)) @@ -530,7 +530,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes # Non-staff cannot enroll outside the open enrollment period if not specifically allowed course = Mock( enrollment_start=tomorrow, enrollment_end=tomorrow, - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), enrollment_domain='', + id=CourseLocator('edX', 'test', '2012_Fall'), enrollment_domain='', invitation_only=False ) self.assertFalse(access._has_access_course(user, 'enroll', course)) @@ -544,7 +544,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes Tests the catalog visibility tri-states """ user = UserFactory.create() - course_id = SlashSeparatedCourseKey('edX', 'test', '2012_Fall') + course_id = CourseLocator('edX', 'test', '2012_Fall') staff = StaffFactory.create(course_key=course_id) course = Mock( @@ -558,7 +558,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes # Now set visibility to just about page course = Mock( - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), + id=CourseLocator('edX', 'test', '2012_Fall'), catalog_visibility=CATALOG_VISIBILITY_ABOUT ) self.assertFalse(access._has_access_course(user, 'see_in_catalog', course)) @@ -568,7 +568,7 @@ class AccessTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, MilestonesTes # Now set visibility to none, which means neither in catalog nor about pages course = Mock( - id=SlashSeparatedCourseKey('edX', 'test', '2012_Fall'), + id=CourseLocator('edX', 'test', '2012_Fall'), catalog_visibility=CATALOG_VISIBILITY_NONE ) self.assertFalse(access._has_access_course(user, 'see_in_catalog', course)) @@ -675,7 +675,7 @@ class UserRoleTestCase(TestCase): def setUp(self): super(UserRoleTestCase, self).setUp() - self.course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + self.course_key = CourseLocator('edX', 'toy', '2012_Fall') self.anonymous_user = AnonymousUserFactory() self.student = UserFactory() self.global_staff = UserFactory(is_staff=True) diff --git a/lms/djangoapps/courseware/tests/test_draft_modulestore.py b/lms/djangoapps/courseware/tests/test_draft_modulestore.py index c2985e4057..dac9675b73 100644 --- a/lms/djangoapps/courseware/tests/test_draft_modulestore.py +++ b/lms/djangoapps/courseware/tests/test_draft_modulestore.py @@ -1,6 +1,6 @@ from django.test import TestCase from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from xmodule.modulestore.django import modulestore @@ -14,7 +14,7 @@ class TestDraftModuleStore(TestCase): store = modulestore() # fix was to allow get_items() to take the course_id parameter - store.get_items(SlashSeparatedCourseKey('a', 'b', 'c'), qualifiers={'category': 'vertical'}) + store.get_items(CourseKey.from_string('a/b/c'), qualifiers={'category': 'vertical'}) # test success is just getting through the above statement. # The bug was that 'course_id' argument was diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index e37ef2a3ac..efbfab7de6 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -24,7 +24,6 @@ from milestones.tests.utils import MilestonesTestCaseMixin from mock import MagicMock, Mock, patch from nose.plugins.attrib import attr from opaque_keys.edx.keys import CourseKey, UsageKey -from opaque_keys.edx.locations import SlashSeparatedCourseKey from pyquery import PyQuery from xblock.core import XBlock, XBlockAside from xblock.field_data import FieldData @@ -1645,14 +1644,14 @@ class TestAnonymousStudentId(SharedModuleStoreTestCase, LoginEnrollmentTestCase) # This value is set by observation, so that later changes to the student # id computation don't break old data 'e3b0b940318df9c14be59acb08e78af5', - self._get_anonymous_id(SlashSeparatedCourseKey('MITx', '6.00x', '2012_Fall'), descriptor_class) + self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2012_Fall'), descriptor_class) ) self.assertEquals( # This value is set by observation, so that later changes to the student # id computation don't break old data 'f82b5416c9f54b5ce33989511bb5ef2e', - self._get_anonymous_id(SlashSeparatedCourseKey('MITx', '6.00x', '2013_Spring'), descriptor_class) + self._get_anonymous_id(CourseKey.from_string('MITx/6.00x/2013_Spring'), descriptor_class) ) diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index b54855b36e..0fa498733e 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -41,7 +41,8 @@ from lms.djangoapps.grades.config.waffle import ASSUME_ZERO_GRADE_IF_ABSENT from milestones.tests.utils import MilestonesTestCaseMixin from mock import MagicMock, PropertyMock, create_autospec, patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import Location, SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey +from opaque_keys.edx.locations import Location from openedx.core.djangoapps.catalog.tests.factories import CourseFactory as CatalogCourseFactory from openedx.core.djangoapps.catalog.tests.factories import CourseRunFactory, ProgramFactory from openedx.core.djangoapps.content.course_overviews.models import CourseOverview @@ -86,7 +87,7 @@ class TestJumpTo(ModuleStoreTestCase): def setUp(self): super(TestJumpTo, self).setUp() # Use toy course from XML - self.course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + self.course_key = CourseKey.from_string('edX/toy/2012_Fall') def test_jumpto_invalid_location(self): location = self.course_key.make_usage_key(None, 'NoSuchPlace') @@ -1187,7 +1188,7 @@ class StartDateTests(ModuleStoreTestCase): ) @unittest.skip def test_format_localized_in_xml_course(self): - response = self.get_about_response(SlashSeparatedCourseKey('edX', 'toy', 'TT_2012_Fall')) + response = self.get_about_response(CourseKey.fron_string('edX/toy/TT_2012_Fall')) # The start date is set in common/test/data/two_toys/policies/TT_2012_Fall/policy.json self.assertContains(response, "2015-JULY-17") diff --git a/lms/djangoapps/courseware/tests/tests.py b/lms/djangoapps/courseware/tests/tests.py index cd964dab14..9489ba60f8 100644 --- a/lms/djangoapps/courseware/tests/tests.py +++ b/lms/djangoapps/courseware/tests/tests.py @@ -7,7 +7,7 @@ from unittest import TestCase import mock from django.core.urlresolvers import reverse from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from courseware.tests.helpers import LoginEnrollmentTestCase from lms.djangoapps.lms_xblock.field_data import LmsFieldData @@ -151,7 +151,7 @@ class TestDraftModuleStore(ModuleStoreTestCase): store = modulestore() # fix was to allow get_items() to take the course_id parameter - store.get_items(SlashSeparatedCourseKey('abc', 'def', 'ghi'), qualifiers={'category': 'vertical'}) + store.get_items(CourseKey.from_string('abc/def/ghi'), qualifiers={'category': 'vertical'}) # test success is just getting through the above statement. # The bug was that 'course_id' argument was diff --git a/lms/djangoapps/dashboard/management/commands/tests/test_git_add_course.py b/lms/djangoapps/dashboard/management/commands/tests/test_git_add_course.py index f45e1d94e7..9bb05a4693 100644 --- a/lms/djangoapps/dashboard/management/commands/tests/test_git_add_course.py +++ b/lms/djangoapps/dashboard/management/commands/tests/test_git_add_course.py @@ -14,7 +14,7 @@ from django.core.management import call_command from django.core.management.base import CommandError from django.test.utils import override_settings from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey import dashboard.git_import as git_import from dashboard.git_import import ( @@ -57,7 +57,7 @@ class TestGitAddCourse(SharedModuleStoreTestCase): TEST_REPO = 'https://github.com/mitocw/edx4edx_lite.git' TEST_COURSE = 'MITx/edx4edx/edx4edx' TEST_BRANCH = 'testing_do_not_delete' - TEST_BRANCH_COURSE = SlashSeparatedCourseKey('MITx', 'edx4edx_branch', 'edx4edx') + TEST_BRANCH_COURSE = CourseKey.from_string('MITx/edx4edx_branch/edx4edx') ENABLED_CACHES = ['default', 'mongo_metadata_inheritance', 'loc_cache'] @@ -183,7 +183,7 @@ class TestGitAddCourse(SharedModuleStoreTestCase): repo_dir / 'edx4edx_lite', 'master') self.assertIsNone(def_ms.get_course(self.TEST_BRANCH_COURSE)) - self.assertIsNotNone(def_ms.get_course(SlashSeparatedCourseKey.from_deprecated_string(self.TEST_COURSE))) + self.assertIsNotNone(def_ms.get_course(CourseKey.from_string(self.TEST_COURSE))) def test_branch_exceptions(self): """ diff --git a/lms/djangoapps/dashboard/tests/test_sysadmin.py b/lms/djangoapps/dashboard/tests/test_sysadmin.py index 0d3322edfe..5ae1eeba19 100644 --- a/lms/djangoapps/dashboard/tests/test_sysadmin.py +++ b/lms/djangoapps/dashboard/tests/test_sysadmin.py @@ -16,7 +16,7 @@ from django.test.client import Client from django.test.utils import override_settings from django.utils.timezone import utc as UTC from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from dashboard.git_import import GitImportErrorNoDir from dashboard.models import CourseImportLog @@ -46,7 +46,7 @@ class SysadminBaseTestCase(SharedModuleStoreTestCase): TEST_REPO = 'https://github.com/mitocw/edx4edx_lite.git' TEST_BRANCH = 'testing_do_not_delete' - TEST_BRANCH_COURSE = SlashSeparatedCourseKey('MITx', 'edx4edx_branch', 'edx4edx') + TEST_BRANCH_COURSE = CourseKey.from_string('MITx/edx4edx_branch/edx4edx') def setUp(self): """Setup test case by adding primary user.""" @@ -78,7 +78,7 @@ class SysadminBaseTestCase(SharedModuleStoreTestCase): course = def_ms.courses.get(course_path, None) except AttributeError: # Using mongo store - course = def_ms.get_course(SlashSeparatedCourseKey('MITx', 'edx4edx', 'edx4edx')) + course = def_ms.get_course(CourseKey.from_string('MITx/edx4edx/edx4edx')) # Delete git loaded course response = self.client.post( @@ -168,11 +168,11 @@ class TestSysAdminMongoCourseImport(SysadminBaseTestCase): self.assertNotEqual('xml', def_ms.get_modulestore_type(None)) self._add_edx4edx() - course = def_ms.get_course(SlashSeparatedCourseKey('MITx', 'edx4edx', 'edx4edx')) + course = def_ms.get_course(CourseKey.from_string('MITx/edx4edx/edx4edx')) self.assertIsNotNone(course) self._rm_edx4edx() - course = def_ms.get_course(SlashSeparatedCourseKey('MITx', 'edx4edx', 'edx4edx')) + course = def_ms.get_course(CourseKey.from_string('MITx/edx4edx/edx4edx')) self.assertIsNone(course) def test_course_info(self): @@ -301,7 +301,7 @@ class TestSysAdminMongoCourseImport(SysadminBaseTestCase): for _ in xrange(15): CourseImportLog( - course_id=SlashSeparatedCourseKey("test", "test", "test"), + course_id=CourseKey.from_string("test/test/test"), location="location", import_log="import_log", git_log="git_log", @@ -347,7 +347,7 @@ class TestSysAdminMongoCourseImport(SysadminBaseTestCase): # Add user as staff in course team def_ms = modulestore() - course = def_ms.get_course(SlashSeparatedCourseKey('MITx', 'edx4edx', 'edx4edx')) + course = def_ms.get_course(CourseKey.from_string('MITx/edx4edx/edx4edx')) CourseStaffRole(course.id).add_users(self.user) self.assertTrue(CourseStaffRole(course.id).has_user(self.user)) diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py index f05228627b..f731629620 100644 --- a/lms/djangoapps/instructor/tests/test_api.py +++ b/lms/djangoapps/instructor/tests/test_api.py @@ -25,7 +25,7 @@ from django.utils.translation import ugettext as _ from mock import Mock, patch from nose.plugins.attrib import attr from nose.tools import raises -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import UsageKey import lms.djangoapps.instructor.views.api @@ -4075,10 +4075,10 @@ class TestInstructorAPIHelpers(TestCase): self.assertEqual(_split_input_list(scary_unistuff), [scary_unistuff]) def test_msk_from_problem_urlname(self): - course_id = SlashSeparatedCourseKey('MITx', '6.002x', '2013_Spring') + course_id = CourseKey.from_string('MITx/6.002x/2013_Spring') name = 'L2Node1' output = 'i4x://MITx/6.002x/problem/L2Node1' - self.assertEqual(msk_from_problem_urlname(course_id, name).to_deprecated_string(), output) + self.assertEqual(unicode(msk_from_problem_urlname(course_id, name)), output) @raises(ValueError) def test_msk_from_problem_urlname_error(self): diff --git a/lms/djangoapps/instructor/tests/test_email.py b/lms/djangoapps/instructor/tests/test_email.py index fb18334b0d..4a0b89ffd4 100644 --- a/lms/djangoapps/instructor/tests/test_email.py +++ b/lms/djangoapps/instructor/tests/test_email.py @@ -7,7 +7,7 @@ that the view is conditionally available when Course Auth is turned on. from django.core.urlresolvers import reverse from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from bulk_email.models import BulkEmailFlag, CourseAuthorization from student.tests.factories import AdminFactory @@ -119,10 +119,10 @@ class TestNewInstructorDashboardEmailViewXMLBacked(SharedModuleStoreTestCase): @classmethod def setUpClass(cls): super(TestNewInstructorDashboardEmailViewXMLBacked, cls).setUpClass() - cls.course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + cls.course_key = CourseKey.from_string('edX/toy/2012_Fall') # URL for instructor dash - cls.url = reverse('instructor_dashboard', kwargs={'course_id': cls.course_key.to_deprecated_string()}) + cls.url = reverse('instructor_dashboard', kwargs={'course_id': unicode(cls.course_key)}) # URL for email view cls.email_link = '' diff --git a/lms/djangoapps/instructor/tests/test_enrollment.py b/lms/djangoapps/instructor/tests/test_enrollment.py index af8a5604ab..3593ad5d38 100644 --- a/lms/djangoapps/instructor/tests/test_enrollment.py +++ b/lms/djangoapps/instructor/tests/test_enrollment.py @@ -13,7 +13,7 @@ from django.utils.translation import override as override_language from django.utils.translation import get_language from mock import patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory from courseware.models import StudentModule @@ -44,7 +44,7 @@ class TestSettableEnrollmentState(CacheIsolationTestCase): """ Test the basis class for enrollment tests. """ def setUp(self): super(TestSettableEnrollmentState, self).setUp() - self.course_key = SlashSeparatedCourseKey('Robot', 'fAKE', 'C-%-se-%-ID') + self.course_key = CourseLocator('Robot', 'fAKE', 'C--se--ID') def test_mes_create(self): """ @@ -75,7 +75,7 @@ class TestEnrollmentChangeBase(CacheIsolationTestCase): def setUp(self): super(TestEnrollmentChangeBase, self).setUp() - self.course_key = SlashSeparatedCourseKey('Robot', 'fAKE', 'C-%-se-%-ID') + self.course_key = CourseLocator('Robot', 'fAKE', 'C--se--ID') def _run_state_change_test(self, before_ideal, after_ideal, action): """ diff --git a/lms/djangoapps/instructor_analytics/tests/test_distributions.py b/lms/djangoapps/instructor_analytics/tests/test_distributions.py index 0a91a04ba1..80923d5baf 100644 --- a/lms/djangoapps/instructor_analytics/tests/test_distributions.py +++ b/lms/djangoapps/instructor_analytics/tests/test_distributions.py @@ -2,7 +2,7 @@ from django.test import TestCase from nose.tools import raises -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from instructor_analytics.distributions import AVAILABLE_PROFILE_FEATURES, profile_distribution from student.models import CourseEnrollment @@ -14,7 +14,7 @@ class TestAnalyticsDistributions(TestCase): def setUp(self): super(TestAnalyticsDistributions, self).setUp() - self.course_id = SlashSeparatedCourseKey('robot', 'course', 'id') + self.course_id = CourseLocator('robot', 'course', 'id') self.users = [UserFactory( profile__gender=['m', 'f', 'o'][i % 3], @@ -77,7 +77,7 @@ class TestAnalyticsDistributionsNoData(TestCase): def setUp(self): super(TestAnalyticsDistributionsNoData, self).setUp() - self.course_id = SlashSeparatedCourseKey('robot', 'course', 'id') + self.course_id = CourseLocator('robot', 'course', 'id') self.users = [UserFactory( profile__year_of_birth=i + 1930, diff --git a/lms/djangoapps/instructor_task/tests/factories.py b/lms/djangoapps/instructor_task/tests/factories.py index 9be5423dce..c194e46d7e 100644 --- a/lms/djangoapps/instructor_task/tests/factories.py +++ b/lms/djangoapps/instructor_task/tests/factories.py @@ -3,7 +3,7 @@ import json import factory from celery.states import PENDING from factory.django import DjangoModelFactory -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.locator import CourseLocator from lms.djangoapps.instructor_task.models import InstructorTask from student.tests.factories import UserFactory as StudentUserFactory @@ -14,7 +14,7 @@ class InstructorTaskFactory(DjangoModelFactory): model = InstructorTask task_type = 'rescore_problem' - course_id = SlashSeparatedCourseKey("MITx", "999", "Robot_Super_Course") + course_id = CourseLocator("MITx", "999", "Robot_Super_Course") task_input = json.dumps({}) task_key = None task_id = None diff --git a/lms/djangoapps/instructor_task/tests/test_base.py b/lms/djangoapps/instructor_task/tests/test_base.py index d9be20925a..3bc4a6baad 100644 --- a/lms/djangoapps/instructor_task/tests/test_base.py +++ b/lms/djangoapps/instructor_task/tests/test_base.py @@ -14,7 +14,8 @@ from celery.states import FAILURE, SUCCESS from django.contrib.auth.models import User from django.core.urlresolvers import reverse from mock import Mock, patch -from opaque_keys.edx.locations import Location, SlashSeparatedCourseKey +from opaque_keys.edx.locations import Location +from opaque_keys.edx.keys import CourseKey from capa.tests.response_xml_factory import OptionResponseXMLFactory from courseware.model_data import StudentModule @@ -34,7 +35,7 @@ from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory TEST_COURSE_ORG = 'edx' TEST_COURSE_NAME = 'test_course' TEST_COURSE_NUMBER = '1.23x' -TEST_COURSE_KEY = SlashSeparatedCourseKey(TEST_COURSE_ORG, TEST_COURSE_NUMBER, TEST_COURSE_NAME) +TEST_COURSE_KEY = CourseKey.from_string('/'.join([TEST_COURSE_ORG, TEST_COURSE_NUMBER, TEST_COURSE_NAME])) TEST_CHAPTER_NAME = "Section" TEST_SECTION_NAME = "Subsection" diff --git a/lms/djangoapps/lms_xblock/test/test_runtime.py b/lms/djangoapps/lms_xblock/test/test_runtime.py index aa6331d969..73e4db3026 100644 --- a/lms/djangoapps/lms_xblock/test/test_runtime.py +++ b/lms/djangoapps/lms_xblock/test/test_runtime.py @@ -9,7 +9,7 @@ from django.conf import settings from django.test import TestCase from mock import Mock, patch from opaque_keys.edx.keys import CourseKey -from opaque_keys.edx.locations import BlockUsageLocator, CourseLocator, SlashSeparatedCourseKey +from opaque_keys.edx.locations import BlockUsageLocator, CourseLocator from xblock.exceptions import NoSuchServiceError from xblock.fields import ScopeIds @@ -56,7 +56,7 @@ class TestHandlerUrl(TestCase): def setUp(self): super(TestHandlerUrl, self).setUp() self.block = BlockMock(name='block', scope_ids=ScopeIds(None, None, None, 'dummy')) - self.course_key = SlashSeparatedCourseKey("org", "course", "run") + self.course_key = CourseLocator("org", "course", "run") self.runtime = LmsModuleSystem( static_url='/static', track_function=Mock(), @@ -120,7 +120,7 @@ class TestUserServiceAPI(TestCase): def setUp(self): super(TestUserServiceAPI, self).setUp() - self.course_id = SlashSeparatedCourseKey("org", "course", "run") + self.course_id = CourseLocator("org", "course", "run") self.user = UserFactory.create() def mock_get_real_user(_anon_id): diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index 08ccb815f2..c72c4de518 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -24,7 +24,7 @@ from django.test.client import Client, RequestFactory from django.test.utils import override_settings from mock import Mock, patch from nose.plugins.attrib import attr -from opaque_keys.edx.locations import SlashSeparatedCourseKey +from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import CourseLocator from waffle.testutils import override_switch @@ -1310,7 +1310,7 @@ class TestCreateOrderView(ModuleStoreTestCase): self.course_id = 'Robot/999/Test_Course' self.course = CourseFactory.create(org='Robot', number='999', display_name='Test Course') verified_mode = CourseMode( - course_id=SlashSeparatedCourseKey("Robot", "999", 'Test_Course'), + course_id=CourseKey.from_string("Robot/999/Test_Course"), mode_slug="verified", mode_display_name="Verified Certificate", min_price=50