tests.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  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_creating_legal_entity_organization_name_is_used_for_username(self):
  163. """
  164. Lors de la créatio d'une entreprise, son nom doit être utilisée lors de
  165. la détermination automatique du username
  166. """
  167. random = os.urandom(4).encode('hex')
  168. member = Member(type='legal_entity', organization_name='ILLYSE' + random, email='illyse@coin.org')
  169. member.save()
  170. self.assertEqual(member.username, 'illyse' + random)
  171. member.delete()
  172. def test_when_creating_member_with_nickname_it_is_used_for_username(self):
  173. """
  174. Lors de la création d'une personne, qui a un pseudo, celui-ci est utilisé en priorité
  175. """
  176. random = os.urandom(4).encode('hex')
  177. member = Member(first_name='Richard', last_name='Stallman', nickname='rms' + random, email='illyse@coin.org')
  178. member.save()
  179. self.assertEqual(member.username, 'rms' + random)
  180. member.delete()
  181. def test_when_saving_member_and_ldap_fail_dont_save(self):
  182. """
  183. Test que lors de la sauvegarde d'un membre et que la sauvegarde en LDAP
  184. échoue (ici mauvais mot de passe), rien n'est sauvegardé en base
  185. """
  186. # Fait échouer le LDAP en définissant un mauvais mot de passe
  187. for dbconnection in db.connections.all():
  188. if (type(dbconnection) is
  189. ldapdb.backends.ldap.base.DatabaseWrapper):
  190. dbconnection.settings_dict[
  191. 'PREVIOUSPASSWORD'] = dbconnection.settings_dict['PASSWORD']
  192. dbconnection.settings_dict['PASSWORD'] = 'wrong password test'
  193. # Créé un membre
  194. first_name = 'Du'
  195. last_name = 'Pont'
  196. username = MemberTestsUtils.get_random_username()
  197. member = Member(first_name=first_name,
  198. last_name=last_name, username=username)
  199. # Le sauvegarde en base de donnée
  200. # Le save devrait renvoyer une exception parceque le LDAP échoue
  201. self.assertRaises(Exception, member.save)
  202. # On s'assure, malgré l'exception, que le membre n'est pas en base
  203. with self.assertRaises(Member.DoesNotExist):
  204. Member.objects.get(username=username)
  205. # Restaure le mot de passe pour les tests suivants
  206. for dbconnection in db.connections.all():
  207. if (type(dbconnection) is
  208. ldapdb.backends.ldap.base.DatabaseWrapper):
  209. dbconnection.settings_dict[
  210. 'PASSWORD'] = dbconnection.settings_dict['PREVIOUSPASSWORD']
  211. # def test_when_user_login_member_user_field_is_updated(self):
  212. # """
  213. # Test que lorqu'un utilisateur se connect, le champ user du membre
  214. # correspondant est mis à jour convenablement
  215. # """
  216. # Créé un membre
  217. # first_name = 'Du'
  218. # last_name = 'Pond'
  219. # password = '1234'
  220. # username = MemberTestsUtils.get_random_username()
  221. # member = Member(first_name=first_name,
  222. # last_name=last_name, username=username)
  223. # member.save()
  224. # member.change_password(password)
  225. # Vérifie que user non définit
  226. # self.assertIsNone(member.user)
  227. # Connection
  228. # c = Client()
  229. # self.assertEqual(c.login(username=username, password=password), True)
  230. # Vérifie que user définit
  231. # member = Member.objects.get(username=username)
  232. # self.assertIsNotNone(member.user)
  233. # LdapUser.objects.get(pk=member.username).delete()
  234. def test_member_end_date_of_memberhip(self):
  235. """
  236. Test que end_date_of_membership d'un membre envoi bien la date de fin d'adhésion
  237. """
  238. # Créer un membre
  239. first_name = 'Tin'
  240. last_name = 'Tin'
  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. # Créé une cotisation
  248. membershipfee = MembershipFee(member=member, amount=20,
  249. start_date=start_date,
  250. end_date=end_date)
  251. membershipfee.save()
  252. self.assertEqual(member.end_date_of_membership(), end_date)
  253. def test_member_is_paid_up(self):
  254. """
  255. Test l'état "a jour de cotisation" d'un adhérent.
  256. """
  257. # Créé un membre
  258. first_name = 'Capitain'
  259. last_name = 'Haddock'
  260. username = MemberTestsUtils.get_random_username()
  261. member = Member(first_name=first_name,
  262. last_name=last_name, username=username)
  263. member.save()
  264. start_date = datetime.date.today()
  265. end_date = start_date + datetime.timedelta(365)
  266. # Test qu'un membre sans cotisation n'est pas à jour
  267. self.assertEqual(member.is_paid_up(), False)
  268. # Créé une cotisation passée
  269. membershipfee = MembershipFee(member=member, amount=20,
  270. start_date=datetime.date.today() -
  271. datetime.timedelta(365),
  272. end_date=datetime.date.today() - datetime.timedelta(10))
  273. membershipfee.save()
  274. # La cotisation s'étant terminée il y a 10 jours, il ne devrait pas
  275. # être à jour de cotistion
  276. self.assertEqual(member.is_paid_up(), False)
  277. # Créé une cotisation actuelle
  278. membershipfee = MembershipFee(member=member, amount=20,
  279. start_date=datetime.date.today() -
  280. datetime.timedelta(10),
  281. end_date=datetime.date.today() + datetime.timedelta(10))
  282. membershipfee.save()
  283. # La cotisation se terminant dans 10 jour, il devrait être à jour
  284. # de cotisation
  285. self.assertEqual(member.is_paid_up(), True)
  286. def test_member_cant_be_created_without_names(self):
  287. """
  288. Test qu'un membre ne peut pas être créé sans "noms"
  289. (prenom, nom) ou pseudo ou nom d'organization
  290. """
  291. member = Member(username='blop')
  292. self.assertRaises(Exception, member.save)
  293. member = Member()
  294. self.assertRaises(Exception, member.save)
  295. class MemberAdminTests(TestCase):
  296. def setUp(self):
  297. #~ Client web
  298. self.client = Client()
  299. #~ Créé un superuser
  300. self.admin_user_password = '1234'
  301. self.admin_user = Member.objects.create_superuser(
  302. username='test_admin_user',
  303. first_name='test',
  304. last_name='Admin user',
  305. email='i@mail.com',
  306. password=self.admin_user_password)
  307. #~ Connection
  308. self.assertEqual(self.client.login(
  309. username=self.admin_user.username, password=self.admin_user_password), True)
  310. def tearDown(self):
  311. # Supprime le superuser
  312. self.admin_user.delete()
  313. def test_cant_change_username_when_editing(self):
  314. """
  315. Vérifie que dans l'admin Django, le champ username n'est pad modifiable
  316. sur une fiche existante
  317. """
  318. #~ Créé un membre
  319. first_name = 'Gérard'
  320. last_name = 'Majax'
  321. username = MemberTestsUtils.get_random_username()
  322. member = Member(first_name=first_name,
  323. last_name=last_name, username=username)
  324. member.save()
  325. edit_page = self.client.get('/admin/members/member/%i/' % member.id)
  326. self.assertNotContains(edit_page,
  327. '''<input id="id_username" />''',
  328. html=True)
  329. member.delete()
  330. class MemberTestsUtils(object):
  331. @staticmethod
  332. def get_random_username():
  333. """
  334. Renvoi une clé aléatoire pour un utilisateur LDAP
  335. """
  336. return 'coin_test_' + os.urandom(8).encode('hex')