gestioCOF/gestion/tests.py
Martin Pépin 0420839b20 Test the authentication
- An "outsider" must use django's authentication backend
- A user with a login_clipper should use CAS
2017-02-12 15:38:20 +01:00

107 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from unittest.mock import patch
from django.db.utils import IntegrityError
from django.test import Client, TestCase
from gestion.models import Profile, User
def create_profile(username):
"""
In order to create a profile, I need to create a User first.
This is annoying in most situations, as I just want a profile.
"""
User.objects.create(username=username,
first_name=username.title(),
last_name=username.title())
p, = Profile.objects.filter(user__username=username)
return p
class SimpleTest(TestCase):
def test_delete_user(self):
u = User(username='foo', first_name='foo', last_name='bar')
# to each user there's a cofprofile associated
u.save()
self.assertTrue(Profile.objects.filter(user__username='foo').exists())
# there's no point in having a cofprofile without a user associated.
u.delete()
self.assertFalse(Profile.objects.filter(user__username='foo').exists())
# there's no point in having a user without a cofprofile associated.
u.save()
Profile.objects.get(user__username='foo').delete()
self.assertFalse(User.objects.filter(username='foo').exists())
def test_create_profiles(self):
from kfet.models import Account
from cof.models import CofProfile
# test that two accounts can be linked to the same profile.
p = create_profile('foo')
pkfet = Account.objects.create(profile=p, trigramme='PIG')
pcof = CofProfile.objects.create(profile=p)
self.assertEqual(pkfet.profile, pcof.profile)
# each profile is linked to at most one account of the same type.
p1 = create_profile('bar')
p2 = create_profile('baz')
Account.objects.create(profile=p1, trigramme='BAR')
CofProfile.objects.create(profile=p2)
Account.objects.create(profile=p2, trigramme='BAZ')
self.assertRaises(IntegrityError,
CofProfile.objects.create, profile=p2)
class TestProfile(TestCase):
@patch('kfet.signals.messages')
def test_profile(self, mock_messages):
User.objects.create_superuser('root', 'foo@bar.com', 'root')
c = Client()
c.login(username='root', password='root')
response = c.get('/')
self.assertEqual(response.status_code, 200)
class AuthTest(TestCase):
def test_login(self):
client = Client()
# Setup a regular Django user
user = User.objects.create(username="foo")
user.set_password("bar")
user.save()
# Test the django auth
resp = client.post(
"/outsider/login",
{"username": "foo", "password": "bar"},
follow=True
)
self.assertEqual(resp.status_code, 200)
resp = client.get("/logout")
self.assertEqual(resp.status_code, 200)
# Give the user a clipper login
user.profile.login_clipper = "foo"
user.profile.save()
# Assert that it cannot use the regular auth
resp = client.post(
"/outsider/login",
{"username": "foo", "password": "bar"}
)
self.assertIn("error_type", resp.context)
self.assertEqual(resp.context["error_type"], "use_clipper_login")
# Test the CAS redirect
resp = client.get("/cas/login")
self.assertEqual(resp.status_code, 302)
self.assertEqual(
resp.url.split('?')[0],
"https://cas.eleves.ens.fr/login"
)