diff --git a/lms/djangoapps/courseware/tests/test_about.py b/lms/djangoapps/courseware/tests/test_about.py index de00034ce3..9491166038 100644 --- a/lms/djangoapps/courseware/tests/test_about.py +++ b/lms/djangoapps/courseware/tests/test_about.py @@ -41,29 +41,34 @@ SHIB_ERROR_STR = "The currently logged-in user account does not have permission @attr('shard_1') -class AboutTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, EventTrackingTestCase, MilestonesTestCaseMixin): +class AboutTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase, EventTrackingTestCase, MilestonesTestCaseMixin): """ Tests about xblock. """ - def setUp(self): - super(AboutTestCase, self).setUp() - self.course = CourseFactory.create() - self.about = ItemFactory.create( - category="about", parent_location=self.course.location, + + @classmethod + def setUpClass(cls): + super(AboutTestCase, cls).setUpClass() + cls.course = CourseFactory.create() + cls.course_without_about = CourseFactory.create(catalog_visibility=CATALOG_VISIBILITY_NONE) + cls.course_with_about = CourseFactory.create(catalog_visibility=CATALOG_VISIBILITY_ABOUT) + cls.purchase_course = CourseFactory.create(org='MITx', number='buyme', display_name='Course To Buy') + cls.about = ItemFactory.create( + category="about", parent_location=cls.course.location, data="OOGIE BLOOGIE", display_name="overview" ) - self.course_without_about = CourseFactory.create(catalog_visibility=CATALOG_VISIBILITY_NONE) - self.about = ItemFactory.create( - category="about", parent_location=self.course_without_about.location, + cls.about = ItemFactory.create( + category="about", parent_location=cls.course_without_about.location, data="WITHOUT ABOUT", display_name="overview" ) - self.course_with_about = CourseFactory.create(catalog_visibility=CATALOG_VISIBILITY_ABOUT) - self.about = ItemFactory.create( - category="about", parent_location=self.course_with_about.location, + cls.about = ItemFactory.create( + category="about", parent_location=cls.course_with_about.location, data="WITH ABOUT", display_name="overview" ) - self.purchase_course = CourseFactory.create(org='MITx', number='buyme', display_name='Course To Buy') + def setUp(self): + super(AboutTestCase, self).setUp() + self.course_mode = CourseMode( course_id=self.purchase_course.id, mode_slug=CourseMode.DEFAULT_MODE_SLUG, @@ -152,7 +157,7 @@ class AboutTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, EventTrackingT def test_about_page_unfulfilled_prereqs(self): pre_requisite_course = CourseFactory.create( org='edX', - course='900', + course='901', display_name='pre requisite course', ) @@ -222,21 +227,24 @@ class AboutTestCaseXML(LoginEnrollmentTestCase, ModuleStoreTestCase): @attr('shard_1') -class AboutWithCappedEnrollmentsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): +class AboutWithCappedEnrollmentsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ This test case will check the About page when a course has a capped enrollment """ + @classmethod + def setUpClass(cls): + super(AboutWithCappedEnrollmentsTestCase, cls).setUpClass() + cls.course = CourseFactory.create(metadata={"max_student_enrollments_allowed": 1}) + cls.about = ItemFactory.create( + category="about", parent_location=cls.course.location, + data="OOGIE BLOOGIE", display_name="overview" + ) + def setUp(self): """ Set up the tests """ super(AboutWithCappedEnrollmentsTestCase, self).setUp() - self.course = CourseFactory.create(metadata={"max_student_enrollments_allowed": 1}) - - self.about = ItemFactory.create( - category="about", parent_location=self.course.location, - data="OOGIE BLOOGIE", display_name="overview" - ) def test_enrollment_cap(self): """ @@ -272,20 +280,22 @@ class AboutWithCappedEnrollmentsTestCase(LoginEnrollmentTestCase, ModuleStoreTes @attr('shard_1') -class AboutWithInvitationOnly(ModuleStoreTestCase): +class AboutWithInvitationOnly(SharedModuleStoreTestCase): """ This test case will check the About page when a course is invitation only. """ - def setUp(self): - super(AboutWithInvitationOnly, self).setUp() - - self.course = CourseFactory.create(metadata={"invitation_only": True}) - - self.about = ItemFactory.create( - category="about", parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(AboutWithInvitationOnly, cls).setUpClass() + cls.course = CourseFactory.create(metadata={"invitation_only": True}) + cls.about = ItemFactory.create( + category="about", parent_location=cls.course.location, display_name="overview" ) + def setUp(self): + super(AboutWithInvitationOnly, self).setUp() + def test_invitation_only(self): """ Test for user not logged in, invitation only course. @@ -320,19 +330,22 @@ class AboutWithInvitationOnly(ModuleStoreTestCase): @attr('shard_1') @patch.dict(settings.FEATURES, {'RESTRICT_ENROLL_BY_REG_METHOD': True}) -class AboutTestCaseShibCourse(LoginEnrollmentTestCase, ModuleStoreTestCase): +class AboutTestCaseShibCourse(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ Test cases covering about page behavior for courses that use shib enrollment domain ("shib courses") """ - def setUp(self): - super(AboutTestCaseShibCourse, self).setUp() - self.course = CourseFactory.create(enrollment_domain="shib:https://idp.stanford.edu/") - - self.about = ItemFactory.create( - category="about", parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(AboutTestCaseShibCourse, cls).setUpClass() + cls.course = CourseFactory.create(enrollment_domain="shib:https://idp.stanford.edu/") + cls.about = ItemFactory.create( + category="about", parent_location=cls.course.location, data="OOGIE BLOOGIE", display_name="overview" ) + def setUp(self): + super(AboutTestCaseShibCourse, self).setUp() + def test_logged_in_shib_course(self): """ For shib courses, logged in users will see the enroll button, but get rejected once they click there @@ -366,8 +379,8 @@ class AboutWithClosedEnrollment(ModuleStoreTestCase): set but it is currently outside of that period. """ def setUp(self): - super(AboutWithClosedEnrollment, self).setUp() + self.course = CourseFactory.create(metadata={"invitation_only": False}) # Setup enrollment period to be in future @@ -385,7 +398,6 @@ class AboutWithClosedEnrollment(ModuleStoreTestCase): ) def test_closed_enrollmement(self): - url = reverse('about_course', args=[self.course.id.to_deprecated_string()]) resp = self.client.get(url) self.assertEqual(resp.status_code, 200) @@ -406,15 +418,32 @@ class AboutWithClosedEnrollment(ModuleStoreTestCase): @attr('shard_1') @patch.dict(settings.FEATURES, {'ENABLE_SHOPPING_CART': True}) @patch.dict(settings.FEATURES, {'ENABLE_PAID_COURSE_REGISTRATION': True}) -class AboutPurchaseCourseTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): +class AboutPurchaseCourseTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ This test class runs through a suite of verifications regarding purchaseable courses """ + @classmethod + def setUpClass(cls): + super(AboutPurchaseCourseTestCase, cls).setUpClass() + cls.course = CourseFactory.create(org='MITx', number='buyme', display_name='Course To Buy') + + now = datetime.datetime.now(pytz.UTC) + tomorrow = now + datetime.timedelta(days=1) + nextday = tomorrow + datetime.timedelta(days=1) + + cls.closed_course = CourseFactory.create( + org='MITx', + number='closed', + display_name='Closed Course To Buy', + enrollment_start = tomorrow, + enrollment_end = nextday + ) + def setUp(self): super(AboutPurchaseCourseTestCase, self).setUp() - self.course = CourseFactory.create(org='MITx', number='buyme', display_name='Course To Buy') self._set_ecomm(self.course) + self._set_ecomm(self.closed_course) def _set_ecomm(self, course): """ @@ -487,19 +516,12 @@ class AboutPurchaseCourseTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): window """ self.setup_user() - now = datetime.datetime.now(pytz.UTC) - tomorrow = now + datetime.timedelta(days=1) - nextday = tomorrow + datetime.timedelta(days=1) - self.course.enrollment_start = tomorrow - self.course.enrollment_end = nextday - self.course = self.update_course(self.course, self.user.id) - - url = reverse('about_course', args=[self.course.id.to_deprecated_string()]) + url = reverse('about_course', args=[self.closed_course.id.to_deprecated_string()]) resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertIn("Enrollment is Closed", resp.content) - self.assertNotIn("Add buyme to Cart ($10 USD)", resp.content) + self.assertNotIn("Add closed to Cart ($10 USD)", resp.content) # course price is visible ihe course_about page when the course # mode is set to honor and it's price is set diff --git a/lms/djangoapps/courseware/tests/test_course_info.py b/lms/djangoapps/courseware/tests/test_course_info.py index 9a600413bc..6a5547867e 100644 --- a/lms/djangoapps/courseware/tests/test_course_info.py +++ b/lms/djangoapps/courseware/tests/test_course_info.py @@ -30,18 +30,22 @@ from lms.djangoapps.ccx.tests.factories import CcxFactory @attr('shard_1') -class CourseInfoTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): +class CourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ Tests for the Course Info page """ - def setUp(self): - super(CourseInfoTestCase, self).setUp() - self.course = CourseFactory.create() - self.page = ItemFactory.create( - category="course_info", parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(CourseInfoTestCase, cls).setUpClass() + cls.course = CourseFactory.create() + cls.page = ItemFactory.create( + category="course_info", parent_location=cls.course.location, data="OOGIE BLOOGIE", display_name="updates" ) + def setUp(self): + super(CourseInfoTestCase, self).setUp() + def test_logged_in_unenrolled(self): self.setup_user() url = reverse('info', args=[self.course.id.to_deprecated_string()]) @@ -203,11 +207,15 @@ class SelfPacedCourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest Tests for the info page of self-paced courses. """ + @classmethod + def setUpClass(cls): + super(SelfPacedCourseInfoTestCase, cls).setUpClass() + cls.instructor_paced_course = CourseFactory.create(self_paced=False) + cls.self_paced_course = CourseFactory.create(self_paced=True) + def setUp(self): SelfPacedConfiguration(enabled=True).save() super(SelfPacedCourseInfoTestCase, self).setUp() - self.instructor_paced_course = CourseFactory.create(self_paced=False) - self.self_paced_course = CourseFactory.create(self_paced=True) self.setup_user() def fetch_course_info_with_queries(self, course, sql_queries, mongo_queries): diff --git a/lms/djangoapps/courseware/tests/test_course_survey.py b/lms/djangoapps/courseware/tests/test_course_survey.py index 05f2386bff..c52128af7b 100644 --- a/lms/djangoapps/courseware/tests/test_course_survey.py +++ b/lms/djangoapps/courseware/tests/test_course_survey.py @@ -13,27 +13,42 @@ from survey.models import SurveyForm, SurveyAnswer from common.test.utils import XssTestMixin from xmodule.modulestore.tests.factories import CourseFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from courseware.tests.helpers import LoginEnrollmentTestCase @attr('shard_1') -class SurveyViewsTests(LoginEnrollmentTestCase, ModuleStoreTestCase, XssTestMixin): +class SurveyViewsTests(LoginEnrollmentTestCase, SharedModuleStoreTestCase, XssTestMixin): """ All tests for the views.py file """ STUDENT_INFO = [('view@test.com', 'foo')] + @classmethod + def setUpClass(cls): + super(SurveyViewsTests, cls).setUpClass() + cls.test_survey_name = 'TestSurvey' + cls.course = CourseFactory.create( + display_name='', + course_survey_required=True, + course_survey_name=cls.test_survey_name + ) + + cls.course_with_bogus_survey = CourseFactory.create( + course_survey_required=True, + course_survey_name="DoesNotExist" + ) + + cls.course_without_survey = CourseFactory.create() + def setUp(self): """ Set up the test data used in the specific tests """ super(SurveyViewsTests, self).setUp() - self.test_survey_name = 'TestSurvey' self.test_form = '' - self.survey = SurveyForm.create(self.test_survey_name, self.test_form) self.student_answers = OrderedDict({ @@ -41,19 +56,6 @@ class SurveyViewsTests(LoginEnrollmentTestCase, ModuleStoreTestCase, XssTestMixi u'field2': u'value2', }) - self.course = CourseFactory.create( - display_name='', - course_survey_required=True, - course_survey_name=self.test_survey_name - ) - - self.course_with_bogus_survey = CourseFactory.create( - course_survey_required=True, - course_survey_name="DoesNotExist" - ) - - self.course_without_survey = CourseFactory.create() - # Create student accounts and activate them. for i in range(len(self.STUDENT_INFO)): email, password = self.STUDENT_INFO[i] diff --git a/lms/djangoapps/courseware/tests/test_credit_requirements.py b/lms/djangoapps/courseware/tests/test_credit_requirements.py index d449137d92..87fc3c2c42 100644 --- a/lms/djangoapps/courseware/tests/test_credit_requirements.py +++ b/lms/djangoapps/courseware/tests/test_credit_requirements.py @@ -11,7 +11,7 @@ from pytz import UTC from django.conf import settings from django.core.urlresolvers import reverse -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory from student.tests.factories import UserFactory, CourseEnrollmentFactory from util.date_utils import get_time_display, DEFAULT_SHORT_DATE_FORMAT @@ -23,7 +23,7 @@ from openedx.core.djangoapps.credit.models import CreditCourse @patch.dict(settings.FEATURES, {"ENABLE_CREDIT_ELIGIBILITY": True}) @ddt.ddt -class ProgressPageCreditRequirementsTest(ModuleStoreTestCase): +class ProgressPageCreditRequirementsTest(SharedModuleStoreTestCase): """ Tests for credit requirement display on the progress page. """ @@ -35,11 +35,15 @@ class ProgressPageCreditRequirementsTest(ModuleStoreTestCase): MIN_GRADE_REQ_DISPLAY = "Final Grade Credit Requirement" VERIFICATION_REQ_DISPLAY = "Midterm Exam Credit Requirement" + @classmethod + def setUpClass(cls): + super(ProgressPageCreditRequirementsTest, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): super(ProgressPageCreditRequirementsTest, self).setUp() - # Create a course and configure it as a credit course - self.course = CourseFactory.create() + # Configure course as a credit course CreditCourse.objects.create(course_key=self.course.id, enabled=True) # Configure credit requirements (passing grade and in-course reverification) diff --git a/lms/djangoapps/courseware/tests/test_field_overrides.py b/lms/djangoapps/courseware/tests/test_field_overrides.py index 24f6d61859..e0bec1b485 100644 --- a/lms/djangoapps/courseware/tests/test_field_overrides.py +++ b/lms/djangoapps/courseware/tests/test_field_overrides.py @@ -9,7 +9,7 @@ from xblock.field_data import DictFieldData from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.django_utils import ( ModuleStoreTestCase, -) + SharedModuleStoreTestCase) from ..field_overrides import ( disable_overrides, diff --git a/lms/djangoapps/courseware/tests/test_grades.py b/lms/djangoapps/courseware/tests/test_grades.py index 4b43ec2a8d..9168429c2a 100644 --- a/lms/djangoapps/courseware/tests/test_grades.py +++ b/lms/djangoapps/courseware/tests/test_grades.py @@ -28,7 +28,7 @@ from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory from student.tests.factories import UserFactory from student.models import CourseEnrollment from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase def _grade_with_errors(student, request, course, keep_raw_scores=False): @@ -46,23 +46,27 @@ def _grade_with_errors(student, request, course, keep_raw_scores=False): @attr('shard_1') -class TestGradeIteration(ModuleStoreTestCase): +class TestGradeIteration(SharedModuleStoreTestCase): """ Test iteration through student gradesets. """ COURSE_NUM = "1000" COURSE_NAME = "grading_test_course" + @classmethod + def setUpClass(cls): + super(TestGradeIteration, cls).setUpClass() + cls.course = CourseFactory.create( + display_name=cls.COURSE_NAME, + number=cls.COURSE_NUM + ) + def setUp(self): """ Create a course and a handful of users to assign grades """ super(TestGradeIteration, self).setUp() - self.course = CourseFactory.create( - display_name=self.COURSE_NAME, - number=self.COURSE_NUM - ) self.students = [ UserFactory.create(username='student1'), UserFactory.create(username='student2'), @@ -142,19 +146,24 @@ class TestGradeIteration(ModuleStoreTestCase): return students_to_gradesets, students_to_errors -class TestMaxScoresCache(ModuleStoreTestCase): +class TestMaxScoresCache(SharedModuleStoreTestCase): """ Tests for the MaxScoresCache """ + + @classmethod + def setUpClass(cls): + super(TestMaxScoresCache, cls).setUpClass() + cls.course = CourseFactory.create() + cls.problems = [] + for _ in xrange(3): + cls.problems.append( + ItemFactory.create(category='problem', parent=cls.course) + ) + def setUp(self): super(TestMaxScoresCache, self).setUp() self.student = UserFactory.create() - self.course = CourseFactory.create() - self.problems = [] - for _ in xrange(3): - self.problems.append( - ItemFactory.create(category='problem', parent=self.course) - ) CourseEnrollment.enroll(self.student, self.course.id) self.request = RequestFactory().get('/') @@ -183,16 +192,16 @@ class TestMaxScoresCache(ModuleStoreTestCase): self.assertEqual(max_scores_cache.num_cached_from_remote(), 1) -class TestFieldDataCacheScorableLocations(ModuleStoreTestCase): +class TestFieldDataCacheScorableLocations(SharedModuleStoreTestCase): """ Make sure we can filter the locations we pull back student state for via the FieldDataCache. """ - def setUp(self): - super(TestFieldDataCacheScorableLocations, self).setUp() - self.student = UserFactory.create() - self.course = CourseFactory.create() - chapter = ItemFactory.create(category='chapter', parent=self.course) + @classmethod + def setUpClass(cls): + super(TestFieldDataCacheScorableLocations, cls).setUpClass() + cls.course = CourseFactory.create() + chapter = ItemFactory.create(category='chapter', parent=cls.course) sequential = ItemFactory.create(category='sequential', parent=chapter) vertical = ItemFactory.create(category='vertical', parent=sequential) ItemFactory.create(category='video', parent=vertical) @@ -200,6 +209,10 @@ class TestFieldDataCacheScorableLocations(ModuleStoreTestCase): ItemFactory.create(category='discussion', parent=vertical) ItemFactory.create(category='problem', parent=vertical) + def setUp(self): + super(TestFieldDataCacheScorableLocations, self).setUp() + self.student = UserFactory.create() + CourseEnrollment.enroll(self.student, self.course.id) def test_field_data_cache_scorable_locations(self): @@ -334,45 +347,43 @@ class TestProgressSummary(TestCase): self.assertEqual(possible, 0) -class TestGetModuleScore(LoginEnrollmentTestCase, ModuleStoreTestCase): +class TestGetModuleScore(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ Test get_module_score """ - def setUp(self): - """ - Set up test course - """ - super(TestGetModuleScore, self).setUp() - self.course = CourseFactory.create() - self.chapter = ItemFactory.create( - parent=self.course, + @classmethod + def setUpClass(cls): + super(TestGetModuleScore, cls).setUpClass() + cls.course = CourseFactory.create() + cls.chapter = ItemFactory.create( + parent=cls.course, category="chapter", display_name="Test Chapter" ) - self.seq1 = ItemFactory.create( - parent=self.chapter, + cls.seq1 = ItemFactory.create( + parent=cls.chapter, category='sequential', display_name="Test Sequential", graded=True ) - self.seq2 = ItemFactory.create( - parent=self.chapter, + cls.seq2 = ItemFactory.create( + parent=cls.chapter, category='sequential', display_name="Test Sequential", graded=True ) - self.vert1 = ItemFactory.create( - parent=self.seq1, + cls.vert1 = ItemFactory.create( + parent=cls.seq1, category='vertical', display_name='Test Vertical 1' ) - self.vert2 = ItemFactory.create( - parent=self.seq2, + cls.vert2 = ItemFactory.create( + parent=cls.seq2, category='vertical', display_name='Test Vertical 2' ) - self.randomize = ItemFactory.create( - parent=self.vert2, + cls.randomize = ItemFactory.create( + parent=cls.vert2, category='randomize', display_name='Test Randomize' ) @@ -381,31 +392,37 @@ class TestGetModuleScore(LoginEnrollmentTestCase, ModuleStoreTestCase): choices=[False, False, True, False], choice_names=['choice_0', 'choice_1', 'choice_2', 'choice_3'] ) - self.problem1 = ItemFactory.create( - parent=self.vert1, + cls.problem1 = ItemFactory.create( + parent=cls.vert1, category="problem", display_name="Test Problem 1", data=problem_xml ) - self.problem2 = ItemFactory.create( - parent=self.vert1, + cls.problem2 = ItemFactory.create( + parent=cls.vert1, category="problem", display_name="Test Problem 2", data=problem_xml ) - self.problem3 = ItemFactory.create( - parent=self.randomize, + cls.problem3 = ItemFactory.create( + parent=cls.randomize, category="problem", display_name="Test Problem 3", data=problem_xml ) - self.problem4 = ItemFactory.create( - parent=self.randomize, + cls.problem4 = ItemFactory.create( + parent=cls.randomize, category="problem", display_name="Test Problem 4", data=problem_xml ) + def setUp(self): + """ + Set up test course + """ + super(TestGetModuleScore, self).setUp() + self.request = get_request_for_user(UserFactory()) self.client.login(username=self.request.user.username, password="test") CourseEnrollment.enroll(self.request.user, self.course.id) diff --git a/lms/djangoapps/courseware/tests/test_lti_integration.py b/lms/djangoapps/courseware/tests/test_lti_integration.py index 91d9867b85..00b03b101b 100644 --- a/lms/djangoapps/courseware/tests/test_lti_integration.py +++ b/lms/djangoapps/courseware/tests/test_lti_integration.py @@ -13,7 +13,7 @@ from django.core.urlresolvers import reverse from courseware.tests import BaseTestXmodule from courseware.views import get_course_lti_endpoints from lms.djangoapps.lms_xblock.runtime import quote_slashes -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.x_module import STUDENT_VIEW @@ -125,7 +125,7 @@ class TestLTI(BaseTestXmodule): @attr('shard_1') -class TestLTIModuleListing(ModuleStoreTestCase): +class TestLTIModuleListing(SharedModuleStoreTestCase): """ a test for the rest endpoint that lists LTI modules in a course """ @@ -133,42 +133,46 @@ class TestLTIModuleListing(ModuleStoreTestCase): COURSE_SLUG = "100" COURSE_NAME = "test_course" - def setUp(self): - """Create course, 2 chapters, 2 sections""" - super(TestLTIModuleListing, self).setUp() - self.course = CourseFactory.create(display_name=self.COURSE_NAME, number=self.COURSE_SLUG) - self.chapter1 = ItemFactory.create( - parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(TestLTIModuleListing, cls).setUpClass() + cls.course = CourseFactory.create(display_name=cls.COURSE_NAME, number=cls.COURSE_SLUG) + cls.chapter1 = ItemFactory.create( + parent_location=cls.course.location, display_name="chapter1", category='chapter') - self.section1 = ItemFactory.create( - parent_location=self.chapter1.location, + cls.section1 = ItemFactory.create( + parent_location=cls.chapter1.location, display_name="section1", category='sequential') - self.chapter2 = ItemFactory.create( - parent_location=self.course.location, + cls.chapter2 = ItemFactory.create( + parent_location=cls.course.location, display_name="chapter2", category='chapter') - self.section2 = ItemFactory.create( - parent_location=self.chapter2.location, + cls.section2 = ItemFactory.create( + parent_location=cls.chapter2.location, display_name="section2", category='sequential') # creates one draft and one published lti module, in different sections - self.lti_published = ItemFactory.create( - parent_location=self.section1.location, + cls.lti_published = ItemFactory.create( + parent_location=cls.section1.location, display_name="lti published", category="lti", - location=self.course.id.make_usage_key('lti', 'lti_published'), + location=cls.course.id.make_usage_key('lti', 'lti_published'), ) - self.lti_draft = ItemFactory.create( - parent_location=self.section2.location, + cls.lti_draft = ItemFactory.create( + parent_location=cls.section2.location, display_name="lti draft", category="lti", - location=self.course.id.make_usage_key('lti', 'lti_draft'), + location=cls.course.id.make_usage_key('lti', 'lti_draft'), publish_item=False, ) + def setUp(self): + """Create course, 2 chapters, 2 sections""" + super(TestLTIModuleListing, self).setUp() + def expected_handler_url(self, handler): """convenience method to get the reversed handler urls""" return "https://{}{}".format(settings.SITE_NAME, reverse( diff --git a/lms/djangoapps/courseware/tests/test_masquerade.py b/lms/djangoapps/courseware/tests/test_masquerade.py index 7e24283efa..539326b719 100644 --- a/lms/djangoapps/courseware/tests/test_masquerade.py +++ b/lms/djangoapps/courseware/tests/test_masquerade.py @@ -25,40 +25,36 @@ from courseware.tests.test_submitting_problems import ProblemSubmissionTestMixin from student.tests.factories import UserFactory from xblock.runtime import DictKeyValueStore from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import ItemFactory, CourseFactory from xmodule.partitions.partitions import Group, UserPartition -class MasqueradeTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): +class MasqueradeTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Base class for masquerade tests that sets up a test course and enrolls a user in the course. """ - def setUp(self): - super(MasqueradeTestCase, self).setUp() - - # By default, tests run with DISABLE_START_DATES=True. To test that masquerading as a student is - # working properly, we must use start dates and set a start date in the past (otherwise the access - # checks exist prematurely). - self.course = CourseFactory.create(number='masquerade-test', metadata={'start': datetime.now(UTC())}) - # Creates info page and puts random data in it for specific student info page test - self.info_page = ItemFactory.create( - category="course_info", parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(MasqueradeTestCase, cls).setUpClass() + cls.course = CourseFactory.create(number='masquerade-test', metadata={'start': datetime.now(UTC())}) + cls.info_page = ItemFactory.create( + category="course_info", parent_location=cls.course.location, data="OOGIE BLOOGIE", display_name="updates" ) - self.chapter = ItemFactory.create( - parent_location=self.course.location, + cls.chapter = ItemFactory.create( + parent_location=cls.course.location, category="chapter", display_name="Test Section", ) - self.sequential_display_name = "Test Masquerade Subsection" - self.sequential = ItemFactory.create( - parent_location=self.chapter.location, + cls.sequential_display_name = "Test Masquerade Subsection" + cls.sequential = ItemFactory.create( + parent_location=cls.chapter.location, category="sequential", - display_name=self.sequential_display_name, + display_name=cls.sequential_display_name, ) - self.vertical = ItemFactory.create( - parent_location=self.sequential.location, + cls.vertical = ItemFactory.create( + parent_location=cls.sequential.location, category="vertical", display_name="Test Unit", ) @@ -69,13 +65,17 @@ class MasqueradeTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): options=['Correct', 'Incorrect'], correct_option='Correct' ) - self.problem_display_name = "TestMasqueradeProblem" - self.problem = ItemFactory.create( - parent_location=self.vertical.location, + cls.problem_display_name = "TestMasqueradeProblem" + cls.problem = ItemFactory.create( + parent_location=cls.vertical.location, category='problem', data=problem_xml, - display_name=self.problem_display_name + display_name=cls.problem_display_name ) + + def setUp(self): + super(MasqueradeTestCase, self).setUp() + self.test_user = self.create_user() self.login(self.test_user.email, 'test') self.enroll(self.course, True) diff --git a/lms/djangoapps/courseware/tests/test_microsites.py b/lms/djangoapps/courseware/tests/test_microsites.py index 302d09898d..5072090c3b 100644 --- a/lms/djangoapps/courseware/tests/test_microsites.py +++ b/lms/djangoapps/courseware/tests/test_microsites.py @@ -11,51 +11,42 @@ from course_modes.models import CourseMode from xmodule.course_module import ( CATALOG_VISIBILITY_CATALOG_AND_ABOUT, CATALOG_VISIBILITY_NONE) from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase @attr('shard_1') -class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): +class TestMicrosites(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ This is testing of the Microsite feature """ STUDENT_INFO = [('view@test.com', 'foo'), ('view2@test.com', 'foo')] - def setUp(self): - super(TestMicrosites, self).setUp() - - # use a different hostname to test Microsites since they are - # triggered on subdomain mappings - # - # NOTE: The Microsite Configuration is in lms/envs/test.py. The content for the Test Microsite is in - # test_microsites/test_microsite. - # - # IMPORTANT: For these tests to work, this domain must be defined via - # DNS configuration (either local or published) - - self.course = CourseFactory.create( + @classmethod + def setUpClass(cls): + super(TestMicrosites, cls).setUpClass() + cls.course = CourseFactory.create( display_name='Robot_Super_Course', org='TestMicrositeX', emit_signals=True, ) - self.chapter0 = ItemFactory.create(parent_location=self.course.location, + cls.chapter0 = ItemFactory.create(parent_location=cls.course.location, display_name='Overview') - self.chapter9 = ItemFactory.create(parent_location=self.course.location, + cls.chapter9 = ItemFactory.create(parent_location=cls.course.location, display_name='factory_chapter') - self.section0 = ItemFactory.create(parent_location=self.chapter0.location, + cls.section0 = ItemFactory.create(parent_location=cls.chapter0.location, display_name='Welcome') - self.section9 = ItemFactory.create(parent_location=self.chapter9.location, + cls.section9 = ItemFactory.create(parent_location=cls.chapter9.location, display_name='factory_section') - self.course_outside_microsite = CourseFactory.create( + cls.course_outside_microsite = CourseFactory.create( display_name='Robot_Course_Outside_Microsite', org='FooX', emit_signals=True, ) # have a course which explicitly sets visibility in catalog to False - self.course_hidden_visibility = CourseFactory.create( + cls.course_hidden_visibility = CourseFactory.create( display_name='Hidden_course', org='TestMicrositeX', catalog_visibility=CATALOG_VISIBILITY_NONE, @@ -63,7 +54,7 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): ) # have a course which explicitly sets visibility in catalog and about to true - self.course_with_visibility = CourseFactory.create( + cls.course_with_visibility = CourseFactory.create( display_name='visible_course', org='TestMicrositeX', course="foo", @@ -71,6 +62,9 @@ class TestMicrosites(ModuleStoreTestCase, LoginEnrollmentTestCase): emit_signals=True, ) + def setUp(self): + super(TestMicrosites, self).setUp() + def setup_users(self): # Create student accounts and activate them. for i in range(len(self.STUDENT_INFO)): diff --git a/lms/djangoapps/courseware/tests/test_middleware.py b/lms/djangoapps/courseware/tests/test_middleware.py index 63adce0684..c895091808 100644 --- a/lms/djangoapps/courseware/tests/test_middleware.py +++ b/lms/djangoapps/courseware/tests/test_middleware.py @@ -10,19 +10,22 @@ from nose.plugins.attrib import attr import courseware.courses as courses from courseware.middleware import RedirectUnenrolledMiddleware -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory @attr('shard_1') -class CoursewareMiddlewareTestCase(ModuleStoreTestCase): +class CoursewareMiddlewareTestCase(SharedModuleStoreTestCase): """Tests that courseware middleware is correctly redirected""" + @classmethod + def setUpClass(cls): + super(CoursewareMiddlewareTestCase, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): super(CoursewareMiddlewareTestCase, self).setUp() - self.course = CourseFactory.create() - def check_user_not_enrolled_redirect(self): """A UserNotEnrolled exception should trigger a redirect""" request = RequestFactory().get("dummy_url") diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index 81c3a976f1..0c1224667d 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -45,7 +45,7 @@ from student.models import anonymous_id_for_user from xmodule.modulestore.tests.django_utils import ( TEST_DATA_MIXED_TOY_MODULESTORE, TEST_DATA_XML_MODULESTORE, -) + SharedModuleStoreTestCase) from xmodule.lti_module import LTIDescriptor from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.django import modulestore @@ -121,10 +121,17 @@ class GradedStatelessXBlock(XBlock): @attr('shard_1') @ddt.ddt -class ModuleRenderTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): +class ModuleRenderTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Tests of courseware.module_render """ + + @classmethod + def setUpClass(cls): + super(ModuleRenderTestCase, cls).setUpClass() + cls.course_key = ToyCourseFactory.create().id + cls.toy_course = modulestore().get_course(cls.course_key) + # TODO: this test relies on the specific setup of the toy course. # It should be rewritten to build the course it needs and then test that. def setUp(self): @@ -133,8 +140,6 @@ class ModuleRenderTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): """ super(ModuleRenderTestCase, self).setUp() - self.course_key = ToyCourseFactory.create().id - self.toy_course = modulestore().get_course(self.course_key) self.mock_user = UserFactory() self.mock_user.id = 1 self.request_factory = RequestFactory() @@ -401,17 +406,20 @@ class ModuleRenderTestCase(ModuleStoreTestCase, LoginEnrollmentTestCase): @attr('shard_1') -class TestHandleXBlockCallback(ModuleStoreTestCase, LoginEnrollmentTestCase): +class TestHandleXBlockCallback(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Test the handle_xblock_callback function """ + @classmethod + def setUpClass(cls): + super(TestHandleXBlockCallback, cls).setUpClass() + cls.course_key = ToyCourseFactory.create().id + cls.toy_course = modulestore().get_course(cls.course_key) def setUp(self): super(TestHandleXBlockCallback, self).setUp() - self.course_key = ToyCourseFactory.create().id self.location = self.course_key.make_usage_key('chapter', 'Overview') - self.toy_course = modulestore().get_course(self.course_key) self.mock_user = UserFactory.create() self.request_factory = RequestFactory() @@ -709,19 +717,24 @@ class TestTOC(ModuleStoreTestCase): @attr('shard_1') @ddt.ddt @patch.dict('django.conf.settings.FEATURES', {'ENABLE_SPECIAL_EXAMS': True}) -class TestProctoringRendering(ModuleStoreTestCase): +class TestProctoringRendering(SharedModuleStoreTestCase): + @classmethod + def setUpClass(cls): + super(TestProctoringRendering, cls).setUpClass() + cls.course_key = ToyCourseFactory.create().id + """Check the Table of Contents for a course""" def setUp(self): """ Set up the initial mongo datastores """ super(TestProctoringRendering, self).setUp() - self.course_key = ToyCourseFactory.create().id self.chapter = 'Overview' chapter_url = '%s/%s/%s' % ('/courses', self.course_key, self.chapter) factory = RequestFactory() self.request = factory.get(chapter_url) - self.request.user = UserFactory() + self.request.user = UserFactory.create() + self.user = UserFactory.create() self.modulestore = self.store._get_modulestore_for_courselike(self.course_key) # pylint: disable=protected-access with self.modulestore.bulk_operations(self.course_key): self.toy_course = self.store.get_course(self.course_key, depth=2) @@ -1028,7 +1041,15 @@ class TestProctoringRendering(ModuleStoreTestCase): @attr('shard_1') -class TestGatedSubsectionRendering(ModuleStoreTestCase, MilestonesTestCaseMixin): +class TestGatedSubsectionRendering(SharedModuleStoreTestCase, MilestonesTestCaseMixin): + @classmethod + def setUpClass(cls): + super(TestGatedSubsectionRendering, cls).setUpClass() + cls.course = CourseFactory.create() + cls.course.enable_subsection_gating = True + cls.course.save() + cls.store.update_item(cls.course, 0) + """ Test the toc for a course is rendered correctly when there is gated content """ @@ -1038,10 +1059,6 @@ class TestGatedSubsectionRendering(ModuleStoreTestCase, MilestonesTestCaseMixin) """ super(TestGatedSubsectionRendering, self).setUp() - self.course = CourseFactory.create() - self.course.enable_subsection_gating = True - self.course.save() - self.store.update_item(self.course, 0) self.chapter = ItemFactory.create( parent=self.course, category="chapter", @@ -1113,11 +1130,10 @@ class TestHtmlModifiers(ModuleStoreTestCase): """ def setUp(self): super(TestHtmlModifiers, self).setUp() - self.user = UserFactory.create() + self.course = CourseFactory.create() self.request = RequestFactory().get('/') self.request.user = self.user self.request.session = {} - self.course = CourseFactory.create() self.content_string = '

This is the content

' self.rewrite_link = 'Test rewrite' self.rewrite_bad_link = '' @@ -1447,16 +1463,20 @@ class DetachedXBlock(XBlock): @attr('shard_1') @patch.dict('django.conf.settings.FEATURES', {'DISPLAY_DEBUG_INFO_TO_STAFF': True, 'DISPLAY_HISTOGRAMS_TO_STAFF': True}) @patch('courseware.module_render.has_access', Mock(return_value=True, autospec=True)) -class TestStaffDebugInfo(ModuleStoreTestCase): +class TestStaffDebugInfo(SharedModuleStoreTestCase): """Tests to verify that Staff Debug Info panel and histograms are displayed to staff.""" + @classmethod + def setUpClass(cls): + super(TestStaffDebugInfo, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): super(TestStaffDebugInfo, self).setUp() self.user = UserFactory.create() self.request = RequestFactory().get('/') self.request.user = self.user self.request.session = {} - self.course = CourseFactory.create() problem_xml = OptionResponseXMLFactory().build_xml( question_text='The correct answer is Correct', @@ -1589,16 +1609,20 @@ PER_STUDENT_ANONYMIZED_DESCRIPTORS = set( @attr('shard_1') @ddt.ddt -class TestAnonymousStudentId(ModuleStoreTestCase, LoginEnrollmentTestCase): +class TestAnonymousStudentId(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Test that anonymous_student_id is set correctly across a variety of XBlock types """ + @classmethod + def setUpClass(cls): + super(TestAnonymousStudentId, cls).setUpClass() + cls.course_key = ToyCourseFactory.create().id + cls.course = modulestore().get_course(cls.course_key) + def setUp(self): - super(TestAnonymousStudentId, self).setUp(create_user=False) + super(TestAnonymousStudentId, self).setUp() self.user = UserFactory() - self.course_key = ToyCourseFactory.create().id - self.course = modulestore().get_course(self.course_key) @patch('courseware.module_render.has_access', Mock(return_value=True, autospec=True)) def _get_anonymous_id(self, course_id, xblock_class): @@ -1668,11 +1692,16 @@ class TestAnonymousStudentId(ModuleStoreTestCase, LoginEnrollmentTestCase): @attr('shard_1') @patch('track.views.tracker', autospec=True) -class TestModuleTrackingContext(ModuleStoreTestCase): +class TestModuleTrackingContext(SharedModuleStoreTestCase): """ Ensure correct tracking information is included in events emitted during XBlock callback handling. """ + @classmethod + def setUpClass(cls): + super(TestModuleTrackingContext, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): super(TestModuleTrackingContext, self).setUp() @@ -1926,10 +1955,16 @@ class TestEventPublishing(ModuleStoreTestCase, LoginEnrollmentTestCase): @attr('shard_1') @ddt.ddt -class LMSXBlockServiceBindingTest(ModuleStoreTestCase): +class LMSXBlockServiceBindingTest(SharedModuleStoreTestCase): """ Tests that the LMS Module System (XBlock Runtime) provides an expected set of services. """ + + @classmethod + def setUpClass(cls): + super(LMSXBlockServiceBindingTest, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): """ Set up the user and other fields that will be used to instantiate the runtime. @@ -1937,7 +1972,6 @@ class LMSXBlockServiceBindingTest(ModuleStoreTestCase): super(LMSXBlockServiceBindingTest, self).setUp() self.user = UserFactory() self.student_data = Mock() - self.course = CourseFactory.create() self.track_function = Mock() self.xqueue_callback_url_prefix = Mock() self.request_token = Mock() @@ -2012,16 +2046,21 @@ USER_NUMBERS = range(2) @attr('shard_1') @ddt.ddt -class TestFilteredChildren(ModuleStoreTestCase): +class TestFilteredChildren(SharedModuleStoreTestCase): """ Tests that verify access to XBlock/XModule children work correctly even when those children are filtered by the runtime when loaded. """ + + @classmethod + def setUpClass(cls): + super(TestFilteredChildren, cls).setUpClass() + cls.course = CourseFactory.create() + # pylint: disable=attribute-defined-outside-init, no-member def setUp(self): super(TestFilteredChildren, self).setUp() self.users = {number: UserFactory() for number in USER_NUMBERS} - self.course = CourseFactory() self._old_has_access = render.has_access patcher = patch('courseware.module_render.has_access', self._has_access) diff --git a/lms/djangoapps/courseware/tests/test_navigation.py b/lms/djangoapps/courseware/tests/test_navigation.py index d9da282c7f..2db5f51981 100644 --- a/lms/djangoapps/courseware/tests/test_navigation.py +++ b/lms/djangoapps/courseware/tests/test_navigation.py @@ -11,56 +11,60 @@ from django.test.utils import override_settings from courseware.tests.helpers import LoginEnrollmentTestCase from courseware.tests.factories import GlobalStaffFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore.django import modulestore @attr('shard_1') -class TestNavigation(ModuleStoreTestCase, LoginEnrollmentTestCase): +class TestNavigation(SharedModuleStoreTestCase, LoginEnrollmentTestCase): """ Check that navigation state is saved properly. """ STUDENT_INFO = [('view@test.com', 'foo'), ('view2@test.com', 'foo')] - def setUp(self): - super(TestNavigation, self).setUp() - self.test_course = CourseFactory.create() - self.course = CourseFactory.create() - self.chapter0 = ItemFactory.create(parent=self.course, + @classmethod + def setUpClass(cls): + super(TestNavigation, cls).setUpClass() + cls.test_course = CourseFactory.create() + cls.course = CourseFactory.create() + cls.chapter0 = ItemFactory.create(parent=cls.course, display_name='Overview') - self.chapter9 = ItemFactory.create(parent=self.course, + cls.chapter9 = ItemFactory.create(parent=cls.course, display_name='factory_chapter') - self.section0 = ItemFactory.create(parent=self.chapter0, + cls.section0 = ItemFactory.create(parent=cls.chapter0, display_name='Welcome') - self.section9 = ItemFactory.create(parent=self.chapter9, + cls.section9 = ItemFactory.create(parent=cls.chapter9, display_name='factory_section') - self.unit0 = ItemFactory.create(parent=self.section0, + cls.unit0 = ItemFactory.create(parent=cls.section0, display_name='New Unit') - self.chapterchrome = ItemFactory.create(parent=self.course, + cls.chapterchrome = ItemFactory.create(parent=cls.course, display_name='Chrome') - self.chromelesssection = ItemFactory.create(parent=self.chapterchrome, + cls.chromelesssection = ItemFactory.create(parent=cls.chapterchrome, display_name='chromeless', chrome='none') - self.accordionsection = ItemFactory.create(parent=self.chapterchrome, + cls.accordionsection = ItemFactory.create(parent=cls.chapterchrome, display_name='accordion', chrome='accordion') - self.tabssection = ItemFactory.create(parent=self.chapterchrome, + cls.tabssection = ItemFactory.create(parent=cls.chapterchrome, display_name='tabs', chrome='tabs') - self.defaultchromesection = ItemFactory.create( - parent=self.chapterchrome, + cls.defaultchromesection = ItemFactory.create( + parent=cls.chapterchrome, display_name='defaultchrome', ) - self.fullchromesection = ItemFactory.create(parent=self.chapterchrome, + cls.fullchromesection = ItemFactory.create(parent=cls.chapterchrome, display_name='fullchrome', chrome='accordion,tabs') - self.tabtest = ItemFactory.create(parent=self.chapterchrome, + cls.tabtest = ItemFactory.create(parent=cls.chapterchrome, display_name='progress_tab', default_tab='progress') + def setUp(self): + super(TestNavigation, self).setUp() + # Create student accounts and activate them. for i in range(len(self.STUDENT_INFO)): email, password = self.STUDENT_INFO[i] diff --git a/lms/djangoapps/courseware/tests/test_split_module.py b/lms/djangoapps/courseware/tests/test_split_module.py index d6002bad35..da87ba1aa4 100644 --- a/lms/djangoapps/courseware/tests/test_split_module.py +++ b/lms/djangoapps/courseware/tests/test_split_module.py @@ -9,13 +9,13 @@ from courseware.module_render import get_module_for_descriptor from courseware.model_data import FieldDataCache from student.tests.factories import UserFactory, CourseEnrollmentFactory from xmodule.modulestore.tests.factories import ItemFactory, CourseFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.partitions.partitions import Group, UserPartition from openedx.core.djangoapps.user_api.tests.factories import UserCourseTagFactory @attr('shard_1') -class SplitTestBase(ModuleStoreTestCase): +class SplitTestBase(SharedModuleStoreTestCase): """ Sets up a basic course and user for split test testing. Also provides tests of rendered HTML for two user_tag conditions, 0 and 1. @@ -27,9 +27,10 @@ class SplitTestBase(ModuleStoreTestCase): HIDDEN_CONTENT = None VISIBLE_CONTENT = None - def setUp(self): - super(SplitTestBase, self).setUp() - self.partition = UserPartition( + @classmethod + def setUpClass(cls): + super(SplitTestBase, cls).setUpClass() + cls.partition = UserPartition( 0, 'first_partition', 'First Partition', @@ -39,22 +40,25 @@ class SplitTestBase(ModuleStoreTestCase): ] ) - self.course = CourseFactory.create( - number=self.COURSE_NUMBER, - user_partitions=[self.partition] + cls.course = CourseFactory.create( + number=cls.COURSE_NUMBER, + user_partitions=[cls.partition] ) - self.chapter = ItemFactory.create( - parent_location=self.course.location, + cls.chapter = ItemFactory.create( + parent_location=cls.course.location, category="chapter", display_name="test chapter", ) - self.sequential = ItemFactory.create( - parent_location=self.chapter.location, + cls.sequential = ItemFactory.create( + parent_location=cls.chapter.location, category="sequential", display_name="Split Test Tests", ) + def setUp(self): + super(SplitTestBase, self).setUp() + self.student = UserFactory.create() CourseEnrollmentFactory.create(user=self.student, course_id=self.course.id) self.client.login(username=self.student.username, password='test') @@ -269,14 +273,14 @@ class TestSplitTestVert(SplitTestBase): @attr('shard_1') -class SplitTestPosition(ModuleStoreTestCase): +class SplitTestPosition(SharedModuleStoreTestCase): """ Check that we can change positions in a course with partitions defined """ - def setUp(self): - super(SplitTestPosition, self).setUp() - - self.partition = UserPartition( + @classmethod + def setUpClass(cls): + super(SplitTestPosition, cls).setUpClass() + cls.partition = UserPartition( 0, 'first_partition', 'First Partition', @@ -286,16 +290,19 @@ class SplitTestPosition(ModuleStoreTestCase): ] ) - self.course = CourseFactory.create( - user_partitions=[self.partition] + cls.course = CourseFactory.create( + user_partitions=[cls.partition] ) - self.chapter = ItemFactory.create( - parent_location=self.course.location, + cls.chapter = ItemFactory.create( + parent_location=cls.course.location, category="chapter", display_name="test chapter", ) + def setUp(self): + super(SplitTestPosition, self).setUp() + self.student = UserFactory.create() CourseEnrollmentFactory.create(user=self.student, course_id=self.course.id) self.client.login(username=self.student.username, password='test') diff --git a/lms/djangoapps/courseware/tests/test_submitting_problems.py b/lms/djangoapps/courseware/tests/test_submitting_problems.py index 031467a91f..7eb36effda 100644 --- a/lms/djangoapps/courseware/tests/test_submitting_problems.py +++ b/lms/djangoapps/courseware/tests/test_submitting_problems.py @@ -24,7 +24,7 @@ from courseware.tests.helpers import LoginEnrollmentTestCase from lms.djangoapps.lms_xblock.runtime import quote_slashes from student.tests.factories import UserFactory from student.models import anonymous_id_for_user -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.partitions.partitions import Group, UserPartition from openedx.core.djangoapps.credit.api import ( @@ -126,13 +126,10 @@ class TestSubmittingProblems(ModuleStoreTestCase, LoginEnrollmentTestCase, Probl COURSE_NAME = "test_course" def setUp(self): - - super(TestSubmittingProblems, self).setUp(create_user=False) - # Create course - self.course = CourseFactory.create(display_name=self.COURSE_NAME, number=self.COURSE_SLUG) - assert self.course, "Couldn't load course %r" % self.COURSE_NAME + super(TestSubmittingProblems, self).setUp() # create a test student + self.course = CourseFactory.create(display_name=self.COURSE_NAME, number=self.COURSE_SLUG) self.student = 'view@test.com' self.password = 'foo' self.create_account('u1', self.student, self.password) diff --git a/lms/djangoapps/courseware/tests/test_tabs.py b/lms/djangoapps/courseware/tests/test_tabs.py index 70c6d49858..4d8b7f8d68 100644 --- a/lms/djangoapps/courseware/tests/test_tabs.py +++ b/lms/djangoapps/courseware/tests/test_tabs.py @@ -28,21 +28,25 @@ from util.milestones_helpers import ( from milestones.tests.utils import MilestonesTestCaseMixin from xmodule import tabs as xmodule_tabs from xmodule.modulestore.tests.django_utils import ( - TEST_DATA_MIXED_TOY_MODULESTORE, TEST_DATA_MIXED_CLOSED_MODULESTORE -) + TEST_DATA_MIXED_TOY_MODULESTORE, TEST_DATA_MIXED_CLOSED_MODULESTORE, + SharedModuleStoreTestCase) from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory -class TabTestCase(ModuleStoreTestCase): +class TabTestCase(SharedModuleStoreTestCase): """Base class for Tab-related test cases.""" + @classmethod + def setUpClass(cls): + super(TabTestCase, cls).setUpClass() + + cls.course = CourseFactory.create(org='edX', course='toy', run='2012_Fall') + cls.fake_dict_tab = {'fake_key': 'fake_value'} + cls.books = None + def setUp(self): super(TabTestCase, self).setUp() - - self.course = CourseFactory.create(org='edX', course='toy', run='2012_Fall') - self.fake_dict_tab = {'fake_key': 'fake_value'} self.reverse = lambda name, args: "name/{0}/args/{1}".format(name, ",".join(str(a) for a in args)) - self.books = None def create_mock_user(self, is_authenticated=True, is_staff=True, is_enrolled=True): """ @@ -219,21 +223,25 @@ class TextbooksTestCase(TabTestCase): @attr('shard_1') -class StaticTabDateTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): +class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """Test cases for Static Tab Dates.""" MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE - def setUp(self): - super(StaticTabDateTestCase, self).setUp() - self.course = CourseFactory.create() - self.page = ItemFactory.create( - category="static_tab", parent_location=self.course.location, + @classmethod + def setUpClass(cls): + super(StaticTabDateTestCase, cls).setUpClass() + cls.course = CourseFactory.create() + cls.page = ItemFactory.create( + category="static_tab", parent_location=cls.course.location, data="OOGIE BLOOGIE", display_name="new_tab" ) - self.course.tabs.append(xmodule_tabs.CourseTab.load('static_tab', name='New Tab', url_slug='new_tab')) - self.course.save() - self.toy_course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + cls.course.tabs.append(xmodule_tabs.CourseTab.load('static_tab', name='New Tab', url_slug='new_tab')) + cls.course.save() + cls.toy_course_key = SlashSeparatedCourseKey('edX', 'toy', '2012_Fall') + + def setUp(self): + super(StaticTabDateTestCase, self).setUp() def test_logged_in(self): self.setup_user() @@ -417,16 +425,20 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi @attr('shard_1') -class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase): +class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase): """ Validate tab behavior when dealing with textbooks. """ MODULESTORE = TEST_DATA_MIXED_TOY_MODULESTORE + @classmethod + def setUpClass(cls): + super(TextBookCourseViewsTestCase, cls).setUpClass() + cls.course = CourseFactory.create() + def setUp(self): super(TextBookCourseViewsTestCase, self).setUp() - self.course = CourseFactory.create() self.set_up_books(2) self.setup_user() self.enroll(self.course)