Commit 86902e87 by Calen Pennington

Use the Django TestClient for external_auth shib unit tests, so that middleware…

Use the Django TestClient for external_auth shib unit tests, so that middleware is cleaned up properly
parent 7d32129b
...@@ -14,7 +14,6 @@ from django.test.utils import override_settings ...@@ -14,7 +14,6 @@ from django.test.utils import override_settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.models import AnonymousUser, User from django.contrib.auth.models import AnonymousUser, User
from importlib import import_module from importlib import import_module
from edxmako.tests import mako_middleware_process_request
from external_auth.models import ExternalAuthMap from external_auth.models import ExternalAuthMap
from external_auth.views import ( from external_auth.views import (
shib_login, course_specific_login, course_specific_register, _flatten_to_ascii shib_login, course_specific_login, course_specific_register, _flatten_to_ascii
...@@ -97,18 +96,11 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -97,18 +96,11 @@ class ShibSPTest(CacheIsolationTestCase):
Tests that we get the error page when there is no REMOTE_USER Tests that we get the error page when there is no REMOTE_USER
or Shib-Identity-Provider in request.META or Shib-Identity-Provider in request.META
""" """
no_remote_user_request = self.request_factory.get('/shib-login') no_remote_user_response = self.client.get(reverse('shib-login'), HTTP_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)
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)
no_idp_request = self.request_factory.get('/shib-login') no_idp_response = self.client.get(reverse('shib-login'), HTTP_REMOTE_USER=REMOTE_USER)
no_idp_request.META.update({'REMOTE_USER': REMOTE_USER})
no_idp_response = shib_login(no_idp_request)
self.assertEqual(no_idp_response.status_code, 403) self.assertEqual(no_idp_response.status_code, 403)
self.assertIn("identity server did not return your ID information", no_idp_response.content) self.assertIn("identity server did not return your ID information", no_idp_response.content)
...@@ -161,22 +153,22 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -161,22 +153,22 @@ class ShibSPTest(CacheIsolationTestCase):
for idp in idps: for idp in idps:
for remote_user in remote_users: for remote_user in remote_users:
request = self.request_factory.get('/shib-login')
request.session = import_module(settings.SESSION_ENGINE).SessionStore() # empty session self.client.logout()
request.META.update({'Shib-Identity-Provider': idp,
'REMOTE_USER': remote_user,
'mail': remote_user})
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 = self.client.get(
reverse('shib-login'),
**{
'Shib-Identity-Provider': idp,
'mail': remote_user,
'REMOTE_USER': remote_user,
}
)
audit_log_calls = mock_audit_log.method_calls audit_log_calls = mock_audit_log.method_calls
if idp == "https://idp.stanford.edu/" and remote_user == 'withmap@stanford.edu': if idp == "https://idp.stanford.edu/" and remote_user == 'withmap@stanford.edu':
self.assertIsInstance(response, HttpResponseRedirect) self.assertRedirects(response, '/dashboard')
self.assertEqual(request.user, user_w_map) self.assertEquals(int(self.client.session['_auth_user_id']), user_w_map.id)
self.assertEqual(response['Location'], '/dashboard')
# verify logging: # verify logging:
self.assertEquals(len(audit_log_calls), 2) self.assertEquals(len(audit_log_calls), 2)
self._assert_shib_login_is_logged(audit_log_calls[0], remote_user) self._assert_shib_login_is_logged(audit_log_calls[0], remote_user)
...@@ -198,9 +190,8 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -198,9 +190,8 @@ class ShibSPTest(CacheIsolationTestCase):
# self.assertEquals(remote_user, args[1]) # self.assertEquals(remote_user, args[1])
elif idp == "https://idp.stanford.edu/" and remote_user == 'womap@stanford.edu': elif idp == "https://idp.stanford.edu/" and remote_user == 'womap@stanford.edu':
self.assertIsNotNone(ExternalAuthMap.objects.get(user=user_wo_map)) self.assertIsNotNone(ExternalAuthMap.objects.get(user=user_wo_map))
self.assertIsInstance(response, HttpResponseRedirect) self.assertRedirects(response, '/dashboard')
self.assertEqual(request.user, user_wo_map) self.assertEquals(int(self.client.session['_auth_user_id']), user_wo_map.id)
self.assertEqual(response['Location'], '/dashboard')
# verify logging: # verify logging:
self.assertEquals(len(audit_log_calls), 2) self.assertEquals(len(audit_log_calls), 2)
self._assert_shib_login_is_logged(audit_log_calls[0], remote_user) self._assert_shib_login_is_logged(audit_log_calls[0], remote_user)
...@@ -313,8 +304,7 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -313,8 +304,7 @@ class ShibSPTest(CacheIsolationTestCase):
Uses django test client for its session support Uses django test client for its session support
""" """
# First we pop the registration form # First we pop the registration form
client = DjangoTestClient() self.client.get(path='/shib-login/', data={}, follow=False, **identity)
response1 = client.get(path='/shib-login/', data={}, follow=False, **identity)
# Then we have the user answer the registration form # Then we have the user answer the registration form
# These are unicode because request.POST returns unicode # These are unicode because request.POST returns unicode
postvars = {'email': u'post_email@stanford.edu', postvars = {'email': u'post_email@stanford.edu',
...@@ -323,16 +313,10 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -323,16 +313,10 @@ class ShibSPTest(CacheIsolationTestCase):
'name': u'post_náme', 'name': u'post_náme',
'terms_of_service': u'true', 'terms_of_service': u'true',
'honor_code': u'true'} 'honor_code': u'true'}
# use RequestFactory instead of TestClient here because we want access to request.user
request2 = self.request_factory.post('/create_account', data=postvars)
request2.session = client.session
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) self.client.post('/create_account', data=postvars)
user = request2.user
mail = identity.get('mail') mail = identity.get('mail')
# verify logging of login happening during account creation: # verify logging of login happening during account creation:
...@@ -355,6 +339,8 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -355,6 +339,8 @@ class ShibSPTest(CacheIsolationTestCase):
self.assertEquals(u'post_username', args[1]) self.assertEquals(u'post_username', args[1])
self.assertEquals(u'test_user@stanford.edu', args[2].external_id) self.assertEquals(u'test_user@stanford.edu', args[2].external_id)
user = User.objects.get(id=self.client.session['_auth_user_id'])
# check that the created user has the right email, either taken from shib or user input # check that the created user has the right email, either taken from shib or user input
if mail: if mail:
self.assertEqual(user.email, mail) self.assertEqual(user.email, mail)
...@@ -375,10 +361,10 @@ class ShibSPTest(CacheIsolationTestCase): ...@@ -375,10 +361,10 @@ class ShibSPTest(CacheIsolationTestCase):
if sn_empty and given_name_empty: if sn_empty and given_name_empty:
self.assertEqual(profile.name, postvars['name']) self.assertEqual(profile.name, postvars['name'])
else: else:
self.assertEqual(profile.name, request2.session['ExternalAuthMap'].external_name) self.assertEqual(profile.name, self.client.session['ExternalAuthMap'].external_name)
self.assertNotIn(u';', profile.name) self.assertNotIn(u';', profile.name)
else: else:
self.assertEqual(profile.name, request2.session['ExternalAuthMap'].external_name) self.assertEqual(profile.name, self.client.session['ExternalAuthMap'].external_name)
self.assertEqual(profile.name, identity.get('displayName').decode('utf-8')) self.assertEqual(profile.name, identity.get('displayName').decode('utf-8'))
......
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