tests.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import datetime
  4. from django import db
  5. from django.test import TestCase, Client, override_settings
  6. from django.contrib.auth.models import User
  7. # from django.contrib.auth.tests.custom_user import ExtensionUser
  8. from coin.members.models import Member, MembershipFee, LdapUser, LdapGroup
  9. import logging
  10. import ldapdb
  11. from pprint import pprint
  12. class MemberTests(TestCase):
  13. def test_when_creating_member_a_ldapuser_is_also_created_with_same_data(self):
  14. """
  15. Test que lors de la création d'un nouveau membre, une entrée
  16. correspondante est bien créée dans le LDAP et qu'elle contient
  17. les mêmes données.
  18. Cela concerne le nom et le prénom
  19. """
  20. #~ Créé un membre
  21. first_name = u'Gérard'
  22. last_name = u'Majax'
  23. username = MemberTestsUtils.get_random_username()
  24. member = Member(first_name=first_name,
  25. last_name=last_name,
  26. username=username)
  27. member.save()
  28. #~ Récupère l'utilisateur LDAP et fait les tests
  29. ldap_user = LdapUser.objects.get(pk=username)
  30. self.assertEqual(ldap_user.first_name, first_name)
  31. self.assertEqual(ldap_user.last_name, last_name)
  32. self.assertEqual(ldap_user.pk, username)
  33. member.delete()
  34. def test_when_modifiying_member_corresponding_ldap_user_is_also_modified_with_same_data(self):
  35. """
  36. Test que lorsque l'on modifie un membre, l'utilisateur LDAP
  37. correspondant est bien modifié
  38. Cela concerne le no met le prénom
  39. """
  40. #~ Créé un membre
  41. first_name = u'Ronald'
  42. last_name = u'Mac Donald'
  43. username = MemberTestsUtils.get_random_username()
  44. member = Member(first_name=first_name,
  45. last_name=last_name, username=username)
  46. member.save()
  47. #~ Le modifie
  48. new_first_name = u'José'
  49. new_last_name = u'Bové'
  50. member.first_name = new_first_name
  51. member.last_name = new_last_name
  52. member.save()
  53. #~ Récupère l'utilisateur LDAP et fait les tests
  54. ldap_user = LdapUser.objects.get(pk=username)
  55. self.assertEqual(ldap_user.first_name, new_first_name)
  56. self.assertEqual(ldap_user.last_name, new_last_name)
  57. member.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. # username = MemberTestsUtils.get_random_username()
  66. # member = Member(first_name='Canard',
  67. # last_name='WC', username=username)
  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(username 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(username in ldap_group.members, False)
  77. # LdapUser.objects.get(pk=username).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. username = MemberTestsUtils.get_random_username()
  84. password = "1234"
  85. #~ Créé un nouveau membre
  86. member = Member(first_name=u'Passe-partout',
  87. last_name=u'Du fort Boyard', username=username)
  88. member.save()
  89. #~ Récupère l'utilisateur LDAP
  90. ldap_user = LdapUser.objects.get(pk=username)
  91. #~ Change son mot de passe
  92. member.set_password(password)
  93. member.save()
  94. #~ Test l'authentification django
  95. c = Client()
  96. self.assertEqual(c.login(username=username, password=password), True)
  97. # Test l'authentification ldap
  98. import ldap
  99. ldap_conn_settings = db.connections['ldap'].settings_dict
  100. l = ldap.initialize(ldap_conn_settings['NAME'])
  101. options = ldap_conn_settings.get('CONNECTION_OPTIONS', {})
  102. for opt, value in options.items():
  103. l.set_option(opt, value)
  104. if ldap_conn_settings.get('TLS', False):
  105. l.start_tls_s()
  106. # Raise "Invalid credentials" exception if auth fail
  107. l.simple_bind_s(ldap_conn_settings['USER'],
  108. ldap_conn_settings['PASSWORD'])
  109. l.unbind_s()
  110. member.delete()
  111. def test_when_creating_member_ldap_display_name_is_well_defined(self):
  112. """
  113. Lors de la création d'un membre, le champ "display_name" du LDAP est
  114. prenom + nom
  115. """
  116. first_name = u'Gérard'
  117. last_name = u'Majax'
  118. username = MemberTestsUtils.get_random_username()
  119. member = Member(first_name=first_name,
  120. last_name=last_name, username=username)
  121. member.save()
  122. #~ Récupère l'utilisateur LDAP
  123. ldap_user = LdapUser.objects.get(pk=username)
  124. self.assertEqual(ldap_user.display_name, '%s %s' %
  125. (first_name, last_name))
  126. member.delete()
  127. def test_when_creating_member_username_is_well_defined(self):
  128. """
  129. Lors de la création d'un membre, le champ "username", s'il n'est pas
  130. définit doit être généré avec les contraintes suivantes :
  131. premières lettres du prénom + nom le tout en minuscule,
  132. sans caractères accentués et sans espaces.
  133. """
  134. random = os.urandom(4).encode('hex')
  135. first_name = u'Gérard-Étienne'
  136. last_name = u'Majax de la Boétie!B' + random
  137. control = 'gemajaxdelaboetieb' + random
  138. control = control[:30]
  139. member = Member(first_name=first_name, last_name=last_name)
  140. member.save()
  141. self.assertEqual(member.username, control)
  142. member.delete()
  143. def test_when_saving_member_and_ldap_fail_dont_save(self):
  144. """
  145. Test que lors de la sauvegarde d'un membre et que la sauvegarde en LDAP
  146. échoue (ici mauvais mot de passe), rien n'est sauvegardé en base
  147. """
  148. # Fait échouer le LDAP en définissant un mauvais mot de passe
  149. for dbconnection in db.connections.all():
  150. if (type(dbconnection) is
  151. ldapdb.backends.ldap.base.DatabaseWrapper):
  152. dbconnection.settings_dict['PREVIOUSPASSWORD'] = dbconnection.settings_dict['PASSWORD']
  153. dbconnection.settings_dict['PASSWORD'] = 'wrong password test'
  154. # Créé un membre
  155. first_name = u'Du'
  156. last_name = u'Pont'
  157. username = MemberTestsUtils.get_random_username()
  158. member = Member(first_name=first_name,
  159. last_name=last_name, username=username)
  160. # Le sauvegarde en base de donnée
  161. # Le save devrait renvoyer une exception parceque le LDAP échoue
  162. self.assertRaises(Exception, member.save)
  163. # On s'assure, malgré l'exception, que le membre n'est pas en base
  164. with self.assertRaises(Member.DoesNotExist):
  165. Member.objects.get(username=username)
  166. # Restaure le mot de passe pour les tests suivants
  167. for dbconnection in db.connections.all():
  168. if (type(dbconnection) is
  169. ldapdb.backends.ldap.base.DatabaseWrapper):
  170. dbconnection.settings_dict['PASSWORD'] = dbconnection.settings_dict['PREVIOUSPASSWORD']
  171. # def test_when_user_login_member_user_field_is_updated(self):
  172. # """
  173. # Test que lorqu'un utilisateur se connect, le champ user du membre
  174. # correspondant est mis à jour convenablement
  175. # """
  176. # # Créé un membre
  177. # first_name = u'Du'
  178. # last_name = u'Pond'
  179. # password = '1234'
  180. # username = MemberTestsUtils.get_random_username()
  181. # member = Member(first_name=first_name,
  182. # last_name=last_name, username=username)
  183. # member.save()
  184. # member.change_password(password)
  185. # # Vérifie que user non définit
  186. # self.assertIsNone(member.user)
  187. # # Connection
  188. # c = Client()
  189. # self.assertEqual(c.login(username=username, password=password), True)
  190. # # Vérifie que user définit
  191. # member = Member.objects.get(username=username)
  192. # self.assertIsNotNone(member.user)
  193. # LdapUser.objects.get(pk=member.username).delete()
  194. def test_member_end_date_of_memberhip(self):
  195. """
  196. Test que end_date_of_membership d'un membre envoi bien la date de fin d'adhésion
  197. """
  198. #Créer un membre
  199. first_name = u'Tin'
  200. last_name = u'Tin'
  201. username = MemberTestsUtils.get_random_username()
  202. member = Member(first_name=first_name,
  203. last_name=last_name, username=username)
  204. member.save()
  205. start_date = datetime.date.today()
  206. end_date = start_date + datetime.timedelta(365)
  207. #Créé une cotisation
  208. membershipfee = MembershipFee(member=member, amount=20,
  209. start_date=start_date,
  210. end_date=end_date)
  211. membershipfee.save()
  212. self.assertEqual(member.end_date_of_membership(), end_date)
  213. def test_member_is_paid_up(self):
  214. """
  215. Test que end_date_of_membership d'un membre envoi bien la date de fin d'adhésion
  216. """
  217. #Créé un membre
  218. first_name = u'Capitain'
  219. last_name = u'Haddock'
  220. username = MemberTestsUtils.get_random_username()
  221. member = Member(first_name=first_name,
  222. last_name=last_name, username=username)
  223. member.save()
  224. start_date = datetime.date.today()
  225. end_date = start_date + datetime.timedelta(365)
  226. # Test qu'un membre sans cotisation n'est pas à jour
  227. self.assertEqual(member.is_paid_up(), False)
  228. #Créé une cotisation passée
  229. membershipfee = MembershipFee(member=member, amount=20,
  230. start_date=datetime.date.today() - datetime.timedelta(365),
  231. end_date=datetime.date.today() - datetime.timedelta(10))
  232. membershipfee.save()
  233. # La cotisation s'étant terminée il y a 10 jours, il ne devrait pas
  234. # être à jour de cotistion
  235. self.assertEqual(member.is_paid_up(), False)
  236. #Créé une cotisation actuelle
  237. membershipfee = MembershipFee(member=member, amount=20,
  238. start_date=datetime.date.today() - datetime.timedelta(10),
  239. end_date=datetime.date.today() + datetime.timedelta(10))
  240. membershipfee.save()
  241. # La cotisation se terminant dans 10 jour, il devrait être à jour
  242. # de cotisation
  243. self.assertEqual(member.is_paid_up(), True)
  244. class MemberAdminTests(TestCase):
  245. def setUp(self):
  246. #~ Client web
  247. self.client = Client()
  248. #~ Créé un superuser
  249. self.admin_user_password = '1234'
  250. self.admin_user = Member.objects.create_superuser(
  251. username = 'test_admin_user',
  252. first_name = 'test',
  253. last_name = 'Admin user',
  254. email='i@mail.com',
  255. password=self.admin_user_password)
  256. #~ Connection
  257. self.assertEqual(self.client.login(
  258. username=self.admin_user.username, password=self.admin_user_password), True)
  259. def tearDown(self):
  260. # Supprime le superuser
  261. self.admin_user.delete()
  262. def test_cant_change_username_when_editing(self):
  263. """
  264. Vérifie que dans l'admin Django, le champ username n'est pad modifiable
  265. sur une fiche existante
  266. """
  267. #~ Créé un membre
  268. first_name = u'Gérard'
  269. last_name = u'Majax'
  270. username = MemberTestsUtils.get_random_username()
  271. member = Member(first_name=first_name,
  272. last_name=last_name, username=username)
  273. member.save()
  274. edit_page = self.client.get('/admin/members/member/%i/' % member.id)
  275. self.assertNotContains(edit_page,
  276. '''<input id="id_username" />''',
  277. html=True)
  278. LdapUser.objects.get(pk=username).delete()
  279. class MemberTestsUtils(object):
  280. @staticmethod
  281. def get_random_username():
  282. """
  283. Renvoi une clé aléatoire pour un utilisateur LDAP
  284. """
  285. return 'coin_test_' + os.urandom(8).encode('hex')