from django.test import TestCase from interface import models, utils from django.contrib.auth.models import User from django.utils import timezone from datetime import timedelta class AccessTestCase(TestCase): USERS = () ENSEMBLES = () PROJECTS = () @classmethod def setUpTestData(cls): cls.users = {} for details in cls.USERS: cls.users[details['username']] = User.objects.create_user(**details) now = timezone.now() cls.ensembles = {} for details in cls.ENSEMBLES: admins = details.pop('admins', []) obj = models.Ensemble.objects.create(**details) for admin in admins: obj.admins.add(cls.users[admin]) cls.ensembles[obj.slug] = obj cls.projects = {} for details in cls.PROJECTS: when = details.pop('when', 0) ensemble = details.pop('ensemble') obj = cls.ensembles[ensemble].projects.create(event_date=now+timedelta(days=when), **details) cls.projects[details['name']] = obj return def login(self, user, passwd): response = self.client.post('/login', {'username': user, 'password': passwd}) self.assertEqual(response.status_code, 302, f"Failed to login as {user}") def authorize(self, model, **kwargs): object = model.objects.get(**kwargs) response = self.client.get(f'{object.get_absolute_url()}?auth={object.auth()}') self.assertEqual(response.status_code, 302) def assertAccess(self, urls): for url, expected in urls.items(): response = self.client.get(url) self.assertEqual(response.status_code == 200, expected, f"Expected {expected} for {url} (status: {response.status_code})") def assertObjectList(self, response, expected, element='name'): self.assertEqual(response.status_code, 200, "No result returned") objects = response.context['object_list'].values_list(element, flat=True) self.assertEqual(list(objects), expected)