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