Refactored test access (eventually)
This commit is contained in:
parent
f9fa9d5e05
commit
295999eaef
@ -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', '<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)
|
||||
@ -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")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user