From 9366c43a8385f758f0ae47067941f18c23854f63 Mon Sep 17 00:00:00 2001
From: "J. Cliff Dyer" <cdyer@edx.org>
Date: Wed, 2 Nov 2016 14:38:11 -0400
Subject: [PATCH] Fix issues with RequestFactory used as Request.

* Centralize creation of quick request objects.
* Isolate caches to individual tests to prevent test ordering
  dependencies.

TNL-5811
---
 lms/djangoapps/courseware/tests/helpers.py    | 15 ----------
 .../courseware/tests/test_courses.py          |  4 +--
 .../courseware/tests/test_entrance_exam.py    |  4 +--
 .../courseware/tests/test_masquerade.py       | 20 ++++++-------
 lms/djangoapps/courseware/tests/test_tabs.py  | 19 ++++++------
 lms/djangoapps/gating/tests/test_api.py       |  1 -
 lms/djangoapps/grades/tests/test_grades.py    | 13 ++++----
 lms/djangoapps/grades/tests/test_new.py       | 10 +++----
 .../instructor/tests/test_enrollment.py       | 30 ++++++++-----------
 .../instructor_task/tests/test_base.py        |  3 +-
 .../mobile_api/tests/test_milestones.py       |  4 +--
 .../tests/test_partition_scheme.py            |  8 +++--
 .../safe_sessions/tests/test_middleware.py    | 19 ++++--------
 .../user_api/preferences/tests/test_api.py    |  6 ++--
 .../core/djangolib/testing/tests/__init__.py  |  0
 .../djangolib/testing/tests/test_utils.py     | 29 ++++++++++++++++++
 openedx/core/djangolib/testing/utils.py       | 19 +++++++++++-
 17 files changed, 112 insertions(+), 92 deletions(-)
 create mode 100644 openedx/core/djangolib/testing/tests/__init__.py
 create mode 100644 openedx/core/djangolib/testing/tests/test_utils.py

diff --git a/lms/djangoapps/courseware/tests/helpers.py b/lms/djangoapps/courseware/tests/helpers.py
index ebe4828d13e..b3f94024b4d 100644
--- a/lms/djangoapps/courseware/tests/helpers.py
+++ b/lms/djangoapps/courseware/tests/helpers.py
@@ -14,21 +14,6 @@ from openedx.core.djangoapps.content.course_overviews.models import CourseOvervi
 from student.models import Registration
 
 
-def get_request_for_user(user):
-    """Create a request object for user."""
-    request = RequestFactory()
-    request.user = user
-    request.COOKIES = {}
-    request.META = {}
-    request.is_secure = lambda: True
-    request.get_host = lambda: "edx.org"
-    request.method = 'GET'
-    request.GET = {}
-    request.POST = {}
-    crum.set_current_request(request)
-    return request
-
-
 class LoginEnrollmentTestCase(TestCase):
     """
     Provides support for user creation,
diff --git a/lms/djangoapps/courseware/tests/test_courses.py b/lms/djangoapps/courseware/tests/test_courses.py
index 6acf5836e67..94c1a96c1d2 100644
--- a/lms/djangoapps/courseware/tests/test_courses.py
+++ b/lms/djangoapps/courseware/tests/test_courses.py
@@ -23,9 +23,9 @@ from courseware.courses import (
     get_course_with_access,
 )
 from courseware.module_render import get_module_for_descriptor
-from courseware.tests.helpers import get_request_for_user
 from courseware.model_data import FieldDataCache
 from lms.djangoapps.courseware.courseware_access_exception import CoursewareAccessException
+from openedx.core.djangolib.testing.utils import get_mock_request
 from openedx.core.lib.courses import course_image_url
 from student.tests.factories import UserFactory
 from xmodule.modulestore.django import _get_modulestore_branch_setting, modulestore
@@ -276,7 +276,7 @@ class CoursesRenderTest(ModuleStoreTestCase):
         course_items = import_course_from_xml(store, self.user.id, TEST_DATA_DIR, ['toy'])
         course_key = course_items[0].id
         self.course = get_course_by_id(course_key)
-        self.request = get_request_for_user(UserFactory.create())
+        self.request = get_mock_request(UserFactory.create())
 
     def test_get_course_info_section_render(self):
         # Test render works okay
diff --git a/lms/djangoapps/courseware/tests/test_entrance_exam.py b/lms/djangoapps/courseware/tests/test_entrance_exam.py
index a14bd2d58e2..b59c225b1d6 100644
--- a/lms/djangoapps/courseware/tests/test_entrance_exam.py
+++ b/lms/djangoapps/courseware/tests/test_entrance_exam.py
@@ -13,7 +13,6 @@ from courseware.module_render import toc_for_course, get_module, handle_xblock_c
 from courseware.tests.factories import UserFactory, InstructorFactory, StaffFactory
 from courseware.tests.helpers import (
     LoginEnrollmentTestCase,
-    get_request_for_user
 )
 from courseware.entrance_exams import (
     course_has_entrance_exam,
@@ -22,6 +21,7 @@ from courseware.entrance_exams import (
     user_can_skip_entrance_exam,
     user_has_passed_entrance_exam,
 )
+from openedx.core.djangolib.testing.utils import get_mock_request
 from student.models import CourseEnrollment
 from student.tests.factories import CourseEnrollmentFactory, AnonymousUserFactory
 from util.milestones_helpers import (
@@ -141,7 +141,7 @@ class EntranceExamTestCases(LoginEnrollmentTestCase, ModuleStoreTestCase, Milest
         self.course.entrance_exam_id = unicode(self.entrance_exam.scope_ids.usage_id)
 
         self.anonymous_user = AnonymousUserFactory()
-        self.request = get_request_for_user(UserFactory())
+        self.request = get_mock_request(UserFactory())
         modulestore().update_item(self.course, self.request.user.id)  # pylint: disable=no-member
 
         self.client.login(username=self.request.user.username, password="test")
diff --git a/lms/djangoapps/courseware/tests/test_masquerade.py b/lms/djangoapps/courseware/tests/test_masquerade.py
index d142e1bd625..a4ae44674b6 100644
--- a/lms/djangoapps/courseware/tests/test_masquerade.py
+++ b/lms/djangoapps/courseware/tests/test_masquerade.py
@@ -8,7 +8,7 @@ from nose.plugins.attrib import attr
 from datetime import datetime
 
 from django.core.urlresolvers import reverse
-from django.test import TestCase
+from django.test import TestCase, RequestFactory
 from django.utils.timezone import UTC
 
 from capa.tests.response_xml_factory import OptionResponseXMLFactory
@@ -20,7 +20,7 @@ from courseware.masquerade import (
     get_masquerading_group_info
 )
 from courseware.tests.factories import StaffFactory
-from courseware.tests.helpers import LoginEnrollmentTestCase, get_request_for_user
+from courseware.tests.helpers import LoginEnrollmentTestCase
 from courseware.tests.test_submitting_problems import ProblemSubmissionTestMixin
 from student.tests.factories import UserFactory
 from xblock.runtime import DictKeyValueStore
@@ -107,14 +107,13 @@ class MasqueradeTestCase(SharedModuleStoreTestCase, LoginEnrollmentTestCase):
         )
         return self.client.get(url)
 
-    def _create_mock_json_request(self, user, body, method='POST', session=None):
+    def _create_mock_json_request(self, user, data, method='POST', session=None):
         """
         Returns a mock JSON request for the specified user
         """
-        request = get_request_for_user(user)
-        request.method = method
-        request.META = {'CONTENT_TYPE': ['application/json']}
-        request.body = body
+        factory = RequestFactory()
+        request = factory.generic(method, '/', content_type='application/json', data=json.dumps(data))
+        request.user = user
         request.session = session or {}
         return request
 
@@ -408,10 +407,11 @@ class TestGetMasqueradingGroupId(StaffMasqueradeTestCase):
         # Install a masquerading group
         request = self._create_mock_json_request(
             self.test_user,
-            body='{"role": "student", "user_partition_id": 0, "group_id": 1}'
+            data={"role": "student", "user_partition_id": 0, "group_id": 1}
         )
-        handle_ajax(request, unicode(self.course.id))
-        setup_masquerade(request, self.test_user, True)
+        response = handle_ajax(request, unicode(self.course.id))
+        self.assertEquals(response.status_code, 200)
+        setup_masquerade(request, self.course.id, True)
 
         # Verify that the masquerading group is returned
         group_id, user_partition_id = get_masquerading_group_info(self.test_user, self.course.id)
diff --git a/lms/djangoapps/courseware/tests/test_tabs.py b/lms/djangoapps/courseware/tests/test_tabs.py
index e3039f08e73..ed60e003e34 100644
--- a/lms/djangoapps/courseware/tests/test_tabs.py
+++ b/lms/djangoapps/courseware/tests/test_tabs.py
@@ -12,9 +12,10 @@ from courseware.tabs import (
     get_course_tab_list, CoursewareTab, CourseInfoTab, ProgressTab,
     ExternalDiscussionCourseTab, ExternalLinkCourseTab
 )
-from courseware.tests.helpers import get_request_for_user, LoginEnrollmentTestCase
+from courseware.tests.helpers import LoginEnrollmentTestCase
 from courseware.tests.factories import InstructorFactory, StaffFactory
 from courseware.views.views import get_static_tab_contents, static_tab
+from openedx.core.djangolib.testing.utils import get_mock_request
 from student.models import CourseEnrollment
 from student.tests.factories import UserFactory
 from util.milestones_helpers import (
@@ -255,14 +256,14 @@ class StaticTabDateTestCase(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
 
     def test_invalid_course_key(self):
         self.setup_user()
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         with self.assertRaises(Http404):
             static_tab(request, course_id='edX/toy', tab_slug='new_tab')
 
     def test_get_static_tab_contents(self):
         self.setup_user()
         course = get_course_by_id(self.course.id)
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         tab = xmodule_tabs.CourseTabList.get_tab_by_slug(course.tabs, 'new_tab')
 
         # Test render works okay
@@ -379,7 +380,7 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
             'description': 'Testing Courseware Tabs'
         }
         self.user.is_staff = False
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         self.course.entrance_exam_enabled = True
         self.course.entrance_exam_id = unicode(entrance_exam.location)
         milestone = add_milestone(milestone)
@@ -419,7 +420,7 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
         # log in again as student
         self.client.logout()
         self.login(self.email, self.password)
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         course_tab_list = get_course_tab_list(request, self.course)
         self.assertEqual(len(course_tab_list), 5)
 
@@ -432,7 +433,7 @@ class EntranceExamsTabsTestCase(LoginEnrollmentTestCase, ModuleStoreTestCase, Mi
         self.client.logout()
         staff_user = StaffFactory(course_key=self.course.id)
         self.client.login(username=staff_user.username, password='test')
-        request = get_request_for_user(staff_user)
+        request = get_mock_request(staff_user)
         course_tab_list = get_course_tab_list(request, self.course)
         self.assertEqual(len(course_tab_list), 5)
 
@@ -474,7 +475,7 @@ class TextBookCourseViewsTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest
         Test that all textbooks tab links generating correctly.
         """
         type_to_reverse_name = {'textbook': 'book', 'pdftextbook': 'pdf_book', 'htmltextbook': 'html_book'}
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         course_tab_list = get_course_tab_list(request, self.course)
         num_of_textbooks_found = 0
         for tab in course_tab_list:
@@ -699,7 +700,7 @@ class CourseTabListTestCase(TabListTestCase):
         self.course.save()
 
         user = self.create_mock_user(is_authenticated=True, is_staff=False, is_enrolled=True)
-        request = get_request_for_user(user)
+        request = get_mock_request(user)
         course_tab_list = get_course_tab_list(request, self.course)
         name_list = [x.name for x in course_tab_list]
         self.assertIn('Static Tab Free', name_list)
@@ -709,7 +710,7 @@ class CourseTabListTestCase(TabListTestCase):
         self.client.logout()
         staff_user = StaffFactory(course_key=self.course.id)
         self.client.login(username=staff_user.username, password='test')
-        request = get_request_for_user(staff_user)
+        request = get_mock_request(staff_user)
         course_tab_list_staff = get_course_tab_list(request, self.course)
         name_list_staff = [x.name for x in course_tab_list_staff]
         self.assertIn('Static Tab Free', name_list_staff)
diff --git a/lms/djangoapps/gating/tests/test_api.py b/lms/djangoapps/gating/tests/test_api.py
index 3b1df7ce87d..b15930de9e3 100644
--- a/lms/djangoapps/gating/tests/test_api.py
+++ b/lms/djangoapps/gating/tests/test_api.py
@@ -91,7 +91,6 @@ class TestGetXBlockParent(GatingTestCase):
 
     def test_get_parent_with_category(self):
         """ Test test_get_parent_of_category """
-
         result = _get_xblock_parent(self.vert1, 'sequential')
         self.assertEqual(result.location, self.seq1.location)
         result = _get_xblock_parent(self.vert1, 'chapter')
diff --git a/lms/djangoapps/grades/tests/test_grades.py b/lms/djangoapps/grades/tests/test_grades.py
index 655bd6f7caa..4357f919399 100644
--- a/lms/djangoapps/grades/tests/test_grades.py
+++ b/lms/djangoapps/grades/tests/test_grades.py
@@ -11,11 +11,10 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey
 
 from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory
 from courseware.model_data import set_score
-from courseware.tests.helpers import (
-    LoginEnrollmentTestCase,
-    get_request_for_user
-)
+from courseware.tests.helpers import LoginEnrollmentTestCase
+
 from lms.djangoapps.course_blocks.api import get_course_blocks
+from openedx.core.djangolib.testing.utils import get_mock_request
 from student.tests.factories import UserFactory
 from student.models import CourseEnrollment
 from xmodule.block_metadata_utils import display_name_with_default_escaped
@@ -185,7 +184,7 @@ class TestWeightedProblems(SharedModuleStoreTestCase):
     def setUp(self):
         super(TestWeightedProblems, self).setUp()
         self.user = UserFactory()
-        self.request = get_request_for_user(self.user)
+        self.request = get_mock_request(self.user)
 
     def _verify_grades(self, raw_earned, raw_possible, weight, expected_score):
         """
@@ -287,7 +286,7 @@ class TestScoreForModule(SharedModuleStoreTestCase):
         cls.m = ItemFactory.create(parent=cls.f, category="html", display_name="m")
         cls.n = ItemFactory.create(parent=cls.g, category="problem", display_name="n")
 
-        cls.request = get_request_for_user(UserFactory())
+        cls.request = get_mock_request(UserFactory())
         CourseEnrollment.enroll(cls.request.user, cls.course.id)
 
         answer_problem(cls.course, cls.request, cls.h, score=2, max_value=5)
@@ -449,7 +448,7 @@ class TestGetModuleScore(LoginEnrollmentTestCase, SharedModuleStoreTestCase):
         """
         super(TestGetModuleScore, self).setUp()
 
-        self.request = get_request_for_user(UserFactory())
+        self.request = get_mock_request(UserFactory())
         self.client.login(username=self.request.user.username, password="test")
         CourseEnrollment.enroll(self.request.user, self.course.id)
 
diff --git a/lms/djangoapps/grades/tests/test_new.py b/lms/djangoapps/grades/tests/test_new.py
index b0829352cb0..17811ee4584 100644
--- a/lms/djangoapps/grades/tests/test_new.py
+++ b/lms/djangoapps/grades/tests/test_new.py
@@ -14,10 +14,10 @@ from mock import patch
 import pytz
 
 from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory
-from courseware.tests.helpers import get_request_for_user
 from courseware.tests.test_submitting_problems import ProblemSubmissionTestMixin
 from lms.djangoapps.course_blocks.api import get_course_blocks
 from lms.djangoapps.grades.config.tests.utils import persistent_grades_feature_flags
+from openedx.core.djangolib.testing.utils import get_mock_request
 from student.models import CourseEnrollment
 from student.tests.factories import UserFactory
 from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase
@@ -70,7 +70,7 @@ class GradeTestBase(SharedModuleStoreTestCase):
 
     def setUp(self):
         super(GradeTestBase, self).setUp()
-        self.request = get_request_for_user(UserFactory())
+        self.request = get_mock_request(UserFactory())
         self.client.login(username=self.request.user.username, password="test")
         self.course_structure = get_course_blocks(self.request.user, self.course.location)
         self.subsection_grade_factory = SubsectionGradeFactory(self.request.user, self.course, self.course_structure)
@@ -321,7 +321,7 @@ class TestMultipleProblemTypesSubsectionScores(SharedModuleStoreTestCase):
         password = u'test'
         self.student = UserFactory.create(is_staff=False, username=u'test_student', password=password)
         self.client.login(username=self.student.username, password=password)
-        self.request = get_request_for_user(self.student)
+        self.request = get_mock_request(self.student)
         self.course_structure = get_course_blocks(self.student, self.course.location)
 
     @classmethod
@@ -411,7 +411,7 @@ class TestVariedMetadata(ProblemSubmissionTestMixin, ModuleStoreTestCase):
               </optionresponse>
             </problem>
         '''
-        self.request = get_request_for_user(UserFactory())
+        self.request = get_mock_request(UserFactory())
         self.client.login(username=self.request.user.username, password="test")
         CourseEnrollment.enroll(self.request.user, self.course.id)
         course_structure = get_course_blocks(self.request.user, self.course.location)
@@ -549,7 +549,7 @@ class TestCourseGradeLogging(ProblemSubmissionTestMixin, SharedModuleStoreTestCa
             display_name="test_problem_3",
             data=problem_xml
         )
-        self.request = get_request_for_user(UserFactory())
+        self.request = get_mock_request(UserFactory())
         self.client.login(username=self.request.user.username, password="test")
         self.course_structure = get_course_blocks(self.request.user, self.course.location)
         self.subsection_grade_factory = SubsectionGradeFactory(self.request.user, self.course, self.course_structure)
diff --git a/lms/djangoapps/instructor/tests/test_enrollment.py b/lms/djangoapps/instructor/tests/test_enrollment.py
index 0b574acaca2..97b7a7f7036 100644
--- a/lms/djangoapps/instructor/tests/test_enrollment.py
+++ b/lms/djangoapps/instructor/tests/test_enrollment.py
@@ -3,31 +3,24 @@
 Unit tests for instructor.enrollment methods.
 """
 
-import json
-import mock
-from mock import patch
 from abc import ABCMeta
-from courseware.models import StudentModule
-from courseware.tests.helpers import get_request_for_user
+import json
+
 from django.conf import settings
 from django.utils.translation import get_language
 from django.utils.translation import override as override_language
+import mock
+from mock import patch
 from nose.plugins.attrib import attr
-from ccx_keys.locator import CCXLocator
-from student.tests.factories import UserFactory
-from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
+from opaque_keys.edx.locations import SlashSeparatedCourseKey
 
 from capa.tests.response_xml_factory import MultipleChoiceResponseXMLFactory
+from ccx_keys.locator import CCXLocator
+from courseware.models import StudentModule
 from grades.new.subsection_grade import SubsectionGradeFactory
 from grades.tests.utils import answer_problem
 from lms.djangoapps.ccx.tests.factories import CcxFactory
 from lms.djangoapps.course_blocks.api import get_course_blocks
-from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
-from student.models import CourseEnrollment, CourseEnrollmentAllowed
-from student.roles import CourseCcxCoachRole
-from student.tests.factories import (
-    AdminFactory
-)
 from lms.djangoapps.instructor.enrollment import (
     EmailEnrollmentState,
     enroll_email,
@@ -37,11 +30,14 @@ from lms.djangoapps.instructor.enrollment import (
     unenroll_email,
     render_message_to_string,
 )
-from opaque_keys.edx.locations import SlashSeparatedCourseKey
-
+from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, get_mock_request
+from student.models import CourseEnrollment, CourseEnrollmentAllowed
+from student.roles import CourseCcxCoachRole
+from student.tests.factories import AdminFactory, UserFactory
 from submissions import api as sub_api
 from student.models import anonymous_id_for_user
 from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase, TEST_DATA_SPLIT_MODULESTORE
+from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
 
 
 @attr(shard=1)
@@ -536,7 +532,7 @@ class TestStudentModuleGrading(SharedModuleStoreTestCase):
             display_name="Test Problem",
             data=problem_xml
         )
-        cls.request = get_request_for_user(UserFactory())
+        cls.request = get_mock_request(UserFactory())
         cls.user = cls.request.user
 
     def _get_subsection_grade_and_verify(self, all_earned, all_possible, graded_earned, graded_possible):
diff --git a/lms/djangoapps/instructor_task/tests/test_base.py b/lms/djangoapps/instructor_task/tests/test_base.py
index 716f9be8c53..c2ea743da1c 100644
--- a/lms/djangoapps/instructor_task/tests/test_base.py
+++ b/lms/djangoapps/instructor_task/tests/test_base.py
@@ -19,6 +19,7 @@ from capa.tests.response_xml_factory import OptionResponseXMLFactory
 from courseware.model_data import StudentModule
 from courseware.tests.tests import LoginEnrollmentTestCase
 from opaque_keys.edx.locations import Location, SlashSeparatedCourseKey
+from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
 from openedx.core.lib.url_utils import quote_slashes
 from student.tests.factories import CourseEnrollmentFactory, UserFactory
 from xmodule.modulestore import ModuleStoreEnum
@@ -45,7 +46,7 @@ OPTION_1 = 'Option 1'
 OPTION_2 = 'Option 2'
 
 
-class InstructorTaskTestCase(TestCase):
+class InstructorTaskTestCase(CacheIsolationTestCase):
     """
     Tests API and view methods that involve the reporting of status for background tasks.
     """
diff --git a/lms/djangoapps/mobile_api/tests/test_milestones.py b/lms/djangoapps/mobile_api/tests/test_milestones.py
index bd04664d3b4..dba2faa5c96 100644
--- a/lms/djangoapps/mobile_api/tests/test_milestones.py
+++ b/lms/djangoapps/mobile_api/tests/test_milestones.py
@@ -5,8 +5,8 @@ from django.conf import settings
 from mock import patch
 
 from courseware.access_response import MilestoneError
-from courseware.tests.helpers import get_request_for_user
 from courseware.tests.test_entrance_exam import answer_entrance_exam_problem, add_entrance_exam_milestone
+from openedx.core.djangolib.testing.utils import get_mock_request
 from util.milestones_helpers import (
     add_prerequisite_course,
     fulfill_course_milestone,
@@ -115,7 +115,7 @@ class MobileAPIMilestonesMixin(object):
 
     def _pass_entrance_exam(self):
         """ Helper function to pass the entrance exam """
-        request = get_request_for_user(self.user)
+        request = get_mock_request(self.user)
         answer_entrance_exam_problem(self.course, request, self.problem_1)
 
     def _verify_unfulfilled_milestone_response(self):
diff --git a/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py b/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py
index 949d1cf5eea..bc02328a67d 100644
--- a/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py
+++ b/openedx/core/djangoapps/course_groups/tests/test_partition_scheme.py
@@ -359,13 +359,15 @@ class TestMasqueradedGroup(StaffMasqueradeTestCase):
         }
         request = self._create_mock_json_request(
             self.test_user,
-            body=json.dumps(request_json),
+            data=request_json,
             session=self.session
         )
-        handle_ajax(request, unicode(self.course.id))
+        response = handle_ajax(request, unicode(self.course.id))
+        # pylint has issues analyzing this class (maybe due to circular imports?)
+        self.assertEquals(response.status_code, 200)  # pylint: disable=no-member
 
         # Now setup the masquerade for the test user
-        setup_masquerade(request, self.test_user, True)
+        setup_masquerade(request, self.course.id, True)
         scheme = self.user_partition.scheme
         self.assertEqual(
             scheme.get_group_for_user(self.course.id, self.test_user, self.user_partition),
diff --git a/openedx/core/djangoapps/safe_sessions/tests/test_middleware.py b/openedx/core/djangoapps/safe_sessions/tests/test_middleware.py
index cfc1a91cb11..75fdd6f1907 100644
--- a/openedx/core/djangoapps/safe_sessions/tests/test_middleware.py
+++ b/openedx/core/djangoapps/safe_sessions/tests/test_middleware.py
@@ -14,23 +14,14 @@ from django.test.utils import override_settings
 from mock import patch
 from nose.plugins.attrib import attr
 
+from openedx.core.djangolib.testing.utils import get_mock_request
+
 from student.tests.factories import UserFactory
 
 from ..middleware import SafeSessionMiddleware, SafeCookieData
 from .test_utils import TestSafeSessionsLogMixin
 
 
-def create_mock_request():
-    """
-    Creates and returns a mock request object for testing.
-    """
-    request = RequestFactory()
-    request.COOKIES = {}
-    request.META = {}
-    request.path = '/'
-    return request
-
-
 @attr(shard=2)
 class TestSafeSessionProcessRequest(TestSafeSessionsLogMixin, TestCase):
     """
@@ -39,7 +30,7 @@ class TestSafeSessionProcessRequest(TestSafeSessionsLogMixin, TestCase):
     def setUp(self):
         super(TestSafeSessionProcessRequest, self).setUp()
         self.user = UserFactory.create()
-        self.request = create_mock_request()
+        self.request = get_mock_request()
 
     def assert_response(self, safe_cookie_data=None, success=True):
         """
@@ -141,7 +132,7 @@ class TestSafeSessionProcessResponse(TestSafeSessionsLogMixin, TestCase):
     def setUp(self):
         super(TestSafeSessionProcessResponse, self).setUp()
         self.user = UserFactory.create()
-        self.request = create_mock_request()
+        self.request = get_mock_request()
         self.request.session = {}
         self.client.response = HttpResponse()
         self.client.response.cookies = SimpleCookie()
@@ -245,7 +236,7 @@ class TestSafeSessionMiddleware(TestSafeSessionsLogMixin, TestCase):
     def setUp(self):
         super(TestSafeSessionMiddleware, self).setUp()
         self.user = UserFactory.create()
-        self.request = create_mock_request()
+        self.request = get_mock_request()
         self.client.response = HttpResponse()
         self.client.response.cookies = SimpleCookie()
 
diff --git a/openedx/core/djangoapps/user_api/preferences/tests/test_api.py b/openedx/core/djangoapps/user_api/preferences/tests/test_api.py
index d02fd37ef3f..152acdaf743 100644
--- a/openedx/core/djangoapps/user_api/preferences/tests/test_api.py
+++ b/openedx/core/djangoapps/user_api/preferences/tests/test_api.py
@@ -11,10 +11,10 @@ from pytz import common_timezones, utc
 
 from django.conf import settings
 from django.contrib.auth.models import User
-from django.test import TestCase
 from django.test.utils import override_settings
 from dateutil.parser import parse as parse_datetime
 
+from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
 from openedx.core.lib.time_zone_utils import get_display_time_zone
 from student.tests.factories import UserFactory
 
@@ -43,7 +43,7 @@ from ...preferences.api import (
 
 @attr(shard=2)
 @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Account APIs are only supported in LMS')
-class TestPreferenceAPI(TestCase):
+class TestPreferenceAPI(CacheIsolationTestCase):
     """
     These tests specifically cover the parts of the API methods that are not covered by test_views.py.
     This includes the specific types of error raised, and default behavior when optional arguments
@@ -441,7 +441,7 @@ class UpdateEmailOptInTests(ModuleStoreTestCase):
 
 
 @ddt.ddt
-class CountryTimeZoneTest(TestCase):
+class CountryTimeZoneTest(CacheIsolationTestCase):
     """
     Test cases to validate country code api functionality
     """
diff --git a/openedx/core/djangolib/testing/tests/__init__.py b/openedx/core/djangolib/testing/tests/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/openedx/core/djangolib/testing/tests/test_utils.py b/openedx/core/djangolib/testing/tests/test_utils.py
new file mode 100644
index 00000000000..42f6f07a6c3
--- /dev/null
+++ b/openedx/core/djangolib/testing/tests/test_utils.py
@@ -0,0 +1,29 @@
+"""
+Test that testing utils do what they say.
+"""
+from django.contrib.auth import get_user_model
+from django.contrib.auth.models import AnonymousUser
+from django.http.request import HttpRequest
+from django.test import TestCase
+
+from ..utils import get_mock_request
+
+USER_MODEL = get_user_model()
+
+
+class TestGetMockRequest(TestCase):
+    """
+    Validate the behavior of get_mock_request
+    """
+    def test_mock_request_is_request(self):
+        request = get_mock_request(USER_MODEL())
+        self.assertIsInstance(request, HttpRequest)
+
+    def test_user_is_attached_to_mock_request(self):
+        user = USER_MODEL()
+        request = get_mock_request(user)
+        self.assertIs(request.user, user)
+
+    def test_mock_request_without_user(self):
+        request = get_mock_request()
+        self.assertIsInstance(request.user, AnonymousUser)
diff --git a/openedx/core/djangolib/testing/utils.py b/openedx/core/djangolib/testing/utils.py
index 512beec7d9a..8218be239f0 100644
--- a/openedx/core/djangolib/testing/utils.py
+++ b/openedx/core/djangolib/testing/utils.py
@@ -10,9 +10,11 @@ Utility classes for testing django applications.
 
 import copy
 
+import crum
 from django import db
+from django.contrib.auth.models import AnonymousUser
 from django.core.cache import caches
-from django.test import TestCase, override_settings
+from django.test import RequestFactory, TestCase, override_settings
 from django.conf import settings
 from django.contrib import sites
 
@@ -158,3 +160,18 @@ class NoseDatabaseIsolation(Plugin):
         """
         for db_ in db.connections.all():
             db_.close()
+
+
+def get_mock_request(user=None):
+    """
+    Create a request object for the user, if specified.
+    """
+    request = RequestFactory().get('/')
+    if user is not None:
+        request.user = user
+    else:
+        request.user = AnonymousUser()
+    request.is_secure = lambda: True
+    request.get_host = lambda: "edx.org"
+    crum.set_current_request(request)
+    return request
-- 
GitLab