tests.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. def test_when_user_login_member_user_field_is_updated(self):
  154. """
  155. Test que lorqu'un utilisateur se connect, le champ user du membre
  156. correspondant est mis à jour convenablement
  157. """
  158. # Créé un membre
  159. first_name = u'Du'
  160. last_name = u'Pond'
  161. password = '1234'
  162. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  163. member = Member(first_name=first_name,
  164. last_name=last_name, ldap_cn=ldap_cn)
  165. member.save()
  166. member.change_password(password)
  167. # Vérifie que user non définit
  168. self.assertIsNone(member.user)
  169. # Connection
  170. c = Client()
  171. self.assertEqual(c.login(username=ldap_cn, password=password), True)
  172. # Vérifie que user définit
  173. member = Member.objects.get(ldap_cn=ldap_cn)
  174. self.assertIsNotNone(member.user)
  175. class MemberAdminTests(TestCase):
  176. def setUp(self):
  177. #~ Client web
  178. self.client = Client()
  179. #~ Créé un superuser
  180. self.admin_user_password = '1234'
  181. self.admin_user = User.objects.create_superuser(
  182. 'test_admin_user', 'i@mail.com', self.admin_user_password)
  183. #~ Connection
  184. self.assertEqual(self.client.login(
  185. username=self.admin_user.username, password=self.admin_user_password), True)
  186. def test_cant_change_ldap_cn_when_editing(self):
  187. """
  188. Vérifie que dans l'admin Django, le champ ldap_cn n'est pad modifiable
  189. sur une fiche existante
  190. """
  191. #~ Créé un membre
  192. first_name = u'Gérard'
  193. last_name = u'Majax'
  194. ldap_cn = MemberTestsUtils.get_random_ldap_cn()
  195. member = Member(first_name=first_name,
  196. last_name=last_name, ldap_cn=ldap_cn)
  197. member.save()
  198. edit_page = self.client.get('/admin/members/member/%i/' % member.id)
  199. self.assertNotContains(edit_page,
  200. '''<input id="id_ldap_cn" />''',
  201. html=True)
  202. LdapUser.objects.get(pk=ldap_cn).delete()
  203. class MemberTestsUtils(object):
  204. @staticmethod
  205. def get_random_ldap_cn():
  206. """
  207. Renvoi une clé aléatoire pour un utilisateur LDAP
  208. """
  209. return 'coin_test_' + os.urandom(8).encode('hex')