tests.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. # -*- coding: utf-8 -*-
  2. import os
  3. from django import db
  4. from django.test import TestCase, Client
  5. from django.contrib.auth.models import User
  6. from coin.members.models import Member, LdapUser, LdapGroup
  7. import logging
  8. import ldapdb
  9. from pprint import pprint
  10. class MemberTests(TestCase):
  11. def test_when_creating_member_a_ldapuser_is_also_created_with_same_data(self):
  12. """
  13. Test que lors de la création d'un nouveau membre, une entrée
  14. correspondante est bien créée dans le LDAP et qu'elle contient
  15. les mêmes données.
  16. Cela concerne le nom et le prénom
  17. """
  18. #~ Créé un membre
  19. first_name = u'Gérard'
  20. last_name = u'Majax'
  21. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  22. member = Member(first_name=first_name,
  23. last_name=last_name,
  24. ldap_cn=ldap_cn)
  25. member.save()
  26. #~ Récupère l'utilisateur LDAP et fait les tests
  27. ldap_user = LdapUser.objects.get(pk=ldap_cn)
  28. self.assertEqual(ldap_user.first_name, first_name)
  29. self.assertEqual(ldap_user.last_name, last_name)
  30. self.assertEqual(ldap_user.pk, ldap_cn)
  31. member.delete()
  32. ldap_user.delete()
  33. def test_when_modifiying_member_corresponding_ldap_user_is_also_modified_with_same_data(self):
  34. """
  35. Test que lorsque l'on modifie un membre, l'utilisateur LDAP
  36. correspondant est bien modifié
  37. Cela concerne le no met le prénom
  38. """
  39. #~ Créé un membre
  40. first_name = u'Ronald'
  41. last_name = u'Mac Donald'
  42. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  43. member = Member(first_name=first_name,
  44. last_name=last_name, ldap_cn=ldap_cn)
  45. member.save()
  46. #~ Le modifie
  47. new_first_name = u'José'
  48. new_last_name = u'Bové'
  49. member.first_name = new_first_name
  50. member.last_name = new_last_name
  51. member.save()
  52. #~ Récupère l'utilisateur LDAP et fait les tests
  53. ldap_user = LdapUser.objects.get(pk=ldap_cn)
  54. self.assertEqual(ldap_user.first_name, new_first_name)
  55. self.assertEqual(ldap_user.last_name, new_last_name)
  56. member.delete()
  57. ldap_user.delete()
  58. def test_when_creating_member_corresponding_ldap_user_is_in_coin_ldap_group(self):
  59. """
  60. Test que l'utilisateur Ldap fraichement créé est bien dans le group "coin"
  61. Et que lors de la supression d'un membre, l'utilisateur LDAP correspondant
  62. est bien retiré du groupe.
  63. """
  64. #~ Créé un membre
  65. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  66. member = Member(first_name='Canard',
  67. last_name='WC', ldap_cn=ldap_cn)
  68. member.save()
  69. #~ Récupère le group "coin" et test que l'utilisateur y est présent
  70. ldap_group = LdapGroup.objects.get(pk="coin")
  71. self.assertEqual(ldap_cn in ldap_group.members, True)
  72. #~ Supprime l'utilisateur
  73. member.delete()
  74. #~ Récupère le group "coin" et test que l'utilisateur n'y est plus
  75. ldap_group = LdapGroup.objects.get(pk="coin")
  76. self.assertEqual(ldap_cn in ldap_group.members, False)
  77. LdapUser.objects.get(pk=ldap_cn).delete()
  78. def test_change_password_and_auth(self):
  79. """
  80. Test que la fonction change_password de member fonctionne et permet
  81. l'authentification avec le nouveau mot de passe
  82. """
  83. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  84. password = "1234"
  85. #~ Créé un nouveau membre
  86. member = Member(first_name=u'Passe-partout',
  87. last_name=u'Du fort Boyard', ldap_cn=ldap_cn)
  88. member.save()
  89. #~ Récupère l'utilisateur LDAP
  90. ldap_user = LdapUser.objects.get(pk=ldap_cn)
  91. #~ Change son mot de passe
  92. member.change_password(password)
  93. #~ Test l'authentification
  94. c = Client()
  95. self.assertEqual(c.login(username=ldap_cn, password=password), True)
  96. member.delete()
  97. ldap_user.delete()
  98. def test_when_creating_member_ldap_display_name_is_well_defined(self):
  99. """
  100. Lors de la création d'un membre, le champ "display_name" du LDAP est
  101. prenom + nom
  102. """
  103. first_name = u'Gérard'
  104. last_name = u'Majax'
  105. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  106. member = Member(first_name=first_name,
  107. last_name=last_name, ldap_cn=ldap_cn)
  108. member.save()
  109. #~ Récupère l'utilisateur LDAP
  110. ldap_user = LdapUser.objects.get(pk=ldap_cn)
  111. self.assertEqual(ldap_user.display_name, '%s %s' %
  112. (first_name, last_name))
  113. member.delete()
  114. ldap_user.delete()
  115. def test_when_creating_member_ldap_cn_is_well_defined(self):
  116. """
  117. Lors de la création d'un membre, le champ "ldap_cn", s'il n'est pas
  118. définit doit être généré avec les contraintes suivantes :
  119. premières lettres du prénom + nom le tout en minuscule,
  120. sans caractères accentués et sans espaces.
  121. """
  122. random = os.urandom(4).encode('hex')
  123. first_name = u'Gérard-Étienne'
  124. last_name = u'Majax de la Boétie-Blop' + random
  125. control = 'gemajaxdelaboetieblop' + random
  126. member = Member(first_name=first_name, last_name=last_name)
  127. member.save()
  128. self.assertEqual(member.ldap_cn, control)
  129. member.delete()
  130. LdapUser.objects.get(pk=member.ldap_cn).delete()
  131. def test_when_saving_member_and_ldap_fail_dont_save(self):
  132. """
  133. Test que lors de la sauvegarde d'un membre et que la sauvegarde en LDAP
  134. échoue (ici mauvais mot de passe), rien n'est sauvegardé en base
  135. """
  136. # Fait échouer le LDAP en définissant un mauvais mot de passe
  137. for dbconnection in db.connections.all():
  138. if (type(dbconnection) is
  139. ldapdb.backends.ldap.base.DatabaseWrapper):
  140. dbconnection.settings_dict['PASSWORD'] = 'wrong password test'
  141. # Créé un membre
  142. first_name = u'Du'
  143. last_name = u'Pont'
  144. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  145. member = Member(first_name=first_name,
  146. last_name=last_name, ldap_cn=ldap_cn)
  147. # Le sauvegarde en base de donnée
  148. # Le save devrait renvoyer une exception parceque le LDAP échoue
  149. self.assertRaises(Exception, member.save)
  150. # On s'assure, malgré l'exception, que le membre n'est pas en base
  151. with self.assertRaises(Member.DoesNotExist):
  152. Member.objects.get(ldap_cn=ldap_cn)
  153. class MemberAdminTests(TestCase):
  154. def setUp(self):
  155. #~ Client web
  156. self.client = Client()
  157. #~ Créé un superuser
  158. self.admin_user_password = '1234'
  159. self.admin_user = User.objects.create_superuser(
  160. 'test_admin_user', 'i@mail.com', self.admin_user_password)
  161. #~ Connection
  162. self.assertEqual(self.client.login(
  163. username=self.admin_user.username, password=self.admin_user_password), True)
  164. def test_cant_change_ldap_cn_when_editing(self):
  165. """
  166. Vérifie que dans l'admin Django, le champ ldap_cn n'est pad modifiable
  167. sur une fiche existante
  168. """
  169. #~ Créé un membre
  170. first_name = u'Gérard'
  171. last_name = u'Majax'
  172. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  173. member = Member(first_name=first_name,
  174. last_name=last_name, ldap_cn=ldap_cn)
  175. member.save()
  176. edit_page = self.client.get('/admin/members/member/%i/' % member.id)
  177. self.assertNotContains(edit_page,
  178. '''<input id="id_ldap_cn" />''',
  179. html=True)
  180. LdapUser.objects.get(pk=ldap_cn).delete()
  181. class MemberTestsUtils(object):
  182. @staticmethod
  183. def get_random_ldap_cn():
  184. """
  185. Renvoi une clé aléatoire pour un utilisateur LDAP
  186. """
  187. return 'coin_test_' + os.urandom(8).encode('hex')