diff --git a/app/interface/tests/__init__.py b/app/interface/tests/__init__.py index e69de29..857bfec 100644 --- a/app/interface/tests/__init__.py +++ b/app/interface/tests/__init__.py @@ -0,0 +1,73 @@ +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', ''))) + + 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) \ No newline at end of file diff --git a/app/interface/tests/test_access.py b/app/interface/tests/test_access.py index 991c266..96cbba2 100644 --- a/app/interface/tests/test_access.py +++ b/app/interface/tests/test_access.py @@ -5,10 +5,21 @@ from django.contrib.auth.models import User from django.utils import timezone from datetime import timedelta -class AccessTestCase(TestCase): +from . import AccessTestCase +class InterfaceAccessTestCase(AccessTestCase): + + PROJECTS = ( + ('Baker St', 'bleeding-gums', -12), + ('Navy Recruitment Day', 'party-posse', 6), + ('Baby on Board', 'be-sharps', 28), + ('Open Mic Night', 'bleeding-gums', 1) + ) + @classmethod - def setUpTestData(cls): + def oldsetUpTestData(cls): + AccessTestCase.setUpTestData() + return admin = User.objects.create_user(username='admin', password='foobar', is_superuser=True, is_staff=True) homer = User.objects.create_user(username='homer', password='maggie') @@ -29,7 +40,7 @@ class AccessTestCase(TestCase): def test_admin_ensembles(self): self.client.post('/login', {'username': 'admin', 'password': 'foobar'}) response = self.client.get('/ensembles') - self.assertObjectList(response, ['Lisa and the Bleeding Gums', 'Party Posse', 'The Be Sharps']) + self.assertObjectList(response, ['The Be Sharps', 'Lisa & the Bleeding Gums', 'Party Posse']) self.assertContains(response, 'Django Admin') def test_admin_ensemble_permissions(self): @@ -38,11 +49,11 @@ class AccessTestCase(TestCase): self.assertTrue(response.context['request'].is_admin) self.assertContains(response, "Add project") self.assertAccess({ - '/ensembles/the-be-sharps': True, + '/ensembles/be-sharps': True, '/ensembles/bleeding-gums': True, '/ensembles/party-posse': True, '/ensembles/unknown': False, - '/ensembles/the-be-sharps/new-project': True, + '/ensembles/be-sharps/new-project': True, }) def test_admin_projects(self): @@ -63,24 +74,24 @@ class AccessTestCase(TestCase): def test_user_ensemble_permissions(self): self.client.post('/login', {'username': 'homer', 'password': 'maggie'}) - response = self.client.get('/ensembles/the-be-sharps') + response = self.client.get('/ensembles/be-sharps') self.assertTrue(response.context['request'].is_admin) self.assertContains(response, "Add project") self.assertContains(response, 'Show all') self.assertAccess({ - '/ensembles/the-be-sharps': True, + '/ensembles/be-sharps': True, '/ensembles/bleeding-gums': False, '/ensembles/party-posse': False, - '/ensembles/the-be-sharps/new-project': True, + '/ensembles/be-sharps/new-project': True, '/ensembles/party-posse/new-project': False, }) self.authorize(models.Ensemble, slug='bleeding-gums') self.assertAccess({ - '/ensembles/the-be-sharps': True, + '/ensembles/be-sharps': True, '/ensembles/bleeding-gums': True, '/ensembles/party-posse': False, - '/ensembles/the-be-sharps/new-project': True, + '/ensembles/be-sharps/new-project': True, '/ensembles/party-posse/new-project': False, }) response = self.client.get('/ensembles/bleeding-gums') @@ -125,7 +136,7 @@ class AccessTestCase(TestCase): self.assertObjectList(response, ['Party Posse']) self.assertAccess({ - '/ensembles/the-be-sharps': False, + '/ensembles/be-sharps': False, '/ensembles/party-posse': True, '/ensembles/bleeding-gums': False, '/ensembles/unknown': False, @@ -136,7 +147,7 @@ class AccessTestCase(TestCase): def test_anon_authorized_project(self): self.authorize(models.Project, pk=4) self.assertObjectList(self.client.get('/projects'), ['Open Mic Night']) - self.assertObjectList(self.client.get('/ensembles'), ['Lisa and the Bleeding Gums']) + self.assertObjectList(self.client.get('/ensembles'), ['Lisa & the Bleeding Gums']) self.assertAccess({ '/projects/4': True, @@ -148,12 +159,12 @@ class AccessTestCase(TestCase): def test_anon_permission_denied(self): self.assertAccess({ '/ensembles': True, - '/ensembles/the-be-sharps': False, + '/ensembles/be-sharps': False, '/ensembles/party-posse': False, '/ensembles/bleeding-gums': False, '/ensembles/unknown': False, }) - + """ def authorize(self, model, **kwargs): object = model.objects.get(**kwargs) response = self.client.get(f'{object.get_absolute_url()}?auth={object.auth()}') @@ -168,7 +179,7 @@ class AccessTestCase(TestCase): self.assertEqual(response.status_code, 200, "No result returned") objects = response.context['object_list'].values_list(element, flat=True) self.assertEqual(list(objects), expected) - + """ """ def test_redirect(self): self.skipTest("No redirect")