ernestophone.ens.fr/calendrier/tests/test_views.py
2021-04-29 00:27:33 +02:00

154 lines
5.2 KiB
Python

from datetime import timedelta
from django.contrib.auth import get_user_model
from django.template.defaultfilters import urlencode
from django.test import Client, TestCase
from django.utils import timezone
from gestion.models import ErnestoUser
from ..models import Event
User = get_user_model()
def new_user(username, ernesto=False, chef=False):
u = User.objects.create_user(username=username)
ErnestoUser.objects.create(user=u, slug=username, is_chef=chef, is_ernesto=ernesto)
return u
class TestViews(TestCase):
# TODO: test forms
def setUp(self):
# User with different access level and their clients
chef = new_user("chef", ernesto=True, chef=True)
chef_c = Client()
chef_c.force_login(chef)
ernesto = new_user("ernesto", ernesto=True)
ernesto_c = Client()
ernesto_c.force_login(ernesto)
self.client_matrix = [(chef, chef_c), (ernesto, ernesto_c), (None, Client())]
# A private and a public event
now = timezone.now()
later = now + timedelta(seconds=3600)
self.priv_event = Event.objects.create(
nom="private event",
nomcourt="privevt",
date=now.date(),
debut=now.time(),
fin=later.time(),
slug="privevt",
lieu="somewhere",
calendrier=False,
)
self.pub_event = Event.objects.create(
nom="public event",
nomcourt="pubevt",
date=now.date(),
debut=now.time(),
fin=later.time(),
slug="pubevt",
lieu="somewhere",
calendrier=True,
)
# Everyone can see theses pages
def _everyone_can_get(self, url, redirect_url=None):
"""Shorthand for checking that every kind of user can get a page"""
for _, client in self.client_matrix:
resp = client.get(url)
if redirect_url:
self.assertRedirects(resp, redirect_url)
else:
self.assertEqual(200, resp.status_code)
def test_get_home(self):
url = "/calendar/"
self._everyone_can_get(url)
def test_get_calendar(self):
year, month = 2017, 5
url = "/calendar/{}/{}".format(year, month)
self._everyone_can_get(url)
def test_get_public_event(self):
"""Public event, everyone can see"""
evt = self.pub_event
url = "/calendar/{}".format(evt.id)
self._everyone_can_get(url)
def test_get_reponse_event(self):
# XXX: this view sucks
chef, _ = self.client_matrix[0]
codereps = ["oui", "non", "pe"]
for coderep in codereps:
url = "/calendar/rep/{}/{}/{}".format(
chef.profile.slug, self.priv_event.slug, coderep
)
self._everyone_can_get(url, redirect_url="/calendar/")
# Only ernesto members can get theses pages
def _get_restricted_page(self, url, chef_only=False, redirect_url=None):
"""Shorthand for testing wether a page in only accessible by ernesto members"""
def user_allowed(user):
if user is None:
return False
if chef_only:
return user.profile.is_chef
return True
for user, client in self.client_matrix:
# If user is not None, it is an ernesto member
resp = client.get(url)
if user_allowed(user):
self.assertEqual(200, resp.status_code)
else:
if redirect_url is None:
redirect_url = "/login?next={}".format(urlencode(urlencode(url)))
self.assertRedirects(resp, redirect_url)
def test_get_private_event(self):
"""Private event, restricted access"""
evt = self.priv_event
url = "/calendar/{}".format(evt.id)
self._get_restricted_page(url, redirect_url="/calendar/")
def test_get_private_event_bis(self):
"""Private event, restricted access"""
url = "/calendar/{}".format(self.priv_event.id)
self._get_restricted_page(url, redirect_url="/calendar/")
def test_get_new(self):
"""Only chef can create an event"""
url = "/calendar/new"
self._get_restricted_page(url, chef_only=True)
def test_get_edit(self):
"""Only chef can edit an event"""
url = "/calendar/edition/{}".format(self.pub_event.id)
self._get_restricted_page(url, chef_only=True)
def test_get_delete(self):
"""Only chef can delete an event"""
url = "/calendar/supprimer/{}".format(self.pub_event.id)
self._get_restricted_page(url, chef_only=True)
def test_get_resend(self):
"""Only chef can send event emails"""
url = "/calendar/resend/{}".format(self.pub_event.id)
self._get_restricted_page(url, chef_only=True)
def test_get_changename(self):
"""Only authenticated users can have a doodle name"""
url = "/calendar/changename"
self._get_restricted_page(url)
def test_get_answers(self):
"""Only ernesto members can see who attends an event"""
url = "/calendar/{}/reponse".format(self.priv_event.id)
self._get_restricted_page(url)