From 428099d027b03d5d7730f68c2c2bb66e9d34f7bc Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Mon, 5 Jul 2021 17:23:36 +0200
Subject: [PATCH] TMSS-745: removed initial test for triggers. This endpoint
 does not exist anymore. Added SubmitTriggerTestCase. Added
 test_create_draft_from_all_strategy_templates.

---
 .../test/t_tmssapp_specification_REST_API.py  | 134 ++++++++----------
 1 file changed, 57 insertions(+), 77 deletions(-)

diff --git a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
index d3ab27ad2fd..c490d5f9376 100755
--- a/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
+++ b/SAS/TMSS/backend/test/t_tmssapp_specification_REST_API.py
@@ -30,7 +30,7 @@
 from datetime import datetime
 import unittest
 import logging
-logger = logging.getLogger(__name__)
+logger = logging.getLogger('lofar.'+__name__)
 logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
 
 from lofar.common.test_utils import exit_with_skipped_code_if_skip_integration_tests
@@ -1535,81 +1535,6 @@ class SchedulingUnitDraftTestCase(unittest.TestCase):
         self.assertEqual(response_3['count'], 0)
 
 
-class SchedulingUnitDraftTriggerTestCase(unittest.TestCase):
-    @classmethod
-    def setUpClass(cls) -> None:
-        cls.scheduling_set_url = test_data_creator.post_data_and_get_url(test_data_creator.SchedulingSet(), '/scheduling_set/')
-        cls.template_url = test_data_creator.post_data_and_get_url(test_data_creator.SchedulingUnitTemplate(), '/scheduling_unit_template/')
-
-    def test_scheduling_unit_draft_trigger_list_apiformat(self):
-        r = requests.get(BASE_URL + '/scheduling_unit_draft_trigger/?format=api', auth=AUTH)
-        self.assertEqual(r.status_code, 200)
-        self.assertTrue("Scheduling Unit Draft Trigger List" in r.content.decode('utf8'))
-
-    def test_scheduling_unit_draft_trigger_POST(self):
-        from lofar.common.json_utils import get_default_json_object_for_schema
-        constraints_template = models.SchedulingConstraintsTemplate.objects.get(name="constraints")  # Note: we cannot use the default one because we are missing a checker for that.
-        constraints_template_url = BASE_URL + "/scheduling_constraints_template/%s" % constraints_template.pk
-        constraints_doc = get_default_json_object_for_schema(constraints_template.schema)
-        schedulingunitdraft_test_data = test_data_creator.SchedulingUnitDraft(scheduling_set_url=self.scheduling_set_url, template_url=self.template_url, scheduling_constraints_template_url=constraints_template_url, scheduling_constraints_doc=constraints_doc)
-
-        # POST test trigger, verify and assert that no blueprint is created
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/', schedulingunitdraft_test_data, 201, schedulingunitdraft_test_data)
-        url = r_dict['url']
-        GET_OK_and_assert_equal_expected_response(self, url, schedulingunitdraft_test_data)
-        self.assertEqual(r_dict['scheduling_unit_blueprints'], [])
-
-        # POST actual trigger and assert it is blocked without can_trigger flag on the project...
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/?test=false', schedulingunitdraft_test_data, 403, {})
-
-        # ...but successful when the can_trigger flag is set
-        set_id = GET_and_assert_equal_expected_code(self, self.scheduling_set_url, 200)['id']
-        project = models.Project.objects.get(scheduling_sets__id=set_id)
-        project.can_trigger = True
-        project.save()
-        to_assert = schedulingunitdraft_test_data.copy()
-        to_assert.pop('scheduling_unit_blueprints')  # test data has empty list, exclude from assertion
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/?test=false', schedulingunitdraft_test_data, 201, to_assert)
-        url = r_dict['url']
-        GET_OK_and_assert_equal_expected_response(self, url, to_assert)
-
-        # ...and has blueprints associated
-        self.assertNotEqual(r_dict['scheduling_unit_blueprints'], [])
-
-    def test_scheduling_unit_draft_trigger_PUT_raises_error(self):
-        schedulingunitdraft_test_data = test_data_creator.SchedulingUnitDraft(scheduling_set_url=self.scheduling_set_url, template_url=self.template_url)
-
-        # POST new item, verify
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/', schedulingunitdraft_test_data, 201, schedulingunitdraft_test_data)
-        url = r_dict['id']
-
-        # assert we cannot PUT a new item in its place
-        PUT_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/%s' % id, schedulingunitdraft_test_data, 403, {})
-
-    def test_scheduling_unit_draft_trigger_PATCH_raises_error(self):
-        schedulingunitdraft_test_data = test_data_creator.SchedulingUnitDraft(scheduling_set_url=self.scheduling_set_url, template_url=self.template_url)
-
-        # POST new item
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/', schedulingunitdraft_test_data, 201, schedulingunitdraft_test_data)
-        id = r_dict['id']
-
-        test_patch = {"description": "This is a new and improved description",
-                      "requirements_doc": {"foo": "barbar"}}
-
-        # PATCH item and verify
-        PATCH_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/%s' % id, test_patch, 403, {})
-
-    def test_scheduling_unit_draft_trigger_DELETE(self):
-        schedulingunitdraft_test_data = test_data_creator.SchedulingUnitDraft(scheduling_set_url=self.scheduling_set_url, template_url=self.template_url)
-
-        # POST new item, verify
-        r_dict = POST_and_assert_expected_response(self, BASE_URL + '/scheduling_unit_draft_trigger/', schedulingunitdraft_test_data, 201, schedulingunitdraft_test_data)
-        id = r_dict['id']
-
-        # DELETE and check it's gone
-        with self.assertRaises(AssertionError) as context:
-            DELETE_and_assert_gone(self, BASE_URL + '/scheduling_unit_draft_trigger/%s' % id)
-        self.assertIn('403', str(context.exception))
 
 
 class TaskDraftTestCase(unittest.TestCase):
@@ -3178,6 +3103,34 @@ class CyclePermissionTestCase(unittest.TestCase):
 
 
 class SchedulingUnitObservingStrategyTemplateTestCase(unittest.TestCase):
+    def test_create_draft_from_all_strategy_templates(self):
+        '''Try to create a scheduling_unit_draft for each known strategy template.
+        Check that it is created properly.'''
+        scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data("scheduling set"))
+
+        for strategy_template in models.SchedulingUnitObservingStrategyTemplate.objects.all():
+            logger.info("test_create_draft_from_all_strategy_templates: checking template '%s'", strategy_template.name)
+            with tmss_test_env.create_tmss_client() as client:
+                # check normal creation with all defaults
+                scheduling_unit_draft = client.create_scheduling_unit_draft_from_strategy_template(strategy_template.id, scheduling_set.id)
+                self.assertIsNotNone(scheduling_unit_draft)
+                self.assertEqual(scheduling_set.id, scheduling_unit_draft['scheduling_set_id'])
+                self.assertEqual(strategy_template.id, scheduling_unit_draft['observation_strategy_template_id'])
+
+                # check creation with overrides on top of all defaults
+                overrides = client.get_scheduling_unit_observing_strategy_template_specification_with_just_the_parameters(strategy_template.name, strategy_template.version)
+
+                scheduling_unit_draft = client.create_scheduling_unit_draft_from_strategy_template(strategy_template.id, scheduling_set.id, requirements_doc_overrides=overrides)
+                self.assertIsNotNone(scheduling_unit_draft)
+                self.assertEqual(scheduling_set.id, scheduling_unit_draft['scheduling_set_id'])
+                self.assertEqual(strategy_template.id, scheduling_unit_draft['observation_strategy_template_id'])
+
+                # check that other overrides are forbidden
+                with self.assertRaises(Exception):
+                    overrides = {'foo': 'bar'}
+                    client.create_scheduling_unit_draft_from_strategy_template(strategy_template.id, scheduling_set.id, requirements_doc_overrides=overrides)
+
+
 
     def test_nested_SchedulingUnitObservingStrategyTemplate_are_filtered_according_to_SchedulingSet(self):
 
@@ -3191,6 +3144,34 @@ class SchedulingUnitObservingStrategyTemplateTestCase(unittest.TestCase):
         GET_and_assert_in_expected_response_result_list(self, BASE_URL + '/scheduling_set/%s/scheduling_unit_observing_strategy_template/'
                                                         % scheduling_set.id,  template_test_data, 1)
 
+
+class SubmitTriggerTestCase(unittest.TestCase):
+    def test_submit_trigger_for_all_strategy_templates(self):
+        '''Try to create a scheduling_unit_draft/blueprint for each known strategy template via a trigger submission.'''
+        project = models.Project.objects.create(**Project_test_data(can_trigger=True))
+        scheduling_set = models.SchedulingSet.objects.create(**SchedulingSet_test_data("scheduling set", project=project))
+
+        for strategy_template in models.SchedulingUnitObservingStrategyTemplate.objects.filter(name="UC1 CTC+pipelines").all():
+            with tmss_test_env.create_tmss_client() as client:
+                logger.info("test_submit_trigger_for_all_strategy_templates: checking template '%s'", strategy_template.name)
+                trigger_doc = client.get_trigger_specification_doc_for_scheduling_unit_observing_strategy_template(strategy_template.name, strategy_template.version)
+                trigger_doc['scheduling_set_id'] = scheduling_set.id
+
+                trigger_doc['mode'] = 'test'
+                result = client.submit_trigger(trigger_doc)
+                self.assertIsNotNone(result)
+                self.assertTrue('scheduling_unit_draft' in result['url']) # it's a draft (because the more is "test")
+                self.assertEqual(scheduling_set.id, result['scheduling_set_id'])
+                self.assertEqual(strategy_template.id, result['observation_strategy_template_id'])
+
+                # TODO: fix merging of overrides into spec, and enable check below.
+                # trigger_doc['mode'] = 'run'
+                # result = client.submit_trigger(trigger_doc)
+                # self.assertIsNotNone(result)
+                # self.assertTrue('scheduling_unit_blueprint' in result['url']) # it's a blueprint (because the more is "run")
+                # self.assertEqual('schedulable', result['status'])
+
+
 # todo: move to t_permissions (I tried, but it broke)
 class SystemRolePermissionTestCase(unittest.TestCase):
 
@@ -3381,6 +3362,5 @@ class SystemRolePermissionTestCase(unittest.TestCase):
 
 
 if __name__ == "__main__":
-    logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
     unittest.main()
 
-- 
GitLab