73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
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 = (
|
|
{'username': 'admin', 'password': 'foobar', 'is_superuser': True, 'is_staff': True},
|
|
{'username': 'homer', 'password': 'maggie'},
|
|
)
|
|
|
|
|
|
ENSEMBLES = (
|
|
{'name': 'The Be Sharps', 'slug': 'be-sharps', 'admins': ['homer']},
|
|
{'name': 'Lisa & the Bleeding Gums', 'slug': 'bleeding-gums'},
|
|
{'name': 'Party Posse'},
|
|
)
|
|
|
|
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.ensembles['be-sharps'].admins.add(cls.users['homer'])
|
|
|
|
cls.projects = {}
|
|
for name, ensemble, when in cls.PROJECTS:
|
|
obj = cls.ensembles[ensemble].projects.create(name=name, event_date=now+timedelta(days=when))
|
|
cls.projects[name] = obj
|
|
|
|
return
|
|
|
|
|
|
cls.now = timezone.now()
|
|
|
|
|
|
cls.ensembles['be-sharps'].admins.add(cls.users['homer'])
|
|
|
|
def login(self, user, passwd):
|
|
response = self.client.post('/login', {'username': user, 'password': passwd})
|
|
print(response.request)
|
|
self.assertRedirects(response, '/projects', msg_prefix=repr(getattr(response.context.get('form'), 'errors', '<no message>')))
|
|
|
|
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) |