From 35225d46f07785423f1517e737c7f17b9ea26ab6 Mon Sep 17 00:00:00 2001 From: Jorrit Schaap <schaap@astron.nl> Date: Mon, 17 Feb 2020 12:13:19 +0100 Subject: [PATCH] TMSS-138: adapted t_tmssapp_specification_permissions to use the common lofar django test setup --- .../t_tmssapp_specification_permissions.py | 126 ++++++++---------- .../t_tmssapp_specification_permissions.run | 10 +- SAS/TMSS/test/tmss_test_data_rest.py | 6 +- 3 files changed, 67 insertions(+), 75 deletions(-) diff --git a/SAS/TMSS/test/t_tmssapp_specification_permissions.py b/SAS/TMSS/test/t_tmssapp_specification_permissions.py index a9c3644d29c..cc356399963 100644 --- a/SAS/TMSS/test/t_tmssapp_specification_permissions.py +++ b/SAS/TMSS/test/t_tmssapp_specification_permissions.py @@ -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 diff --git a/SAS/TMSS/test/t_tmssapp_specification_permissions.run b/SAS/TMSS/test/t_tmssapp_specification_permissions.run index 0b21a314c4e..7ebd70cc2c2 100755 --- a/SAS/TMSS/test/t_tmssapp_specification_permissions.run +++ b/SAS/TMSS/test/t_tmssapp_specification_permissions.run @@ -1,10 +1,6 @@ #!/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 diff --git a/SAS/TMSS/test/tmss_test_data_rest.py b/SAS/TMSS/test/tmss_test_data_rest.py index 7e747a1230f..8c1a62ae360 100644 --- a/SAS/TMSS/test/tmss_test_data_rest.py +++ b/SAS/TMSS/test/tmss_test_data_rest.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 -- GitLab