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

89 lines
3.2 KiB
Python

from django.contrib.auth import get_user_model
from django.core.files import File
from django.template.defaultfilters import urlencode
from django.test import Client, TestCase
from gestion.models import ErnestoUser
from ..models import Category, Partition, PartitionSet
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: add tests for upload/deletions
# 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 Partition set with 1 partition
self.pset = PartitionSet.objects.create(
category=Category.objects.first(), nom="My PSet", auteur="PSet author"
)
file = File(open("partitions/tests/test_file.txt"), "test file")
Partition.objects.create(nom="part1", part=file, morceau=self.pset)
def tearDown(self):
"""Remove dummy files from media/partitions/"""
for partition in self.pset.partition_set.all():
partition.delete()
def _get_restricted_page(self, url):
"""
Shorthand for testing wether a page in only accessible by ernesto
members
"""
for user, client in self.client_matrix:
# If user is not None, it is an ernesto member
resp = client.get(url)
if user:
self.assertEqual(200, resp.status_code)
else:
encoded_url = urlencode(urlencode(url))
redirection_url = "/login?next={}".format(encoded_url)
self.assertRedirects(resp, redirection_url)
def test_get_partition_sets(self):
"""The list of all partition sets can be fetched by everyone"""
for _, client in self.client_matrix:
resp = client.get("/partitions/")
self.assertEqual(200, resp.status_code)
def test_get_partitions(self):
"""
Only ernesto members can see the partitions inside of a partition set
"""
url = "/partitions/{}/{}".format(self.pset.nom, self.pset.auteur)
self._get_restricted_page(url)
def test_see(self):
"""Only ernesto members can see partitions"""
part = self.pset.partition_set.first()
url = "/partitions/{}/{}/see/{}".format(
self.pset.nom, self.pset.auteur, part.id
)
self._get_restricted_page(url)
def test_download(self):
"""Only ernesto members can download partitions"""
part = self.pset.partition_set.first()
url = "/partitions/{}/{}/{}".format(self.pset.nom, self.pset.auteur, part.id)
self._get_restricted_page(url)
def test_new(self):
"""Only ernesto members can create partiton sets"""
url = "/partitions/new"
self._get_restricted_page(url)