123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- # -*- coding: utf-8 -*-
- import os
- from django import db
- from django.test import TestCase, Client
- from django.contrib.auth.models import User
- from coin.members.models import Member, LdapUser, LdapGroup
- import logging
- import ldapdb
- from pprint import pprint
- class MemberTests(TestCase):
- def test_when_creating_member_a_ldapuser_is_also_created_with_same_data(self):
- """
- Test que lors de la création d'un nouveau membre, une entrée
- correspondante est bien créée dans le LDAP et qu'elle contient
- les mêmes données.
- Cela concerne le nom et le prénom
- """
- #~ Créé un membre
- first_name = u'Gérard'
- last_name = u'Majax'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name,
- ldap_cn=ldap_cn)
- member.save()
- #~ Récupère l'utilisateur LDAP et fait les tests
- ldap_user = LdapUser.objects.get(pk=ldap_cn)
- self.assertEqual(ldap_user.first_name, first_name)
- self.assertEqual(ldap_user.last_name, last_name)
- self.assertEqual(ldap_user.pk, ldap_cn)
- member.delete()
- ldap_user.delete()
- def test_when_modifiying_member_corresponding_ldap_user_is_also_modified_with_same_data(self):
- """
- Test que lorsque l'on modifie un membre, l'utilisateur LDAP
- correspondant est bien modifié
- Cela concerne le no met le prénom
- """
- #~ Créé un membre
- first_name = u'Ronald'
- last_name = u'Mac Donald'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name, ldap_cn=ldap_cn)
- member.save()
- #~ Le modifie
- new_first_name = u'José'
- new_last_name = u'Bové'
- member.first_name = new_first_name
- member.last_name = new_last_name
- member.save()
- #~ Récupère l'utilisateur LDAP et fait les tests
- ldap_user = LdapUser.objects.get(pk=ldap_cn)
- self.assertEqual(ldap_user.first_name, new_first_name)
- self.assertEqual(ldap_user.last_name, new_last_name)
- member.delete()
- ldap_user.delete()
- def test_when_creating_member_corresponding_ldap_user_is_in_coin_ldap_group(self):
- """
- Test que l'utilisateur Ldap fraichement créé est bien dans le group "coin"
- Et que lors de la supression d'un membre, l'utilisateur LDAP correspondant
- est bien retiré du groupe.
- """
- #~ Créé un membre
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name='Canard',
- last_name='WC', ldap_cn=ldap_cn)
- member.save()
- #~ Récupère le group "coin" et test que l'utilisateur y est présent
- ldap_group = LdapGroup.objects.get(pk="coin")
- self.assertEqual(ldap_cn in ldap_group.members, True)
- #~ Supprime l'utilisateur
- member.delete()
- #~ Récupère le group "coin" et test que l'utilisateur n'y est plus
- ldap_group = LdapGroup.objects.get(pk="coin")
- self.assertEqual(ldap_cn in ldap_group.members, False)
- LdapUser.objects.get(pk=ldap_cn).delete()
- def test_change_password_and_auth(self):
- """
- Test que la fonction change_password de member fonctionne et permet
- l'authentification avec le nouveau mot de passe
- """
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- password = "1234"
- #~ Créé un nouveau membre
- member = Member(first_name=u'Passe-partout',
- last_name=u'Du fort Boyard', ldap_cn=ldap_cn)
- member.save()
- #~ Récupère l'utilisateur LDAP
- ldap_user = LdapUser.objects.get(pk=ldap_cn)
- #~ Change son mot de passe
- member.change_password(password)
- #~ Test l'authentification
- c = Client()
- self.assertEqual(c.login(username=ldap_cn, password=password), True)
- member.delete()
- ldap_user.delete()
- def test_when_creating_member_ldap_display_name_is_well_defined(self):
- """
- Lors de la création d'un membre, le champ "display_name" du LDAP est
- prenom + nom
- """
- first_name = u'Gérard'
- last_name = u'Majax'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name, ldap_cn=ldap_cn)
- member.save()
- #~ Récupère l'utilisateur LDAP
- ldap_user = LdapUser.objects.get(pk=ldap_cn)
- self.assertEqual(ldap_user.display_name, '%s %s' %
- (first_name, last_name))
- member.delete()
- ldap_user.delete()
- def test_when_creating_member_ldap_cn_is_well_defined(self):
- """
- Lors de la création d'un membre, le champ "ldap_cn", s'il n'est pas
- définit doit être généré avec les contraintes suivantes :
- premières lettres du prénom + nom le tout en minuscule,
- sans caractères accentués et sans espaces.
- """
- random = os.urandom(4).encode('hex')
- first_name = u'Gérard-Étienne'
- last_name = u'Majax de la Boétie-Blop' + random
- control = 'gemajaxdelaboetieblop' + random
- member = Member(first_name=first_name, last_name=last_name)
- member.save()
- self.assertEqual(member.ldap_cn, control)
- member.delete()
- LdapUser.objects.get(pk=member.ldap_cn).delete()
- def test_when_saving_member_and_ldap_fail_dont_save(self):
- """
- Test que lors de la sauvegarde d'un membre et que la sauvegarde en LDAP
- échoue (ici mauvais mot de passe), rien n'est sauvegardé en base
- """
- # Fait échouer le LDAP en définissant un mauvais mot de passe
- for dbconnection in db.connections.all():
- if (type(dbconnection) is
- ldapdb.backends.ldap.base.DatabaseWrapper):
- dbconnection.settings_dict['PASSWORD'] = 'wrong password test'
- # Créé un membre
- first_name = u'Du'
- last_name = u'Pont'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name, ldap_cn=ldap_cn)
- # Le sauvegarde en base de donnée
- # Le save devrait renvoyer une exception parceque le LDAP échoue
- self.assertRaises(Exception, member.save)
- # On s'assure, malgré l'exception, que le membre n'est pas en base
- with self.assertRaises(Member.DoesNotExist):
- Member.objects.get(ldap_cn=ldap_cn)
- def test_when_user_login_member_user_field_is_updated(self):
- """
- Test que lorqu'un utilisateur se connect, le champ user du membre
- correspondant est mis à jour convenablement
- """
- # Créé un membre
- first_name = u'Du'
- last_name = u'Pond'
- password = '1234'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name, ldap_cn=ldap_cn)
- member.save()
- member.change_password(password)
- # Vérifie que user non définit
- self.assertIsNone(member.user)
- # Connection
- c = Client()
- self.assertEqual(c.login(username=ldap_cn, password=password), True)
- # Vérifie que user définit
- member = Member.objects.get(ldap_cn=ldap_cn)
- self.assertIsNotNone(member.user)
- class MemberAdminTests(TestCase):
- def setUp(self):
- #~ Client web
- self.client = Client()
- #~ Créé un superuser
- self.admin_user_password = '1234'
- self.admin_user = User.objects.create_superuser(
- 'test_admin_user', 'i@mail.com', self.admin_user_password)
- #~ Connection
- self.assertEqual(self.client.login(
- username=self.admin_user.username, password=self.admin_user_password), True)
- def test_cant_change_ldap_cn_when_editing(self):
- """
- Vérifie que dans l'admin Django, le champ ldap_cn n'est pad modifiable
- sur une fiche existante
- """
- #~ Créé un membre
- first_name = u'Gérard'
- last_name = u'Majax'
- ldap_cn = MemberTestsUtils.get_random_ldap_cn()
- member = Member(first_name=first_name,
- last_name=last_name, ldap_cn=ldap_cn)
- member.save()
- edit_page = self.client.get('/admin/members/member/%i/' % member.id)
- self.assertNotContains(edit_page,
- '''<input id="id_ldap_cn" />''',
- html=True)
- LdapUser.objects.get(pk=ldap_cn).delete()
- class MemberTestsUtils(object):
- @staticmethod
- def get_random_ldap_cn():
- """
- Renvoi une clé aléatoire pour un utilisateur LDAP
- """
- return 'coin_test_' + os.urandom(8).encode('hex')
|