Skip to content
Snippets Groups Projects
Commit 35225d46 authored by Jorrit Schaap's avatar Jorrit Schaap
Browse files

TMSS-138: adapted t_tmssapp_specification_permissions to use the common lofar django test setup

parent 0b9d1a09
No related branches found
No related tags found
1 merge request!97Resolve TMSS-138
......@@ -19,107 +19,99 @@
# $Id: $
import unittest
import rest_framework.test
from tmss.tmssapp.populate import populate_choices
from tmss.tmssapp import models
from django.db.utils import IntegrityError
from django.contrib.auth.models import User, Group, Permission, ContentType
from test_utils import assertDataWithUrls, assertUrlList
import uuid
import json
from datetime import datetime
# use this to create timezone-aware datetime objects: from django.utils import timezone
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
client = rest_framework.test.APIClient()
# Do Mandatory setup step:
# use setup/teardown magic for tmss test database, ldap server and django server
# (ignore pycharm unused import statement, python unittests does use at RunTime the tmss_test_environment_unittest_setup module)
from lofar.sas.tmss.test.tmss_test_environment_unittest_setup import *
BASE_URI = '/api'
# import and setup test data creator
from lofar.sas.tmss.test.tmss_test_data_rest import TMSSRESTTestDataCreator
class CycleTest(rest_framework.test.APITransactionTestCase):
reset_sequences = True
from lofar.sas.tmss.tmss.tmssapp import models
def setUp(self):
self.user, _ = User.objects.get_or_create(username='paulus', email='paulus@boskabouter.com')
self.support_group, _ = Group.objects.get_or_create(name='support')
self.support_group.permissions.add(Permission.objects.get(codename='add_cycle'))
# for user-specific permission use e.g.:
# self.user.user_permissions.add(Permission.objects.get(codename='add_cycle'))
from django.contrib.auth.models import User, Group, Permission
from datetime import datetime
import unittest
import requests
self.admin_group, _ = Group.objects.get_or_create(name='admin')
self.admin_group.permissions.add(Permission.objects.get(codename='delete_cycle'))
class CyclePermissionTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, requests.auth.HTTPBasicAuth('paulus', 'pauluspass'))
response = requests.get(cls.test_data_creator.django_api_url, auth=cls.test_data_creator.auth)
client.force_login(self.user)
cls.support_group = Group.objects.create(name='support')
cls.support_group.permissions.add(Permission.objects.get(codename='add_cycle'))
# test data # todo: Jorrit created some factory methods for this, I think, so we should use that after a merge
self.test_data_1 = {"name": 'my_cycle' + str(uuid.uuid4()),
"description": "",
"tags": [],
"start": datetime.utcnow().isoformat(),
"stop": datetime.utcnow().isoformat(),
"number": 1,
"standard_hours": 2,
"expert_hours": 3,
"filler_hours": 4}
cls.admin_group = Group.objects.create(name='admin')
cls.admin_group.permissions.add(Permission.objects.get(codename='delete_cycle'))
# test data
self.test_data_2 = {"name": 'my_cycle' + str(uuid.uuid4()),
"description": "This is my other cycle",
"tags": ['othercycle'],
"start": datetime.utcnow().isoformat(),
"stop": datetime.utcnow().isoformat(),
"number": 4,
"standard_hours": 3,
"expert_hours": 2,
"filler_hours": 1}
def test_Cycle_cannot_be_added_without_group(self):
user = User.objects.get(username='paulus')
user.groups.set([])
def tearDown(self):
client.logout()
# refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching
user = User.objects.get(username='paulus')
def test_Cycle_cannot_be_added_without_group(self):
self.assertFalse(user.has_perm('tmssapp.add_cycle'))
self.user.groups.set([])
self.assertFalse(self.user.has_perm('tmssapp.add_cycle'))
res = client.post('%s/cycle/' % BASE_URI, data=self.test_data_1)
test_data = self.test_data_creator.Cycle()
res = self.test_data_creator.post_data_and_get_response(test_data, '/cycle/')
self.assertEqual(res.status_code, 403)
def test_Cycle_can_be_added_by_support(self):
user = User.objects.get(username='paulus')
user.groups.set([self.support_group])
# refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching
user = User.objects.get(username='paulus')
self.user.groups.set([self.support_group])
self.assertTrue(self.user.has_perm('tmssapp.add_cycle'))
res = client.post('%s/cycle/' % BASE_URI, data=self.test_data_2)
self.assertTrue(user.has_perm('tmssapp.add_cycle'))
test_data = self.test_data_creator.Cycle()
res = self.test_data_creator.post_data_and_get_response(test_data, '/cycle/')
self.assertEqual(res.status_code, 201)
def test_Cycle_cannot_be_deleted_without_group(self):
user = User.objects.get(username='paulus')
user.groups.set([self.support_group]) # can add, cannot delete
self.user.groups.set([])
# refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching
user = User.objects.get(username='paulus')
# add
count = len(models.Cycle.objects.all())
models.Cycle.objects.create(**self.test_data_2)
url = '%s/cycle/%s/' % (BASE_URI, self.test_data_2['name'])
test_data = self.test_data_creator.Cycle()
url = self.test_data_creator.post_data_and_get_url(test_data, '/cycle/')
self.assertEqual(count+1, len(models.Cycle.objects.all()))
# delete
res = client.delete(url)
self.assertEqual(res.status_code, 403)
response = requests.delete(url, auth=self.test_data_creator.auth)
self.assertEqual(response.status_code, 403)
self.assertEqual(count + 1, len(models.Cycle.objects.all()))
def test_Cycle_can_be_deleted_by_admin(self):
user = User.objects.get(username='paulus')
user.groups.set([self.support_group, self.admin_group]) # can add and delete
self.user.groups.set([self.admin_group])
# refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching
user = User.objects.get(username='paulus')
# add
count = len(models.Cycle.objects.all())
models.Cycle.objects.create(**self.test_data_2)
url = '%s/cycle/%s/' % (BASE_URI, self.test_data_2['name'])
test_data = self.test_data_creator.Cycle()
url = self.test_data_creator.post_data_and_get_url(test_data, '/cycle/')
self.assertEqual(count+1, len(models.Cycle.objects.all()))
# delete
res = client.delete(url)
self.assertEqual(res.status_code, 204)
response = requests.delete(url, auth=self.test_data_creator.auth)
self.assertEqual(response.status_code, 204)
self.assertEqual(count, len(models.Cycle.objects.all()))
new_count = len(models.Cycle.objects.all())
if __name__ == "__main__":
unittest.main()
self.assertEqual(count, len(models.Cycle.objects.all()))
\ No newline at end of file
#!/bin/bash
. test_funcs.sh
setup
run_test "$LOFARROOT/lib*/python*/site-packages/lofar/sas/tmss/manage.py test --pattern=t_tmssapp_specification_permissions.py --testrunner=postgres_testrunner.PostgresqlTestRunner"
# Run the unit test
source python-coverage.sh
python_coverage_test "*tmss*" t_tmssapp_specification_permissions.py
......@@ -31,9 +31,13 @@ class TMSSRESTTestDataCreator():
self.django_api_url = django_api_url
self.auth = auth
def post_data_and_get_response(self, data, url_postfix):
"""POST the given data the self.django_api_url+url_postfix, and return the response"""
return requests.post(self.django_api_url + url_postfix, json=data, auth=self.auth)
def post_data_and_get_url(self, data, url_postfix):
"""POST the given data the self.django_api_url+url_postfix, and return the response's url"""
return json.loads(requests.post(self.django_api_url + url_postfix, json=data, auth=self.auth).content.decode('utf-8'))['url']
return json.loads(self.post_data_and_get_response(data, url_postfix).content.decode('utf-8'))['url']
#######################################################
# the methods below can be used to create test data
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment