Skip to content

Commit a37c114

Browse files
Jordan ReiterJordan Reiter
authored andcommitted
Compatibility with Django > 1.10
Changes to reflect changes after Django 1.10: - login and logout are now class-based views in `django.contrib.auth.views` - added test_middleware to confirm middleware match requests for login and logout views
1 parent f8143be commit a37c114

File tree

4 files changed

+61
-5
lines changed

4 files changed

+61
-5
lines changed

cas/middleware.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
from django.conf import settings
99
from django.contrib.auth import REDIRECT_FIELD_NAME
1010
from django.contrib.auth import logout as do_logout
11-
1211
try:
1312
from django.contrib.auth.views import login, logout
14-
except:
15-
from django.contrib.auth import login, logout
13+
except ImportError:
14+
from django.contrib.auth.views import LoginView, LogoutView
15+
login = LoginView.as_view().view_class
16+
logout = LogoutView.as_view().view_class
1617

1718
from django.http import HttpResponseRedirect, HttpResponseForbidden
1819
from django.core.exceptions import ImproperlyConfigured
@@ -57,6 +58,11 @@ def process_view(self, request, view_func, view_args, view_kwargs):
5758
logout.
5859
"""
5960

61+
try:
62+
view_func = view_func.view_class
63+
except AttributeError:
64+
pass
65+
6066
if view_func == login:
6167
return cas_login(request, *view_args, **view_kwargs)
6268
elif view_func == logout:

cas/tests/test_middleware.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
try:
2+
from unittest import mock
3+
except ImportError:
4+
import mock
5+
6+
from urllib.parse import quote_plus, urlencode
7+
8+
from django.conf import settings
9+
from django.test import TestCase, Client, override_settings, modify_settings
10+
11+
12+
13+
@override_settings(MIDDLEWARE=[
14+
'django.contrib.sessions.middleware.SessionMiddleware',
15+
'django.contrib.auth.middleware.AuthenticationMiddleware',
16+
'cas.middleware.CASMiddleware'
17+
])
18+
class CASBackendTest(TestCase):
19+
20+
def setUp(self):
21+
from cas.tests import factories
22+
self.user = factories.UserFactory.create()
23+
self.client = Client()
24+
25+
def test_login_calls_cas_login(self):
26+
resp = self.client.get('/login/')
27+
self.assertTrue(resp.has_header('Location'))
28+
expected_url = '{}/login?{}'.format(
29+
settings.CAS_SERVER_URL,
30+
urlencode({
31+
'service': 'http://testserver/login/?next={}'.format(quote_plus('/'))
32+
})
33+
)
34+
self.assertRedirects(resp, expected_url, fetch_redirect_response=False)
35+
36+
def test_logout_calls_cas_logout(self):
37+
resp = self.client.get('/logout/')
38+
self.assertTrue(resp.has_header('Location'))
39+
expected_url = '{}/logout?{}'.format(
40+
settings.CAS_SERVER_URL,
41+
urlencode({
42+
'service': 'http://testserver/'
43+
})
44+
)
45+
self.assertRedirects(resp, expected_url, fetch_redirect_response=False)

cas/tests/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.urls import path, include
2+
3+
urlpatterns = [
4+
path('', include('django.contrib.auth.urls')),
5+
]

run_tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
'ENGINE': 'django.db.backends.sqlite3',
1717
}
1818
},
19-
#ROOT_URLCONF='mailqueue.urls',
19+
ROOT_URLCONF='cas.tests.urls',
2020
INSTALLED_APPS=('django.contrib.auth',
2121
'django.contrib.contenttypes',
2222
'django.contrib.sessions',
@@ -30,7 +30,7 @@
3030
'ENGINE': 'django.db.backends.sqlite3',
3131
}
3232
},
33-
#ROOT_URLCONF='mailqueue.urls',
33+
ROOT_URLCONF='cas.tests.urls',
3434
INSTALLED_APPS=('django.contrib.auth',
3535
'django.contrib.contenttypes',
3636
'django.contrib.sessions',

0 commit comments

Comments
 (0)