tests.py 14 KB

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