92d9473113fef53801a13afbb5b76a0e4416ee7f
[matthijs/upstream/django-ldapdb.git] / examples / tests.py
1 # -*- coding: utf-8 -*-
2
3 # django-ldapdb
4 # Copyright (c) 2009-2010, Bolloré telecom
5 # All rights reserved.
6
7 # See AUTHORS file for a full list of contributors.
8
9 # Redistribution and use in source and binary forms, with or without modification,
10 # are permitted provided that the following conditions are met:
11
12 #     1. Redistributions of source code must retain the above copyright notice, 
13 #        this list of conditions and the following disclaimer.
14 #     
15 #     2. Redistributions in binary form must reproduce the above copyright 
16 #        notice, this list of conditions and the following disclaimer in the
17 #        documentation and/or other materials provided with the distribution.
18
19 #     3. Neither the name of Bolloré telecom nor the names of its contributors
20 #        may be used to endorse or promote products derived from this software
21 #        without specific prior written permission.
22
23 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
27 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
30 # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #
34
35 from django.test import TestCase
36
37 import ldap
38 import ldapdb
39 from examples.models import LdapUser, LdapGroup
40
41 class BaseTestCase(TestCase):
42     def setUp(self):
43         cursor = ldapdb.connection._cursor()
44         for dn in [LdapGroup.base_dn, LdapUser.base_dn]:
45             rdn = dn.split(',')[0]
46             key, val = rdn.split('=')
47             attrs = [('objectClass', ['top', 'organizationalUnit']), (key, [val])]
48             try:
49                 cursor.connection.add_s(dn, attrs)
50             except ldap.ALREADY_EXISTS:
51                 pass
52
53     def tearDown(self):
54         cursor = ldapdb.connection._cursor()
55         for base in [LdapGroup.base_dn, LdapUser.base_dn]:
56             try:
57                 results = cursor.connection.search_s(base, ldap.SCOPE_SUBTREE)
58                 for dn, attrs in reversed(results):
59                     cursor.connection.delete_s(dn)
60             except ldap.NO_SUCH_OBJECT:
61                 pass
62
63 class GroupTestCase(BaseTestCase):
64     def setUp(self):
65         super(GroupTestCase, self).setUp()
66
67         g = LdapGroup()
68         g.name = "foogroup"
69         g.gid = 1000
70         g.usernames = ['foouser', 'baruser']
71         g.save()
72
73         g = LdapGroup()
74         g.name = "bargroup"
75         g.gid = 1001
76         g.usernames = ['zoouser', 'baruser']
77         g.save()
78
79         g = LdapGroup()
80         g.name = "wizgroup"
81         g.gid = 1002
82         g.usernames = ['wizuser', 'baruser']
83         g.save()
84
85     def test_count(self):
86         # empty query
87         qs = LdapGroup.objects.none()
88         self.assertEquals(qs.count(), 0)
89
90         qs = LdapGroup.objects.none()
91         self.assertEquals(len(qs), 0)
92
93         # all query
94         qs = LdapGroup.objects.all()
95         self.assertEquals(qs.count(), 3)
96
97         qs = LdapGroup.objects.all()
98         self.assertEquals(len(qs), 3)
99
100     def test_filter(self):
101         qs = LdapGroup.objects.filter(name='foogroup')
102         self.assertEquals(qs.count(), 1)
103
104         qs = LdapGroup.objects.filter(name='foogroup')
105         self.assertEquals(len(qs), 1)
106
107         g = qs[0]
108         self.assertEquals(g.dn, 'cn=foogroup,%s' % LdapGroup.base_dn)
109         self.assertEquals(g.name, 'foogroup')
110         self.assertEquals(g.gid, 1000)
111         self.assertEquals(g.usernames, ['foouser', 'baruser'])
112
113         # try to filter non-existent entries
114         qs = LdapGroup.objects.filter(name='does_not_exist')
115         self.assertEquals(qs.count(), 0)
116
117         qs = LdapGroup.objects.filter(name='does_not_exist')
118         self.assertEquals(len(qs), 0)
119
120     def test_get(self):
121         g = LdapGroup.objects.get(name='foogroup')
122         self.assertEquals(g.dn, 'cn=foogroup,%s' % LdapGroup.base_dn)
123         self.assertEquals(g.name, 'foogroup')
124         self.assertEquals(g.gid, 1000)
125         self.assertEquals(g.usernames, ['foouser', 'baruser'])
126
127         # try to get a non-existent entry
128         self.assertRaises(LdapGroup.DoesNotExist, LdapGroup.objects.get, name='does_not_exist')
129
130     def test_order_by(self):
131         # ascending name 
132         qs = LdapGroup.objects.order_by('name')
133         self.assertEquals(len(qs), 3)
134         self.assertEquals(qs[0].name, 'bargroup')
135         self.assertEquals(qs[1].name, 'foogroup')
136         self.assertEquals(qs[2].name, 'wizgroup')
137
138         # descending name 
139         qs = LdapGroup.objects.order_by('-name')
140         self.assertEquals(len(qs), 3)
141         self.assertEquals(qs[0].name, 'wizgroup')
142         self.assertEquals(qs[1].name, 'foogroup')
143         self.assertEquals(qs[2].name, 'bargroup')
144
145         # ascending gid
146         qs = LdapGroup.objects.order_by('gid')
147         self.assertEquals(len(qs), 3)
148         self.assertEquals(qs[0].gid, 1000)
149         self.assertEquals(qs[1].gid, 1001)
150         self.assertEquals(qs[2].gid, 1002)
151
152         # descending gid
153         qs = LdapGroup.objects.order_by('-gid')
154         self.assertEquals(len(qs), 3)
155         self.assertEquals(qs[0].gid, 1002)
156         self.assertEquals(qs[1].gid, 1001)
157         self.assertEquals(qs[2].gid, 1000)
158
159     def test_bulk_delete(self):
160         LdapGroup.objects.all().delete()
161
162         qs = LdapGroup.objects.all()
163         self.assertEquals(len(qs), 0)
164
165     def test_slice(self):
166         qs = LdapGroup.objects.all()
167         objs = list(qs)
168         self.assertEquals(len(objs), 3)
169         self.assertEquals(objs[0].gid, 1000)
170         self.assertEquals(objs[1].gid, 1001)
171         self.assertEquals(objs[2].gid, 1002)
172
173         # limit only
174         qs = LdapGroup.objects.all()
175         objs = qs[:2]
176         self.assertEquals(objs.count(), 2)
177
178         objs = qs[:2]
179         self.assertEquals(len(objs), 2)
180         self.assertEquals(objs[0].gid, 1000)
181         self.assertEquals(objs[1].gid, 1001)
182
183         # offset only
184         qs = LdapGroup.objects.all()
185         objs = qs[1:]
186         self.assertEquals(objs.count(), 2)
187
188         objs = qs[1:]
189         self.assertEquals(len(objs), 2)
190         self.assertEquals(objs[0].gid, 1001)
191         self.assertEquals(objs[1].gid, 1002)
192
193         # offset and limit
194         qs = LdapGroup.objects.all()
195         objs = qs[1:2]
196         self.assertEquals(objs.count(), 1)
197
198         objs = qs[1:2]
199         self.assertEquals(len(objs), 1)
200         self.assertEquals(objs[0].gid, 1001)
201
202     def test_update(self):
203         g = LdapGroup.objects.get(name='foogroup')
204
205         g.gid = 1002
206         g.usernames = ['foouser2', 'baruser2']
207         g.save()
208
209         # make sure DN gets updated if we change the pk
210         g.name = 'foogroup2'
211         g.save()
212         self.assertEquals(g.dn, 'cn=foogroup2,%s' % LdapGroup.base_dn)
213
214     def test_values(self):
215         qs = LdapGroup.objects.values('name')
216         self.assertEquals(len(qs), 3)
217         self.assertEquals(qs[0], {'name': 'foogroup'})
218         self.assertEquals(qs[1], {'name': 'bargroup'})
219         self.assertEquals(qs[2], {'name': 'wizgroup'})
220
221     def test_values_list(self):
222         qs = LdapGroup.objects.values_list('name')
223         self.assertEquals(len(qs), 3)
224         self.assertEquals(qs[0], ('foogroup',))
225         self.assertEquals(qs[1], ('bargroup',))
226         self.assertEquals(qs[2], ('wizgroup',))
227
228     def test_delete(self):
229         g = LdapGroup.objects.get(name='foogroup')
230         g.delete()
231
232         qs = LdapGroup.objects.all()
233         self.assertEquals(len(qs), 2)
234
235 class UserTestCase(BaseTestCase):
236     def setUp(self):
237         super(UserTestCase, self).setUp()
238
239         u = LdapUser()
240         u.first_name = u"Fôo"
241         u.last_name = u"Usér"
242         u.full_name = u"Fôo Usér"
243
244         u.group = 1000
245         u.home_directory = "/home/foouser"
246         u.uid = 2000
247         u.username = "foouser"
248         u.photo = '\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xfe\x00\x1cCreated with GIMP on a Mac\xff\xdb\x00C\x00\x05\x03\x04\x04\x04\x03\x05\x04\x04\x04\x05\x05\x05\x06\x07\x0c\x08\x07\x07\x07\x07\x0f\x0b\x0b\t\x0c\x11\x0f\x12\x12\x11\x0f\x11\x11\x13\x16\x1c\x17\x13\x14\x1a\x15\x11\x11\x18!\x18\x1a\x1d\x1d\x1f\x1f\x1f\x13\x17"$"\x1e$\x1c\x1e\x1f\x1e\xff\xdb\x00C\x01\x05\x05\x05\x07\x06\x07\x0e\x08\x08\x0e\x1e\x14\x11\x14\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xff\xc0\x00\x11\x08\x00\x08\x00\x08\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00\x19\x10\x00\x03\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x11A\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\x9d\xf29wU5Q\xd6\xfd\x00\x01\xff\xd9'
249         u.save()
250
251     def test_get(self):
252         u = LdapUser.objects.get(username='foouser')
253         self.assertEquals(u.first_name, u'Fôo')
254         self.assertEquals(u.last_name, u'Usér')
255         self.assertEquals(u.full_name, u'Fôo Usér')
256
257         self.assertEquals(u.group, 1000)
258         self.assertEquals(u.home_directory, '/home/foouser')
259         self.assertEquals(u.uid, 2000)
260         self.assertEquals(u.username, 'foouser')
261         self.assertEquals(u.photo, '\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xfe\x00\x1cCreated with GIMP on a Mac\xff\xdb\x00C\x00\x05\x03\x04\x04\x04\x03\x05\x04\x04\x04\x05\x05\x05\x06\x07\x0c\x08\x07\x07\x07\x07\x0f\x0b\x0b\t\x0c\x11\x0f\x12\x12\x11\x0f\x11\x11\x13\x16\x1c\x17\x13\x14\x1a\x15\x11\x11\x18!\x18\x1a\x1d\x1d\x1f\x1f\x1f\x13\x17"$"\x1e$\x1c\x1e\x1f\x1e\xff\xdb\x00C\x01\x05\x05\x05\x07\x06\x07\x0e\x08\x08\x0e\x1e\x14\x11\x14\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xff\xc0\x00\x11\x08\x00\x08\x00\x08\x03\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00\x19\x10\x00\x03\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x11A\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\x9d\xf29wU5Q\xd6\xfd\x00\x01\xff\xd9')
262
263         self.assertRaises(LdapUser.DoesNotExist, LdapUser.objects.get, username='does_not_exist')
264
265     def test_update(self):
266         u = LdapUser.objects.get(username='foouser')
267         u.first_name = u'Fôo2'
268         u.save()
269         
270         # make sure DN gets updated if we change the pk
271         u.username = 'foouser2'
272         u.save()
273         self.assertEquals(u.dn, 'uid=foouser2,%s' % LdapUser.base_dn)
274
275 class ScopedTestCase(BaseTestCase):
276     def setUp(self):
277         super(ScopedTestCase, self).setUp()
278
279         cursor = ldapdb.connection._cursor()
280         self.scoped_dn = "ou=contacts,%s" % LdapGroup.base_dn
281         attrs = [('objectClass', ['top', 'organizationalUnit']), ("ou", ["contacts"])]
282         cursor.connection.add_s(self.scoped_dn, attrs)
283
284     def test_scope(self):
285         ScopedGroup = LdapGroup.scoped(self.scoped_dn)
286
287         # create group
288         g = LdapGroup()
289         g.name = "foogroup"
290         g.gid = 1000
291         g.save()
292
293         qs = LdapGroup.objects.all()
294         self.assertEquals(qs.count(), 1)
295
296         qs = ScopedGroup.objects.all()
297         self.assertEquals(qs.count(), 0)
298
299         # create scoped group
300         g2 = ScopedGroup()
301         g2.name = "scopedgroup"
302         g2.gid = 5000
303         g2.save()
304
305         qs = LdapGroup.objects.all()
306         self.assertEquals(qs.count(), 2)
307
308         qs = ScopedGroup.objects.all()
309         self.assertEquals(qs.count(), 1)
310
311 class AdminTestCase(BaseTestCase):
312     fixtures = ['test_users.json']
313
314     def setUp(self):
315         super(AdminTestCase, self).setUp()
316
317         g = LdapGroup()
318         g.name = "foogroup"
319         g.gid = 1000
320         g.usernames = ['foouser', 'baruser']
321         g.save()
322
323         g = LdapGroup()
324         g.name = "bargroup"
325         g.gid = 1001
326         g.usernames = ['zoouser', 'baruser']
327         g.save()
328
329         u = LdapUser()
330         u.first_name = "Foo"
331         u.last_name = "User"
332         u.full_name = "Foo User"
333         u.group = 1000
334         u.home_directory = "/home/foouser"
335         u.uid = 2000
336         u.username = "foouser"
337         u.save()
338
339         u = LdapUser()
340         u.first_name = "Bar"
341         u.last_name = "User"
342         u.full_name = "Bar User"
343         u.group = 1001
344         u.home_directory = "/home/baruser"
345         u.uid = 2001
346         u.username = "baruser"
347         u.save()
348
349         self.client.login(username="test_user", password="password")
350
351     def test_index(self):
352         response = self.client.get('/admin/examples/')
353         self.assertContains(response, "Ldap groups")
354         self.assertContains(response, "Ldap users")
355
356     def test_group_list(self):
357         response = self.client.get('/admin/examples/ldapgroup/')
358         self.assertContains(response, "Ldap groups")
359         self.assertContains(response, "foogroup")
360         self.assertContains(response, "1000")
361
362         # order by name
363         response = self.client.get('/admin/examples/ldapgroup/?o=1')
364         self.assertContains(response, "Ldap groups")
365         self.assertContains(response, "foogroup")
366         self.assertContains(response, "1000")
367
368         # order by gid
369         response = self.client.get('/admin/examples/ldapgroup/?o=2')
370         self.assertContains(response, "Ldap groups")
371         self.assertContains(response, "foogroup")
372         self.assertContains(response, "1000")
373
374     def test_group_detail(self):
375         response = self.client.get('/admin/examples/ldapgroup/foogroup/')
376         self.assertContains(response, "foogroup")
377         self.assertContains(response, "1000")
378
379     def test_group_delete(self):
380         response = self.client.post('/admin/examples/ldapgroup/foogroup/delete/', {'yes': 'post'})
381         self.assertRedirects(response, '/admin/examples/ldapgroup/')
382
383     def test_group_search(self):
384         response = self.client.get('/admin/examples/ldapgroup/?q=foo')
385         self.assertContains(response, "Ldap groups")
386         self.assertContains(response, "foogroup")
387         self.assertContains(response, "1000")
388
389     def test_user_list(self):
390         response = self.client.get('/admin/examples/ldapuser/')
391         self.assertContains(response, "Ldap users")
392         self.assertContains(response, "foouser")
393         self.assertContains(response, "2000")
394
395         # order by username
396         response = self.client.get('/admin/examples/ldapuser/?o=1')
397         self.assertContains(response, "Ldap users")
398         self.assertContains(response, "foouser")
399         self.assertContains(response, "2000")
400
401         # order by uid
402         response = self.client.get('/admin/examples/ldapuser/?o=2')
403         self.assertContains(response, "Ldap users")
404         self.assertContains(response, "foouser")
405         self.assertContains(response, "2000")
406
407     def test_user_detail(self):
408         response = self.client.get('/admin/examples/ldapuser/foouser/')
409         self.assertContains(response, "foouser")
410         self.assertContains(response, "2000")
411
412     def test_user_delete(self):
413         response = self.client.post('/admin/examples/ldapuser/foouser/delete/', {'yes': 'post'})
414         self.assertRedirects(response, '/admin/examples/ldapuser/')
415