90fe9e27fb3afdd177236cd1d01381b3d22749a8
[auf_django_saml.git] / auf / django / saml / tests / saml.py
1 # -*- coding: utf-8 -*-
2
3 import re
4 import urllib
5
6 from django.core.urlresolvers import reverse
7
8 from django.contrib.auth.models import User
9
10 from auf.django.saml import settings
11 from auf.django.references import models as ref
12
13 from .middleware import LOGGED_USER_EMAIL, LOGGED_USER_GN, LOGGED_USER_SN
14 from .common import CommonTest
15
16
17 class PermissionTest(CommonTest):
18 """
19 Teste les outils de sécurisation.
20 """
21
22 def test_employe_required_anonymous(self):
23 """
24 Test le decorateur sans utilisateur connecté.
25 """
26 url = self.anonymize(reverse('test_employe_required'))
27 response = self.client.get(url)
28 self.assertEqual(response.status_code, 302)
29
30 def test_employe_required_authenticated(self):
31 """
32 Test le decorateur avec un utilisateur connecté.
33 """
34 url = reverse('test_employe_required')
35 response = self.client.get(url)
36 self.assertEqual(response.status_code, 403)
37
38 def test_employe_required_ok(self):
39 """
40 Test le decorateur avec un employé connecté.
41 """
42 ref.Employe(
43 courriel=LOGGED_USER_EMAIL).save()
44 url = reverse('test_employe_required')
45 response = self.client.get(url)
46 self.assertEqual(response.status_code, 200)
47
48 def test_login_required(self):
49 """
50 Test le décorateur de connexion requise.
51 """
52 url = self.anonymize(reverse('test_login_required'))
53 response = self.client.get(url)
54 self.assertEqual(response.status_code, 302)
55
56
57 class AdminTest(CommonTest):
58 """
59 Teste le comportement de l'admin avec l'IDP.
60 """
61
62 def test_anonymize(self):
63 """
64 Test la fonction qui ajoute un params GET.
65 """
66 url = self.anonymize(reverse('admin:index'))
67 self.assertEqual(url.count('?'), 1)
68
69 def test_admin_index_anonymous(self):
70 """
71 La page de login de l'admin doît être désactivée.
72 Il n'y a pas de redirection vers le login.
73 """
74 url = self.anonymize(reverse('admin:index'))
75 response = self.client.get(url)
76 self.assertEqual(
77 response['location'].count('?'),
78 1,
79 response['location'])
80 self.assertEqual(response.status_code, 302)
81 location, dummy = self.redirectize(response['location']).split('?')
82 self.assertEqual(location, settings.SAML_MELLON_LOGIN_URL)
83
84 def test_admin_index_authenticated(self):
85 """
86 L'admin est inacessible par défaut, mais le user est crée à la volée.
87 """
88 url = reverse('admin:index')
89 response = self.client.get(url)
90 self.assertEqual(response.status_code, 403)
91
92 self.assertEqual(User.objects.count(), 1)
93 user = User.objects.all()[0]
94 email = LOGGED_USER_EMAIL.replace('@auf.org', '')
95 self.assertEqual(user.username, email,)
96 self.assertEqual(user.email, LOGGED_USER_EMAIL,)
97 self.assertEqual(user.first_name, LOGGED_USER_GN)
98 self.assertEqual(user.last_name, LOGGED_USER_SN)
99
100 def test_admin_login(self):
101 """
102 Test l'accès à l'admin selon le flag is_staff du compte local.
103 """
104 url = reverse('admin:index')
105 self.client.get(url)
106 user = User.objects.all()[0]
107 user.is_staff = True
108 user.save()
109
110 response = self.client.get(url)
111 self.assertEqual(response.status_code, 200)
112
113 def test_admin_logout(self):
114 """
115 Test la redirection du logout local puis au IdP
116 """
117 url = reverse('admin:index')
118 self.client.get(url)
119 user = User.objects.all()[0]
120 user.is_staff = True
121 user.save()
122
123 url = reverse('admin:logout')
124 response = self.client.get(url)
125 location, qs = self.redirectize(response['location']).split('?')
126 self.assertEqual(response.status_code, 302)
127 self.assertEqual(location, reverse('local_logout'))
128
129
130 class TemplateTagTest(CommonTest):
131 """
132 Teste les fonctionnalités des templatetags SAML.
133 """
134
135 def setUp(self):
136 super(TemplateTagTest, self).setUp()
137 self.url = reverse('test_tags')
138 self.response = self.client.get(self.url)
139
140 def test_templatetag_login_var(self):
141 """
142 Test le rendu du templatetag *mellon_login_url* avec une variable en
143 paramètre.
144 """
145 regex = "test_templatetag_login_var:(.*)\?%s=(.*)\n" % (
146 settings.SAML_REDIRECT_FIELD_NAME, )
147 m = re.search(regex, self.response.content)
148 login_url, redirect_url = m.groups()
149 self.assertEqual(login_url, settings.SAML_MELLON_LOGIN_URL)
150 self.assertEqual(redirect_url, urllib.quote_plus(self.url))
151
152 def test_templatetag_login_default(self):
153 """
154 Test le rendu du templatetag *mellon_login_url* sans paramètre.
155 """
156 regex = "test_templatetag_login_default:(.*)\?%s=(.*)\n" % (
157 settings.SAML_REDIRECT_FIELD_NAME, )
158 m = re.search(regex, self.response.content)
159 login_url, redirect_url = m.groups()
160 self.assertEqual(login_url, settings.SAML_MELLON_LOGIN_URL)
161 self.assertEqual(redirect_url, urllib.quote_plus(self.url))
162
163 def test_templatetag_login_string(self):
164 """
165 Test le rendu du templatetag *mellon_login_url* avec paramètre string.
166 """
167 regex = "test_templatetag_login_string:(.*)\?%s=(.*)\n" % (
168 settings.SAML_REDIRECT_FIELD_NAME, )
169 m = re.search(regex, self.response.content)
170 login_url, redirect_url = m.groups()
171 self.assertEqual(login_url, settings.SAML_MELLON_LOGIN_URL)
172 self.assertEqual(redirect_url, urllib.quote_plus('/admin'))
173
174 def test_templatetag_logout_var(self):
175 """
176 Test le rendu du templatetag *mellon_logout_url* avec une variable en
177 paramètre.
178 """
179 regex = "test_templatetag_logout_var:(.*)\?%s=(.*)\n" % (
180 settings.SAML_REDIRECT_FIELD_NAME, )
181 m = re.search(regex, self.response.content)
182 logout_url, redirect_url = m.groups()
183 self.assertEqual(logout_url, reverse('local_logout'))
184 self.assertEqual(redirect_url, urllib.quote_plus(self.url))
185
186 def test_templatetag_logout_default(self):
187 """
188 Test le rendu du templatetag *mellon_logout_url* sans paramètre.
189 """
190 regex = "test_templatetag_logout_default:(.*)\?%s=(.*)\n" % (
191 settings.SAML_REDIRECT_FIELD_NAME, )
192 m = re.search(regex, self.response.content)
193 logout_url, redirect_url = m.groups()
194 self.assertEqual(logout_url, reverse('local_logout'))
195 self.assertEqual(
196 redirect_url,
197 urllib.quote_plus(settings.SAML_LOGOUT_REDIRECT_URL))
198
199 def test_templatetag_logout_string(self):
200 """
201 Test le rendu du templatetag *mellon_logout_url* avec paramètre string.
202 """
203 regex = "test_templatetag_logout_string:(.*)\?%s=(.*)\n" % (
204 settings.SAML_REDIRECT_FIELD_NAME, )
205 m = re.search(regex, self.response.content)
206 logout_url, redirect_url = m.groups()
207 self.assertEqual(logout_url, reverse('local_logout'))
208 self.assertEqual(redirect_url, urllib.quote_plus('/admin'))