diff --git a/cms/djangoapps/contentstore/tests/test_import.py b/cms/djangoapps/contentstore/tests/test_import.py index 4297df6..bf75b96 100644 --- a/cms/djangoapps/contentstore/tests/test_import.py +++ b/cms/djangoapps/contentstore/tests/test_import.py @@ -16,7 +16,6 @@ from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.django import modulestore from xmodule.contentstore.django import contentstore from xmodule.modulestore.tests.factories import check_exact_number_of_calls, check_number_of_calls -from opaque_keys.edx.locations import SlashSeparatedCourseKey, AssetLocation from xmodule.modulestore.xml_importer import import_from_xml from xmodule.exceptions import NotFoundError from uuid import uuid4 @@ -40,13 +39,14 @@ class ContentStoreImportTest(ModuleStoreTestCase): self.client = Client() self.client.login(username=self.user.username, password=password) - def load_test_import_course(self, target_course_id=None, create_new_course_if_not_present=False): + def load_test_import_course(self, target_course_id=None, create_course_if_not_present=True, module_store=None): ''' Load the standard course used to test imports (for do_import_static=False behavior). ''' content_store = contentstore() - module_store = modulestore() + if module_store is None: + module_store = modulestore() import_from_xml( module_store, self.user.id, @@ -56,7 +56,7 @@ class ContentStoreImportTest(ModuleStoreTestCase): do_import_static=False, verbose=True, target_course_id=target_course_id, - create_course_if_not_present=create_new_course_if_not_present, + create_course_if_not_present=create_course_if_not_present, ) course_id = module_store.make_course_key('edX', 'test_import_course', '2012_Fall') course = module_store.get_course(course_id) @@ -84,13 +84,14 @@ class ContentStoreImportTest(ModuleStoreTestCase): # Test that importing course with unicode 'id' and 'display name' doesn't give UnicodeEncodeError """ module_store = modulestore() - course_id = SlashSeparatedCourseKey(u'Юникода', u'unicode_course', u'échantillon') + course_id = module_store.make_course_key(u'Юникода', u'unicode_course', u'échantillon') import_from_xml( module_store, self.user.id, TEST_DATA_DIR, ['2014_Uni'], - target_course_id=course_id + target_course_id=course_id, + create_course_if_not_present=True ) course = module_store.get_course(course_id) @@ -113,9 +114,7 @@ class ContentStoreImportTest(ModuleStoreTestCase): content = None try: - location = AssetLocation.from_deprecated_string( - '/c4x/edX/test_import_course/asset/should_be_imported.html' - ) + location = course.id.make_asset_key('asset', 'should_be_imported.html') content = content_store.find(location) except NotFoundError: pass @@ -133,9 +132,13 @@ class ContentStoreImportTest(ModuleStoreTestCase): content_store = contentstore() module_store = modulestore() - import_from_xml(module_store, self.user.id, TEST_DATA_DIR, ['toy'], static_content_store=content_store, do_import_static=False, verbose=True) + import_from_xml( + module_store, self.user.id, TEST_DATA_DIR, ['toy'], + static_content_store=content_store, do_import_static=False, + create_course_if_not_present=True, verbose=True + ) - course = module_store.get_course(SlashSeparatedCourseKey('edX', 'toy', '2012_Fall')) + course = module_store.get_course(module_store.make_course_key('edX', 'toy', '2012_Fall')) # make sure we have NO assets in our contentstore all_assets, count = content_store.get_all_content_for_course(course.id) @@ -144,7 +147,10 @@ class ContentStoreImportTest(ModuleStoreTestCase): def test_no_static_link_rewrites_on_import(self): module_store = modulestore() - courses = import_from_xml(module_store, self.user.id, TEST_DATA_DIR, ['toy'], do_import_static=False, verbose=True) + courses = import_from_xml( + module_store, self.user.id, TEST_DATA_DIR, ['toy'], do_import_static=False, verbose=True, + create_course_if_not_present=True + ) course_key = courses[0].id handouts = module_store.get_item(course_key.make_usage_key('course_info', 'handouts')) @@ -171,17 +177,19 @@ class ContentStoreImportTest(ModuleStoreTestCase): # NOTE: On Jenkins, with memcache enabled, the number of calls here is only 1. # Locally, without memcache, the number of calls is actually 2 (once more during the publish step) with check_number_of_calls(store, '_compute_metadata_inheritance_tree', 2): - self.load_test_import_course() + self.load_test_import_course(create_course_if_not_present=False, module_store=store) @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_new_course_if_not_present=True) + __, __, course = self.load_test_import_course(create_course_if_not_present=True) self.load_test_import_course(target_course_id=course.id) def test_rewrite_reference_list(self): - module_store = modulestore() - target_course_id = SlashSeparatedCourseKey('testX', 'conditional_copy', 'copy_run') + # 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) + target_course_id = module_store.make_course_key('testX', 'conditional_copy', 'copy_run') import_from_xml( module_store, self.user.id, @@ -193,7 +201,7 @@ class ContentStoreImportTest(ModuleStoreTestCase): target_course_id.make_usage_key('conditional', 'condone') ) self.assertIsNotNone(conditional_module) - different_course_id = SlashSeparatedCourseKey('edX', 'different_course', None) + different_course_id = module_store.make_course_key('edX', 'different_course', None) self.assertListEqual( [ target_course_id.make_usage_key('problem', 'choiceprob'), @@ -211,13 +219,14 @@ class ContentStoreImportTest(ModuleStoreTestCase): def test_rewrite_reference(self): module_store = modulestore() - target_course_id = SlashSeparatedCourseKey('testX', 'peergrading_copy', 'copy_run') + target_course_id = module_store.make_course_key('testX', 'peergrading_copy', 'copy_run') import_from_xml( module_store, self.user.id, TEST_DATA_DIR, ['open_ended'], - target_course_id=target_course_id + target_course_id=target_course_id, + create_course_if_not_present=True ) peergrading_module = module_store.get_item( target_course_id.make_usage_key('peergrading', 'PeerGradingLinked') @@ -252,13 +261,14 @@ class ContentStoreImportTest(ModuleStoreTestCase): def _verify_split_test_import(self, target_course_name, source_course_name, split_test_name, groups_to_verticals): module_store = modulestore() - target_course_id = SlashSeparatedCourseKey('testX', target_course_name, 'copy_run') + target_course_id = module_store.make_course_key('testX', target_course_name, 'copy_run') import_from_xml( module_store, self.user.id, TEST_DATA_DIR, [source_course_name], - target_course_id=target_course_id + target_course_id=target_course_id, + create_course_if_not_present=True ) split_test_module = module_store.get_item( target_course_id.make_usage_key('split_test', split_test_name) diff --git a/cms/djangoapps/contentstore/tests/test_import_draft_order.py b/cms/djangoapps/contentstore/tests/test_import_draft_order.py index 4f3e2c1..29484ea 100644 --- a/cms/djangoapps/contentstore/tests/test_import_draft_order.py +++ b/cms/djangoapps/contentstore/tests/test_import_draft_order.py @@ -13,7 +13,9 @@ class DraftReorderTestCase(ModuleStoreTestCase): def test_order(self): store = modulestore() - course_items = import_from_xml(store, self.user.id, TEST_DATA_DIR, ['import_draft_order']) + course_items = import_from_xml( + store, self.user.id, TEST_DATA_DIR, ['import_draft_order'], create_course_if_not_present=True + ) course_key = course_items[0].id sequential = store.get_item(course_key.make_usage_key('sequential', '0f4f7649b10141b0bdc9922dcf94515a')) verticals = sequential.children diff --git a/cms/djangoapps/contentstore/tests/test_permissions.py b/cms/djangoapps/contentstore/tests/test_permissions.py index 5a2274c..f509e80 100644 --- a/cms/djangoapps/contentstore/tests/test_permissions.py +++ b/cms/djangoapps/contentstore/tests/test_permissions.py @@ -7,7 +7,6 @@ from django.contrib.auth.models import User from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from contentstore.tests.utils import AjaxEnabledTestClient -from opaque_keys.edx.locations import SlashSeparatedCourseKey from contentstore.utils import reverse_url, reverse_course_url from student.roles import CourseInstructorRole, CourseStaffRole, OrgStaffRole, OrgInstructorRole from student import auth @@ -29,7 +28,7 @@ class TestCourseAccess(ModuleStoreTestCase): self.client.login(username=self.user.username, password=user_password) # create a course via the view handler which has a different strategy for permissions than the factory - self.course_key = SlashSeparatedCourseKey('myu', 'mydept.mycourse', 'myrun') + self.course_key = self.store.make_course_key('myu', 'mydept.mycourse', 'myrun') course_url = reverse_url('course_handler') self.client.ajax_post( course_url, @@ -101,7 +100,7 @@ class TestCourseAccess(ModuleStoreTestCase): self.assertContains(response, user.email) # test copying course permissions - copy_course_key = SlashSeparatedCourseKey('copyu', 'copydept.mycourse', 'myrun') + copy_course_key = self.store.make_course_key('copyu', 'copydept.mycourse', 'myrun') for role in [CourseInstructorRole, CourseStaffRole, OrgStaffRole, OrgInstructorRole]: if (role is OrgStaffRole) or (role is OrgInstructorRole): auth.add_users( diff --git a/cms/djangoapps/contentstore/tests/test_users_default_role.py b/cms/djangoapps/contentstore/tests/test_users_default_role.py index c02b657..c4a1bed 100644 --- a/cms/djangoapps/contentstore/tests/test_users_default_role.py +++ b/cms/djangoapps/contentstore/tests/test_users_default_role.py @@ -6,7 +6,6 @@ from contentstore.tests.utils import AjaxEnabledTestClient from contentstore.utils import delete_course_and_groups, reverse_url from courseware.tests.factories import UserFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase -from opaque_keys.edx.locations import SlashSeparatedCourseKey from student.models import CourseEnrollment @@ -26,7 +25,7 @@ class TestUsersDefaultRole(ModuleStoreTestCase): self.client.login(username=self.user.username, password='test') # create a course via the view handler to create course - self.course_key = SlashSeparatedCourseKey('Org_1', 'Course_1', 'Run_1') + self.course_key = self.store.make_course_key('Org_1', 'Course_1', 'Run_1') self._create_course_with_given_location(self.course_key) def _create_course_with_given_location(self, course_key): diff --git a/cms/lib/xblock/test/test_authoring_mixin.py b/cms/lib/xblock/test/test_authoring_mixin.py index 326b8cc..3103eeb 100644 --- a/cms/lib/xblock/test/test_authoring_mixin.py +++ b/cms/lib/xblock/test/test_authoring_mixin.py @@ -27,16 +27,18 @@ class AuthoringMixinTestCase(ModuleStoreTestCase): parent_location=chapter.location, display_name='Test Sequential' ) - self.vertical = ItemFactory.create( + vertical = ItemFactory.create( category='vertical', parent_location=sequential.location, display_name='Test Vertical' ) - self.video = ItemFactory.create( + video = ItemFactory.create( category='video', - parent_location=self.vertical.location, + parent_location=vertical.location, display_name='Test Vertical' ) + self.vertical_location = vertical.location + self.video_location = video.location self.pet_groups = [Group(1, 'Cat Lovers'), Group(2, 'Dog Lovers')] def create_content_groups(self, content_groups): @@ -54,68 +56,72 @@ class AuthoringMixinTestCase(ModuleStoreTestCase): self.course.user_partitions = [self.content_partition] self.store.update_item(self.course, self.user.id) - def set_staff_only(self, item): + def set_staff_only(self, item_location): """Make an item visible to staff only.""" + item = self.store.get_item(item_location) item.visible_to_staff_only = True self.store.update_item(item, self.user.id) - def set_group_access(self, item, group_ids): + def set_group_access(self, item_location, group_ids): """ Set group_access for the specified item to the specified group ids within the content partition. """ + item = self.store.get_item(item_location) item.group_access[self.content_partition.id] = group_ids # pylint: disable=no-member self.store.update_item(item, self.user.id) - def verify_visibility_view_contains(self, item, substrings): + def verify_visibility_view_contains(self, item_location, substrings): """ Verify that an item's visibility view returns an html string containing all the expected substrings. """ + item = self.store.get_item(item_location) html = item.visibility_view().body_html() for string in substrings: self.assertIn(string, html) def test_html_no_partition(self): - self.verify_visibility_view_contains(self.video, 'No content groups exist') + self.verify_visibility_view_contains(self.video_location, 'No content groups exist') def test_html_empty_partition(self): self.create_content_groups([]) - self.verify_visibility_view_contains(self.video, 'No content groups exist') + self.verify_visibility_view_contains(self.video_location, 'No content groups exist') def test_html_populated_partition(self): self.create_content_groups(self.pet_groups) - self.verify_visibility_view_contains(self.video, ['Cat Lovers', 'Dog Lovers']) + self.verify_visibility_view_contains(self.video_location, ['Cat Lovers', 'Dog Lovers']) def test_html_no_partition_staff_locked(self): - self.set_staff_only(self.vertical) - self.verify_visibility_view_contains(self.video, ['No content groups exist']) + self.set_staff_only(self.vertical_location) + self.verify_visibility_view_contains(self.video_location, ['No content groups exist']) def test_html_empty_partition_staff_locked(self): self.create_content_groups([]) - self.set_staff_only(self.vertical) - self.verify_visibility_view_contains(self.video, 'No content groups exist') + self.set_staff_only(self.vertical_location) + self.verify_visibility_view_contains(self.video_location, 'No content groups exist') def test_html_populated_partition_staff_locked(self): self.create_content_groups(self.pet_groups) - self.set_staff_only(self.vertical) + self.set_staff_only(self.vertical_location) self.verify_visibility_view_contains( - self.video, ['The Unit this component is contained in is hidden from students.', 'Cat Lovers', 'Dog Lovers'] + self.video_location, + ['The Unit this component is contained in is hidden from students.', 'Cat Lovers', 'Dog Lovers'] ) def test_html_false_content_group(self): self.create_content_groups(self.pet_groups) - self.set_group_access(self.video, ['false_group_id']) + self.set_group_access(self.video_location, ['false_group_id']) self.verify_visibility_view_contains( - self.video, ['Cat Lovers', 'Dog Lovers', 'Content group no longer exists.'] + self.video_location, ['Cat Lovers', 'Dog Lovers', 'Content group no longer exists.'] ) def test_html_false_content_group_staff_locked(self): self.create_content_groups(self.pet_groups) - self.set_staff_only(self.vertical) - self.set_group_access(self.video, ['false_group_id']) + self.set_staff_only(self.vertical_location) + self.set_group_access(self.video_location, ['false_group_id']) self.verify_visibility_view_contains( - self.video, + self.video_location, [ 'Cat Lovers', 'Dog Lovers', diff --git a/common/djangoapps/student/tests/test_course_listing.py b/common/djangoapps/student/tests/test_course_listing.py index 35dd4b1..87160c6 100644 --- a/common/djangoapps/student/tests/test_course_listing.py +++ b/common/djangoapps/student/tests/test_course_listing.py @@ -10,13 +10,11 @@ from student.roles import GlobalStaff from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory -from opaque_keys.edx.locations import SlashSeparatedCourseKey from xmodule.modulestore.django import modulestore from xmodule.error_module import ErrorDescriptor from django.test.client import Client from student.models import CourseEnrollment from student.views import get_course_enrollment_pairs -from opaque_keys.edx.keys import CourseKey from util.milestones_helpers import ( get_pre_requisite_courses_not_completed, set_prerequisite_courses, @@ -42,7 +40,7 @@ class TestCourseListing(ModuleStoreTestCase): self.client = Client() self.client.login(username=self.teacher.username, password='test') - def _create_course_with_access_groups(self, course_location, metadata=None): + def _create_course_with_access_groups(self, course_location, metadata=None, default_store=None): """ Create dummy course with 'CourseFactory' and enroll the student """ @@ -51,7 +49,8 @@ class TestCourseListing(ModuleStoreTestCase): org=course_location.org, number=course_location.course, run=course_location.run, - metadata=metadata + metadata=metadata, + default_store=default_store ) CourseEnrollment.enroll(self.student, course.id) @@ -70,7 +69,7 @@ class TestCourseListing(ModuleStoreTestCase): """ Test getting courses """ - course_location = SlashSeparatedCourseKey('Org1', 'Course1', 'Run1') + course_location = self.store.make_course_key('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_location) # get dashboard @@ -87,8 +86,10 @@ class TestCourseListing(ModuleStoreTestCase): """ Test the course list for regular staff when get_course returns an ErrorDescriptor """ - course_key = SlashSeparatedCourseKey('Org1', 'Course1', 'Run1') - self._create_course_with_access_groups(course_key) + # pylint: disable=protected-access + mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) + course_key = mongo_store.make_course_key('Org1', 'Course1', 'Run1') + self._create_course_with_access_groups(course_key, default_store=ModuleStoreEnum.Type.mongo) with patch('xmodule.modulestore.mongo.base.MongoKeyValueStore', Mock(side_effect=Exception)): self.assertIsInstance(modulestore().get_course(course_key), ErrorDescriptor) @@ -104,15 +105,15 @@ class TestCourseListing(ModuleStoreTestCase): """ mongo_store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) - good_location = SlashSeparatedCourseKey('testOrg', 'testCourse', 'RunBabyRun') - self._create_course_with_access_groups(good_location) + good_location = mongo_store.make_course_key('testOrg', 'testCourse', 'RunBabyRun') + self._create_course_with_access_groups(good_location, default_store=ModuleStoreEnum.Type.mongo) - course_location = SlashSeparatedCourseKey('testOrg', 'doomedCourse', 'RunBabyRun') - self._create_course_with_access_groups(course_location) + course_location = mongo_store.make_course_key('testOrg', 'doomedCourse', 'RunBabyRun') + self._create_course_with_access_groups(course_location, default_store=ModuleStoreEnum.Type.mongo) mongo_store.delete_course(course_location, ModuleStoreEnum.UserID.test) - course_location = SlashSeparatedCourseKey('testOrg', 'erroredCourse', 'RunBabyRun') - course = self._create_course_with_access_groups(course_location) + course_location = mongo_store.make_course_key('testOrg', 'erroredCourse', 'RunBabyRun') + course = self._create_course_with_access_groups(course_location, default_store=ModuleStoreEnum.Type.mongo) course_db_record = mongo_store._find_one(course.location) course_db_record.setdefault('metadata', {}).get('tabs', []).append({ "type": "wiko", @@ -137,18 +138,18 @@ class TestCourseListing(ModuleStoreTestCase): Checks course where pre-requisite course is set has appropriate info. """ seed_milestone_relationship_types() - course_location2 = CourseKey.from_string('Org1/Course2/Run2') + course_location2 = self.store.make_course_key('Org1', 'Course2', 'Run2') self._create_course_with_access_groups(course_location2) - pre_requisite_course_location = CourseKey.from_string('Org1/Course3/Run3') + pre_requisite_course_location = self.store.make_course_key('Org1', 'Course3', 'Run3') self._create_course_with_access_groups(pre_requisite_course_location) - pre_requisite_course_location2 = CourseKey.from_string('Org1/Course4/Run4') + pre_requisite_course_location2 = self.store.make_course_key('Org1', 'Course4', 'Run4') self._create_course_with_access_groups(pre_requisite_course_location2) # create a course with pre_requisite_courses pre_requisite_courses = [ unicode(pre_requisite_course_location), unicode(pre_requisite_course_location2), ] - course_location = CourseKey.from_string('Org1/Course1/Run1') + course_location = self.store.make_course_key('Org1', 'Course1', 'Run1') self._create_course_with_access_groups(course_location, { 'pre_requisite_courses': pre_requisite_courses }) diff --git a/lms/djangoapps/courseware/tests/test_courses.py b/lms/djangoapps/courseware/tests/test_courses.py index 541a0d6..ec738c4 100644 --- a/lms/djangoapps/courseware/tests/test_courses.py +++ b/lms/djangoapps/courseware/tests/test_courses.py @@ -43,9 +43,9 @@ class CoursesTest(ModuleStoreTestCase): org='org', number='num', display_name='name' ) - cms_url = u"//{}/course/org/num/name".format(CMS_BASE_TEST) + cms_url = u"//{}/course/{}".format(CMS_BASE_TEST, unicode(self.course.id)) self.assertEqual(cms_url, get_cms_course_link(self.course)) - cms_url = u"//{}/course/i4x://org/num/course/name".format(CMS_BASE_TEST) + cms_url = u"//{}/course/{}".format(CMS_BASE_TEST, unicode(self.course.location)) self.assertEqual(cms_url, get_cms_block_link(self.course, 'course')) diff --git a/lms/djangoapps/instructor_analytics/tests/test_basic.py b/lms/djangoapps/instructor_analytics/tests/test_basic.py index dc43788..e40144b 100644 --- a/lms/djangoapps/instructor_analytics/tests/test_basic.py +++ b/lms/djangoapps/instructor_analytics/tests/test_basic.py @@ -8,7 +8,6 @@ from django.core.urlresolvers import reverse from mock import patch from student.roles import CourseSalesAdminRole from student.tests.factories import UserFactory, CourseModeFactory -from opaque_keys.edx.locations import SlashSeparatedCourseKey from shoppingcart.models import ( CourseRegistrationCode, RegistrationCodeRedemption, Order, Invoice, Coupon, CourseRegCodeItem, CouponRedemption, CourseRegistrationCodeInvoiceItem @@ -33,7 +32,7 @@ class TestAnalyticsBasic(ModuleStoreTestCase): def setUp(self): super(TestAnalyticsBasic, self).setUp() - self.course_key = SlashSeparatedCourseKey('robot', 'course', 'id') + self.course_key = self.store.make_course_key('robot', 'course', 'id') self.users = tuple(UserFactory() for _ in xrange(30)) self.ces = tuple(CourseEnrollment.enroll(user, self.course_key) for user in self.users) @@ -80,7 +79,7 @@ class TestAnalyticsBasic(ModuleStoreTestCase): self.assertIn(userreport['meta.company'], ["Open edX Inc {}".format(user.id) for user in self.users]) def test_enrolled_students_features_keys_cohorted(self): - course = CourseFactory.create(course_key=self.course_key) + course = CourseFactory.create(org="test", course="course1", display_name="run1") course.cohort_config = {'cohorted': True, 'auto_cohort': True, 'auto_cohort_groups': ['cohort']} self.store.update_item(course, self.instructor.id) cohort = CohortFactory.create(name='cohort', course_id=course.id) diff --git a/lms/djangoapps/mobile_api/course_info/tests.py b/lms/djangoapps/mobile_api/course_info/tests.py index 3dfb44b..bc6dcbe 100644 --- a/lms/djangoapps/mobile_api/course_info/tests.py +++ b/lms/djangoapps/mobile_api/course_info/tests.py @@ -120,6 +120,11 @@ class TestHandouts(MobileAPITestCase, MobileAuthTestMixin, MobileEnrolledCourseA def setUp(self): super(TestHandouts, self).setUp() + # Deleting handouts fails with split modulestore because the handout has no parent. + # This needs further investigation to determine if it is a bug in the split modulestore. + # pylint: disable=protected-access + self.store = modulestore()._get_modulestore_by_type(ModuleStoreEnum.Type.mongo) + # use toy course with handouts, and make it mobile_available course_items = import_from_xml(self.store, self.user.id, settings.COMMON_TEST_DATA_ROOT, ['toy']) self.course = course_items[0] diff --git a/lms/djangoapps/mobile_api/testutils.py b/lms/djangoapps/mobile_api/testutils.py index 61e6f58..c5bc3f2 100644 --- a/lms/djangoapps/mobile_api/testutils.py +++ b/lms/djangoapps/mobile_api/testutils.py @@ -35,7 +35,7 @@ class MobileAPITestCase(ModuleStoreTestCase, APITestCase): """ def setUp(self): super(MobileAPITestCase, self).setUp() - self.course = CourseFactory.create(mobile_available=True) + self.course = CourseFactory.create(mobile_available=True, static_asset_path="needed_for_split") self.user = UserFactory.create() self.password = 'test' self.username = self.user.username