Commit d96de424 by jsa

Merge branch 'release'

parents ec5a2a1d 86515df7
...@@ -2,15 +2,16 @@ ...@@ -2,15 +2,16 @@
Tests course_creators.views.py. Tests course_creators.views.py.
""" """
from django.test import TestCase
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.test import TestCase, RequestFactory
from course_creators.views import add_user_with_status_unrequested, add_user_with_status_granted from course_creators.views import add_user_with_status_unrequested, add_user_with_status_granted
from course_creators.views import get_course_creator_status, update_course_creator_group, user_requested_access from course_creators.views import get_course_creator_status, update_course_creator_group, user_requested_access
import mock import mock
from student.roles import CourseCreatorRole from student.roles import CourseCreatorRole
from student import auth from student import auth
from edxmako.tests import mako_middleware_process_request
class CourseCreatorView(TestCase): class CourseCreatorView(TestCase):
...@@ -70,6 +71,11 @@ class CourseCreatorView(TestCase): ...@@ -70,6 +71,11 @@ class CourseCreatorView(TestCase):
def test_user_requested_access(self): def test_user_requested_access(self):
add_user_with_status_unrequested(self.user) add_user_with_status_unrequested(self.user)
self.assertEqual('unrequested', get_course_creator_status(self.user)) self.assertEqual('unrequested', get_course_creator_status(self.user))
request = RequestFactory().get('/')
request.user = self.user
mako_middleware_process_request(request)
user_requested_access(self.user) user_requested_access(self.user)
self.assertEqual('pending', get_course_creator_status(self.user)) self.assertEqual('pending', get_course_creator_status(self.user))
......
...@@ -12,15 +12,20 @@ ...@@ -12,15 +12,20 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import threading
from django.template import RequestContext from django.template import RequestContext
from util.request import safe_get_host from util.request import safe_get_host
requestcontext = None
REQUEST_CONTEXT = threading.local()
class MakoMiddleware(object): class MakoMiddleware(object):
def process_request(self, request): def process_request(self, request):
global requestcontext REQUEST_CONTEXT.context = RequestContext(request)
requestcontext = RequestContext(request) REQUEST_CONTEXT.context['is_secure'] = request.is_secure()
requestcontext['is_secure'] = request.is_secure() REQUEST_CONTEXT.context['site'] = safe_get_host(request)
requestcontext['site'] = safe_get_host(request)
def process_response(self, request, response):
REQUEST_CONTEXT.context = None
return response
...@@ -92,8 +92,8 @@ def render_to_string(template_name, dictionary, context=None, namespace='main'): ...@@ -92,8 +92,8 @@ def render_to_string(template_name, dictionary, context=None, namespace='main'):
context_instance['marketing_link'] = marketing_link context_instance['marketing_link'] = marketing_link
# In various testing contexts, there might not be a current request context. # In various testing contexts, there might not be a current request context.
if edxmako.middleware.requestcontext is not None: if edxmako.middleware.REQUEST_CONTEXT.context is not None:
for d in edxmako.middleware.requestcontext: for d in edxmako.middleware.REQUEST_CONTEXT.context:
context_dictionary.update(d) context_dictionary.update(d)
for d in context_instance: for d in context_instance:
context_dictionary.update(d) context_dictionary.update(d)
......
...@@ -48,8 +48,8 @@ class Template(MakoTemplate): ...@@ -48,8 +48,8 @@ class Template(MakoTemplate):
context_dictionary = {} context_dictionary = {}
# In various testing contexts, there might not be a current request context. # In various testing contexts, there might not be a current request context.
if edxmako.middleware.requestcontext is not None: if edxmako.middleware.REQUEST_CONTEXT.context is not None:
for d in edxmako.middleware.requestcontext: for d in edxmako.middleware.REQUEST_CONTEXT.context:
context_dictionary.update(d) context_dictionary.update(d)
for d in context_instance: for d in context_instance:
context_dictionary.update(d) context_dictionary.update(d)
......
from mock import patch, Mock
from django.http import HttpResponse
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.test.client import RequestFactory
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
import edxmako.middleware
from edxmako import add_lookup, LOOKUP from edxmako import add_lookup, LOOKUP
from edxmako.shortcuts import marketing_link from edxmako.shortcuts import marketing_link
from mock import patch from student.tests.factories import UserFactory
from util.testing import UrlResetMixin from util.testing import UrlResetMixin
...@@ -37,3 +42,40 @@ class AddLookupTests(TestCase): ...@@ -37,3 +42,40 @@ class AddLookupTests(TestCase):
dirs = LOOKUP['test'].directories dirs = LOOKUP['test'].directories
self.assertEqual(len(dirs), 1) self.assertEqual(len(dirs), 1)
self.assertTrue(dirs[0].endswith('management')) self.assertTrue(dirs[0].endswith('management'))
class MakoMiddlewareTest(TestCase):
"""
Test MakoMiddleware.
"""
def setUp(self):
self.middleware = edxmako.middleware.MakoMiddleware()
self.user = UserFactory.create()
self.url = "/"
self.request = RequestFactory().get(self.url)
self.request.user = self.user
self.response = Mock(spec=HttpResponse)
def test_clear_request_context_variable(self):
"""
Test the global variable requestcontext is cleared correctly
when response middleware is called.
"""
self.middleware.process_request(self.request)
# requestcontext should not be None.
self.assertIsNotNone(edxmako.middleware.REQUEST_CONTEXT.context)
self.middleware.process_response(self.request, self.response)
# requestcontext should be None.
self.assertIsNone(edxmako.middleware.REQUEST_CONTEXT.context)
def mako_middleware_process_request(request):
"""
Initialize the global RequestContext variable
edxmako.middleware.requestcontext using the request object.
"""
mako_middleware = edxmako.middleware.MakoMiddleware()
mako_middleware.process_request(request)
...@@ -27,6 +27,7 @@ from external_auth.views import shib_login, course_specific_login, course_specif ...@@ -27,6 +27,7 @@ from external_auth.views import shib_login, course_specific_login, course_specif
from student.views import create_account, change_enrollment from student.views import create_account, change_enrollment
from student.models import UserProfile, Registration, CourseEnrollment from student.models import UserProfile, Registration, CourseEnrollment
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from edxmako.tests import mako_middleware_process_request
TEST_DATA_MIXED_MODULESTORE = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {}) TEST_DATA_MIXED_MODULESTORE = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {})
...@@ -91,6 +92,9 @@ class ShibSPTest(ModuleStoreTestCase): ...@@ -91,6 +92,9 @@ class ShibSPTest(ModuleStoreTestCase):
""" """
no_remote_user_request = self.request_factory.get('/shib-login') no_remote_user_request = self.request_factory.get('/shib-login')
no_remote_user_request.META.update({'Shib-Identity-Provider': IDP}) no_remote_user_request.META.update({'Shib-Identity-Provider': IDP})
no_remote_user_request.user = AnonymousUser()
mako_middleware_process_request(no_remote_user_request)
no_remote_user_response = shib_login(no_remote_user_request) no_remote_user_response = shib_login(no_remote_user_request)
self.assertEqual(no_remote_user_response.status_code, 403) self.assertEqual(no_remote_user_response.status_code, 403)
self.assertIn("identity server did not return your ID information", no_remote_user_response.content) self.assertIn("identity server did not return your ID information", no_remote_user_response.content)
...@@ -155,6 +159,8 @@ class ShibSPTest(ModuleStoreTestCase): ...@@ -155,6 +159,8 @@ class ShibSPTest(ModuleStoreTestCase):
'REMOTE_USER': remote_user, 'REMOTE_USER': remote_user,
'mail': remote_user}) 'mail': remote_user})
request.user = AnonymousUser() request.user = AnonymousUser()
mako_middleware_process_request(request)
with patch('external_auth.views.AUDIT_LOG') as mock_audit_log: with patch('external_auth.views.AUDIT_LOG') as mock_audit_log:
response = shib_login(request) response = shib_login(request)
audit_log_calls = mock_audit_log.method_calls audit_log_calls = mock_audit_log.method_calls
...@@ -315,6 +321,8 @@ class ShibSPTest(ModuleStoreTestCase): ...@@ -315,6 +321,8 @@ class ShibSPTest(ModuleStoreTestCase):
request2 = self.request_factory.post('/create_account', data=postvars) request2 = self.request_factory.post('/create_account', data=postvars)
request2.session = client.session request2.session = client.session
request2.user = AnonymousUser() request2.user = AnonymousUser()
mako_middleware_process_request(request2)
with patch('student.views.AUDIT_LOG') as mock_audit_log: with patch('student.views.AUDIT_LOG') as mock_audit_log:
_response2 = create_account(request2) _response2 = create_account(request2)
......
import json import json
import django.db import django.db
import unittest import unittest
...@@ -12,6 +13,7 @@ from mock import Mock, patch ...@@ -12,6 +13,7 @@ from mock import Mock, patch
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse
from django.conf import settings from django.conf import settings
from edxmako.shortcuts import render_to_string from edxmako.shortcuts import render_to_string
from edxmako.tests import mako_middleware_process_request
from util.request import safe_get_host from util.request import safe_get_host
from textwrap import dedent from textwrap import dedent
...@@ -93,9 +95,11 @@ class ReactivationEmailTests(EmailTestMixin, TestCase): ...@@ -93,9 +95,11 @@ class ReactivationEmailTests(EmailTestMixin, TestCase):
# Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check # Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check
request = RequestFactory().post('unused_url') request = RequestFactory().post('unused_url')
request.user = self.user
request.META['HTTP_HOST'] = "aGenericValidHostName" request.META['HTTP_HOST'] = "aGenericValidHostName"
self.append_allowed_hosts("aGenericValidHostName") self.append_allowed_hosts("aGenericValidHostName")
mako_middleware_process_request(request)
body = render_to_string('emails/activation_email.txt', context) body = render_to_string('emails/activation_email.txt', context)
host = safe_get_host(request) host = safe_get_host(request)
...@@ -248,9 +252,11 @@ class EmailChangeConfirmationTests(EmailTestMixin, TransactionTestCase): ...@@ -248,9 +252,11 @@ class EmailChangeConfirmationTests(EmailTestMixin, TransactionTestCase):
# Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check # Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check
request = RequestFactory().post('unused_url') request = RequestFactory().post('unused_url')
request.user = self.user
request.META['HTTP_HOST'] = "aGenericValidHostName" request.META['HTTP_HOST'] = "aGenericValidHostName"
self.append_allowed_hosts("aGenericValidHostName") self.append_allowed_hosts("aGenericValidHostName")
mako_middleware_process_request(request)
body = render_to_string('emails/confirm_email_change.txt', context) body = render_to_string('emails/confirm_email_change.txt', context)
url = safe_get_host(request) url = safe_get_host(request)
......
...@@ -6,12 +6,14 @@ import json ...@@ -6,12 +6,14 @@ import json
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.models import AnonymousUser
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.test.utils import override_settings from django.test.utils import override_settings
from django.conf import settings from django.conf import settings
from mock import patch from mock import patch
from student.views import create_account from edxmako.tests import mako_middleware_process_request
from external_auth.models import ExternalAuthMap from external_auth.models import ExternalAuthMap
from student.views import create_account
@patch.dict("django.conf.settings.FEATURES", {'ENFORCE_PASSWORD_POLICY': True}) @patch.dict("django.conf.settings.FEATURES", {'ENFORCE_PASSWORD_POLICY': True})
class TestPasswordPolicy(TestCase): class TestPasswordPolicy(TestCase):
...@@ -255,6 +257,9 @@ class TestPasswordPolicy(TestCase): ...@@ -255,6 +257,9 @@ class TestPasswordPolicy(TestCase):
internal_password=self.url_params['password'], internal_password=self.url_params['password'],
external_domain='shib:https://idp.stanford.edu/') external_domain='shib:https://idp.stanford.edu/')
request.session['ExternalAuthMap'] = extauth request.session['ExternalAuthMap'] = extauth
request.user = AnonymousUser()
mako_middleware_process_request(request)
response = create_account(request) response = create_account(request)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
obj = json.loads(response.content) obj = json.loads(response.content)
......
...@@ -13,6 +13,7 @@ from django.contrib.messages.storage import fallback ...@@ -13,6 +13,7 @@ from django.contrib.messages.storage import fallback
from django.contrib.sessions.backends import cache from django.contrib.sessions.backends import cache
from django.test import utils as django_utils from django.test import utils as django_utils
from django.conf import settings as django_settings from django.conf import settings as django_settings
from edxmako.tests import mako_middleware_process_request
from social import actions, exceptions from social import actions, exceptions
from social.apps.django_app import utils as social_utils from social.apps.django_app import utils as social_utils
from social.apps.django_app import views as social_views from social.apps.django_app import views as social_views
...@@ -420,6 +421,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -420,6 +421,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get( self.client.get(
pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request) student_views.signin_user(strategy.request)
student_views.login_user(strategy.request) student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
...@@ -453,6 +456,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -453,6 +456,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get( self.client.get(
pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request) student_views.signin_user(strategy.request)
student_views.login_user(strategy.request) student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access
...@@ -508,6 +513,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -508,6 +513,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get('/login') self.client.get('/login')
self.client.get(pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) self.client.get(pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request) student_views.signin_user(strategy.request)
student_views.login_user(strategy.request) student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access
...@@ -547,6 +554,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -547,6 +554,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
# pylint: disable-msg=protected-access # pylint: disable-msg=protected-access
self.assert_redirect_to_login_looks_correct(actions.do_complete(strategy, social_views._do_login)) self.assert_redirect_to_login_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
# At this point we know the pipeline has resumed correctly. Next we # At this point we know the pipeline has resumed correctly. Next we
# fire off the view that displays the login form and posts it via JS. # fire off the view that displays the login form and posts it via JS.
self.assert_login_response_in_pipeline_looks_correct(student_views.signin_user(strategy.request)) self.assert_login_response_in_pipeline_looks_correct(student_views.signin_user(strategy.request))
...@@ -568,6 +576,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -568,6 +576,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
user.is_active = False user.is_active = False
user.save() user.save()
mako_middleware_process_request(strategy.request)
self.assert_json_failure_response_is_inactive_account(student_views.login_user(strategy.request)) self.assert_json_failure_response_is_inactive_account(student_views.login_user(strategy.request))
def test_signin_fails_if_no_account_associated(self): def test_signin_fails_if_no_account_associated(self):
...@@ -613,6 +622,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -613,6 +622,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
# pylint:disable-msg=protected-access # pylint:disable-msg=protected-access
self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login)) self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
# At this point we know the pipeline has resumed correctly. Next we # At this point we know the pipeline has resumed correctly. Next we
# fire off the view that displays the registration form. # fire off the view that displays the registration form.
self.assert_register_response_in_pipeline_looks_correct( self.assert_register_response_in_pipeline_looks_correct(
...@@ -672,6 +682,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase): ...@@ -672,6 +682,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy))
# pylint:disable-msg=protected-access # pylint:disable-msg=protected-access
self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login)) self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
self.assert_register_response_in_pipeline_looks_correct( self.assert_register_response_in_pipeline_looks_correct(
student_views.register_user(strategy.request), pipeline.get(request)['kwargs']) student_views.register_user(strategy.request), pipeline.get(request)['kwargs'])
strategy.request.POST = self.get_registration_post_vars() strategy.request.POST = self.get_registration_post_vars()
......
...@@ -15,6 +15,7 @@ from xmodule.modulestore.tests.factories import CourseFactory ...@@ -15,6 +15,7 @@ from xmodule.modulestore.tests.factories import CourseFactory
from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
import student.views import student.views
from branding.views import index from branding.views import index
from edxmako.tests import mako_middleware_process_request
FEATURES_WITH_STARTDATE = settings.FEATURES.copy() FEATURES_WITH_STARTDATE = settings.FEATURES.copy()
FEATURES_WITH_STARTDATE['DISABLE_START_DATES'] = False FEATURES_WITH_STARTDATE['DISABLE_START_DATES'] = False
...@@ -45,6 +46,8 @@ class AnonymousIndexPageTest(ModuleStoreTestCase): ...@@ -45,6 +46,8 @@ class AnonymousIndexPageTest(ModuleStoreTestCase):
""" """
request = self.factory.get('/') request = self.factory.get('/')
request.user = AnonymousUser() request.user = AnonymousUser()
mako_middleware_process_request(request)
student.views.index(request) student.views.index(request)
@override_settings(FEATURES=FEATURES_WITH_STARTDATE) @override_settings(FEATURES=FEATURES_WITH_STARTDATE)
......
...@@ -20,6 +20,7 @@ from django.core.urlresolvers import reverse ...@@ -20,6 +20,7 @@ from django.core.urlresolvers import reverse
from student.models import CourseEnrollment from student.models import CourseEnrollment
from student.tests.factories import AdminFactory from student.tests.factories import AdminFactory
from edxmako.middleware import MakoMiddleware from edxmako.middleware import MakoMiddleware
from edxmako.tests import mako_middleware_process_request
from opaque_keys.edx.locations import Location from opaque_keys.edx.locations import Location
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
...@@ -413,6 +414,8 @@ class TestProgressDueDate(BaseDueDateTests): ...@@ -413,6 +414,8 @@ class TestProgressDueDate(BaseDueDateTests):
def get_text(self, course): def get_text(self, course):
""" Returns the HTML for the progress page """ """ Returns the HTML for the progress page """
mako_middleware_process_request(self.request)
return views.progress(self.request, course.id.to_deprecated_string(), self.user.id).content return views.progress(self.request, course.id.to_deprecated_string(), self.user.id).content
......
...@@ -4,6 +4,7 @@ from django.test.utils import override_settings ...@@ -4,6 +4,7 @@ from django.test.utils import override_settings
from django.test.client import Client, RequestFactory from django.test.client import Client, RequestFactory
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory, CourseEnrollmentFactory from student.tests.factories import UserFactory, CourseEnrollmentFactory
from edxmako.tests import mako_middleware_process_request
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from util.testing import UrlResetMixin from util.testing import UrlResetMixin
...@@ -276,6 +277,8 @@ class UserProfileTestCase(ModuleStoreTestCase): ...@@ -276,6 +277,8 @@ class UserProfileTestCase(ModuleStoreTestCase):
mock_request.side_effect = make_mock_request_impl(self.TEST_THREAD_TEXT, self.TEST_THREAD_ID) mock_request.side_effect = make_mock_request_impl(self.TEST_THREAD_TEXT, self.TEST_THREAD_ID)
request = RequestFactory().get("dummy_url", data=params, **headers) request = RequestFactory().get("dummy_url", data=params, **headers)
request.user = self.student request.user = self.student
mako_middleware_process_request(request)
response = views.user_profile( response = views.user_profile(
request, request,
self.course.id.to_deprecated_string(), self.course.id.to_deprecated_string(),
......
...@@ -9,6 +9,7 @@ from markupsafe import escape ...@@ -9,6 +9,7 @@ from markupsafe import escape
from courseware.tests.tests import TEST_DATA_MIXED_MODULESTORE from courseware.tests.tests import TEST_DATA_MIXED_MODULESTORE
from student.tests.factories import UserFactory, CourseEnrollmentFactory from student.tests.factories import UserFactory, CourseEnrollmentFactory
from edxmako.tests import mako_middleware_process_request
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
...@@ -48,6 +49,8 @@ class TestXss(ModuleStoreTestCase): ...@@ -48,6 +49,8 @@ class TestXss(ModuleStoreTestCase):
) )
req.user = self._instructor req.user = self._instructor
req.session = {} req.session = {}
mako_middleware_process_request(req)
resp = legacy.instructor_dashboard(req, self._course.id.to_deprecated_string()) resp = legacy.instructor_dashboard(req, self._course.id.to_deprecated_string())
respUnicode = resp.content.decode(settings.DEFAULT_CHARSET) respUnicode = resp.content.decode(settings.DEFAULT_CHARSET)
self.assertNotIn(self._evil_student.profile.name, respUnicode) self.assertNotIn(self._evil_student.profile.name, respUnicode)
......
...@@ -11,6 +11,7 @@ from mock import Mock, patch ...@@ -11,6 +11,7 @@ from mock import Mock, patch
from notification_prefs import NOTIFICATION_PREF_KEY from notification_prefs import NOTIFICATION_PREF_KEY
from notification_prefs.views import ajax_enable, ajax_disable, ajax_status, set_subscription, UsernameCipher from notification_prefs.views import ajax_enable, ajax_disable, ajax_status, set_subscription, UsernameCipher
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from edxmako.tests import mako_middleware_process_request
from user_api.models import UserPreference from user_api.models import UserPreference
from util.testing import UrlResetMixin from util.testing import UrlResetMixin
...@@ -220,6 +221,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase): ...@@ -220,6 +221,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
def test_user(user): def test_user(user):
request = self.request_factory.get("dummy") request = self.request_factory.get("dummy")
request.user = AnonymousUser() request.user = AnonymousUser()
mako_middleware_process_request(request)
response = set_subscription(request, self.tokens[user], subscribe=False) response = set_subscription(request, self.tokens[user], subscribe=False)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertNotPrefExists(user) self.assertNotPrefExists(user)
...@@ -231,6 +234,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase): ...@@ -231,6 +234,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
self.create_prefs() self.create_prefs()
request = self.request_factory.get("dummy") request = self.request_factory.get("dummy")
request.user = AnonymousUser() request.user = AnonymousUser()
mako_middleware_process_request(request)
set_subscription(request, self.tokens[self.user], False) set_subscription(request, self.tokens[self.user], False)
response = set_subscription(request, self.tokens[self.user], subscribe=False) response = set_subscription(request, self.tokens[self.user], subscribe=False)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
...@@ -242,6 +247,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase): ...@@ -242,6 +247,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
self.assertFalse(UserPreference.objects.filter(user=user, key=NOTIFICATION_PREF_KEY)) self.assertFalse(UserPreference.objects.filter(user=user, key=NOTIFICATION_PREF_KEY))
request = self.request_factory.get("dummy") request = self.request_factory.get("dummy")
request.user = AnonymousUser() request.user = AnonymousUser()
mako_middleware_process_request(request)
response = set_subscription(request, self.tokens[user], subscribe=True) response = set_subscription(request, self.tokens[user], subscribe=True)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertPrefValid(user) self.assertPrefValid(user)
......
...@@ -3,6 +3,7 @@ Tests for open ended grading interfaces ...@@ -3,6 +3,7 @@ Tests for open ended grading interfaces
./manage.py lms --settings test test lms/djangoapps/open_ended_grading ./manage.py lms --settings test test lms/djangoapps/open_ended_grading
""" """
from django.test import RequestFactory
import json import json
import logging import logging
...@@ -29,6 +30,7 @@ from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE ...@@ -29,6 +30,7 @@ from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE
from lms.lib.xblock.runtime import LmsModuleSystem from lms.lib.xblock.runtime import LmsModuleSystem
from student.roles import CourseStaffRole from student.roles import CourseStaffRole
from edxmako.shortcuts import render_to_string from edxmako.shortcuts import render_to_string
from edxmako.tests import mako_middleware_process_request
from student.models import unique_id_for_user from student.models import unique_id_for_user
from open_ended_grading import staff_grading_service, views, utils from open_ended_grading import staff_grading_service, views, utils
...@@ -471,7 +473,12 @@ class TestPanel(ModuleStoreTestCase): ...@@ -471,7 +473,12 @@ class TestPanel(ModuleStoreTestCase):
Ensure that the problem list from the grading controller server can be rendered properly locally Ensure that the problem list from the grading controller server can be rendered properly locally
@return: @return:
""" """
request = Mock(user=self.user) request = RequestFactory().get(
reverse("open_ended_problems", kwargs={'course_id': self.course_key})
)
request.user = self.user
mako_middleware_process_request(request)
response = views.student_problem_list(request, self.course.id.to_deprecated_string()) response = views.student_problem_list(request, self.course.id.to_deprecated_string())
self.assertRegexpMatches(response.content, "Here is a list of open ended problems for this course.") self.assertRegexpMatches(response.content, "Here is a list of open ended problems for this course.")
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
<th class="c_code">${_("Code")}</th> <th class="c_code">${_("Code")}</th>
<th class="c_dsc">${_("Description")}</th> <th class="c_dsc">${_("Description")}</th>
<th class="c_course_id">${_("Course_id")}</th> <th class="c_course_id">${_("Course_id")}</th>
<th class="c_discount">${_("Discount(%)")}</th> <th class="c_discount">${_("Discount (%)")}</th>
<th class="c_count">${_("Count")}</th> <th class="c_count">${_("Count")}</th>
<th class="c_action">${_("Actions")}</th> <th class="c_action">${_("Actions")}</th>
</tr> </tr>
...@@ -120,7 +120,7 @@ ...@@ -120,7 +120,7 @@
</div> </div>
<script> <script>
$(function () { $(function () {
var icons = { var icons = {
header: "ui-icon-circle-arrow-e", header: "ui-icon-circle-arrow-e",
activeHeader: "ui-icon-circle-arrow-s" activeHeader: "ui-icon-circle-arrow-s"
...@@ -140,7 +140,7 @@ ...@@ -140,7 +140,7 @@
active:isNaN(parseInt($.cookie('saved_index'))) ? 0 : parseInt($.cookie('saved_index')), active:isNaN(parseInt($.cookie('saved_index'))) ? 0 : parseInt($.cookie('saved_index')),
collapsible: true collapsible: true
}); });
$('a[rel*=leanModal]').leanModal(); $('a[rel*=leanModal]').leanModal();
$.each($("a.edit-right"), function () { $.each($("a.edit-right"), function () {
if ($(this).parent().parent('tr').hasClass('inactive_coupon')) { if ($(this).parent().parent('tr').hasClass('inactive_coupon')) {
...@@ -211,7 +211,7 @@ ...@@ -211,7 +211,7 @@
// Get the Code and Discount value and trim it // Get the Code and Discount value and trim it
var code = $.trim($('#edit_coupon_code').val()); var code = $.trim($('#edit_coupon_code').val());
var coupon_discount = $.trim($('#edit_coupon_discount').val()); var coupon_discount = $.trim($('#edit_coupon_discount').val());
// Check if empty of not // Check if empty of not
if (code === '') { if (code === '') {
$('#edit_coupon_form #coupon_form_error').attr('style', 'display: block !important'); $('#edit_coupon_form #coupon_form_error').attr('style', 'display: block !important');
...@@ -249,7 +249,7 @@ ...@@ -249,7 +249,7 @@
// Get the Code and Discount value and trim it // Get the Code and Discount value and trim it
var course_price = $.trim($('#mode_price').val()); var course_price = $.trim($('#mode_price').val());
var currency = $.trim($('#course_mode_currency').val()); var currency = $.trim($('#course_mode_currency').val());
// Check if empty of not // Check if empty of not
if (course_price === '') { if (course_price === '') {
$('#set_price_form #course_form_error').attr('style', 'display: block !important'); $('#set_price_form #course_form_error').attr('style', 'display: block !important');
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
// Get the Code and Discount value and trim it // Get the Code and Discount value and trim it
var code = $.trim($('#coupon_code').val()); var code = $.trim($('#coupon_code').val());
var coupon_discount = $.trim($('#coupon_discount').val()); var coupon_discount = $.trim($('#coupon_discount').val());
// Check if empty of not // Check if empty of not
if (code === '') { if (code === '') {
$("#add_coupon_button").removeAttr('disabled'); $("#add_coupon_button").removeAttr('disabled');
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
return false; return false;
} }
}); });
$('#set_price_form').on('ajax:complete', function (event, xhr) { $('#set_price_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) { if (xhr.status == 200) {
location.reload(true); location.reload(true);
...@@ -312,7 +312,7 @@ ...@@ -312,7 +312,7 @@
$('#set_price_form #course_form_error').text(xhr.responseText); $('#set_price_form #course_form_error').text(xhr.responseText);
} }
}); });
$('#add_coupon_form').on('ajax:complete', function (event, xhr) { $('#add_coupon_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) { if (xhr.status == 200) {
location.reload(true); location.reload(true);
...@@ -322,7 +322,7 @@ ...@@ -322,7 +322,7 @@
$('#add_coupon_form #coupon_form_error').text(xhr.responseText); $('#add_coupon_form #coupon_form_error').text(xhr.responseText);
} }
}); });
$('#edit_coupon_form').on('ajax:complete', function (event, xhr) { $('#edit_coupon_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) { if (xhr.status == 200) {
location.reload(true); location.reload(true);
...@@ -340,7 +340,7 @@ ...@@ -340,7 +340,7 @@
reset_input_fields(); reset_input_fields();
e.preventDefault(); e.preventDefault();
}); });
var onModalClose = function () { var onModalClose = function () {
$("#add-coupon-modal").attr("aria-hidden", "true"); $("#add-coupon-modal").attr("aria-hidden", "true");
$(".remove_coupon").focus(); $(".remove_coupon").focus();
...@@ -352,7 +352,7 @@ ...@@ -352,7 +352,7 @@
$("#update_coupon_button").removeAttr('disabled'); $("#update_coupon_button").removeAttr('disabled');
reset_input_fields(); reset_input_fields();
}; };
var cycle_modal_tab = function (from_element_name, to_element_name) { var cycle_modal_tab = function (from_element_name, to_element_name) {
$(from_element_name).on('keydown', function (e) { $(from_element_name).on('keydown', function (e) {
var keyCode = e.keyCode || e.which; var keyCode = e.keyCode || e.which;
...@@ -363,12 +363,12 @@ ...@@ -363,12 +363,12 @@
} }
}); });
}; };
$("#add-coupon-modal .close-modal").click(onModalClose); $("#add-coupon-modal .close-modal").click(onModalClose);
$("#edit-coupon-modal .close-modal").click(onModalClose); $("#edit-coupon-modal .close-modal").click(onModalClose);
$("#set-course-mode-price-modal .close-modal").click(reset_input_fields); $("#set-course-mode-price-modal .close-modal").click(reset_input_fields);
// Hitting the ESC key will exit the modal // Hitting the ESC key will exit the modal
$("#add-coupon-modal, #edit-coupon-modal, #set-course-mode-price-modal").on("keydown", function (e) { $("#add-coupon-modal, #edit-coupon-modal, #set-course-mode-price-modal").on("keydown", function (e) {
var keyCode = e.keyCode || e.which; var keyCode = e.keyCode || e.which;
...@@ -391,6 +391,6 @@ ...@@ -391,6 +391,6 @@
$('input#coupon_code').val(''); $('input#coupon_code').val('');
$('input#coupon_discount').val(''); $('input#coupon_discount').val('');
$('textarea#coupon_description').val(''); $('textarea#coupon_description').val('');
} }
</script> </script>
\ No newline at end of file
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
-e git+https://github.com/edx/bok-choy.git@9162c0bfb8e0eb1e2fa8e6df8dec12d181322a90#egg=bok_choy -e git+https://github.com/edx/bok-choy.git@9162c0bfb8e0eb1e2fa8e6df8dec12d181322a90#egg=bok_choy
-e git+https://github.com/edx-solutions/django-splash.git@9965a53c269666a30bb4e2b3f6037c138aef2a55#egg=django-splash -e git+https://github.com/edx-solutions/django-splash.git@9965a53c269666a30bb4e2b3f6037c138aef2a55#egg=django-splash
-e git+https://github.com/edx/acid-block.git@459aff7b63db8f2c5decd1755706c1a64fb4ebb1#egg=acid-xblock -e git+https://github.com/edx/acid-block.git@459aff7b63db8f2c5decd1755706c1a64fb4ebb1#egg=acid-xblock
-e git+https://github.com/edx/edx-ora2.git@release-2014-07-28T12.09#egg=edx-ora2 -e git+https://github.com/edx/edx-ora2.git@hotfix-2014-08-06#egg=edx-ora2
-e git+https://github.com/edx/opaque-keys.git@454bd984d9539550c6290020e92ee2d6094038d0#egg=opaque-keys -e git+https://github.com/edx/opaque-keys.git@454bd984d9539550c6290020e92ee2d6094038d0#egg=opaque-keys
-e git+https://github.com/edx/ease.git@97de68448e5495385ba043d3091f570a699d5b5f#egg=ease -e git+https://github.com/edx/ease.git@97de68448e5495385ba043d3091f570a699d5b5f#egg=ease
-e git+https://github.com/edx/i18n-tools.git@f5303e82dff368c7595884d9325aeea1d802da25#egg=i18n-tools -e git+https://github.com/edx/i18n-tools.git@f5303e82dff368c7595884d9325aeea1d802da25#egg=i18n-tools
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment