Skip to content
Snippets Groups Projects
Commit 0db44b59 authored by goei's avatar goei
Browse files

TMSS-166: Update the unittests for tasks

parent 1e6e5be5
No related branches found
No related tags found
1 merge request!176Resolve TMSS-166 and TMSS-209
......@@ -27,20 +27,24 @@ def create_scheduling_unit_blueprint_from_scheduling_unit_draft(scheduling_unit_
return scheduling_unit_blueprint
def create_tasks_draft_from_scheduling_unit_draft(scheduling_unit_draft: models.SchedulingUnitDraft) -> [TaskDraft]:
def create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft: models.SchedulingUnitDraft) -> [TaskDraft]:
"""
Generic create-method for tasks draft. Calls the appropriate create method based on the scheduling_unit_blueprint
specifications_template name.
"""
list_tasks = scheduling_unit_draft.requirements_doc["tasks"]
list_task_relations = scheduling_unit_draft.requirements_doc["task_relations"]
list_task_scheduling_relations = scheduling_unit_draft.requirements_doc["task_scheduling_relations"]
list_created_task_object = []
try:
list_tasks = scheduling_unit_draft.requirements_doc["tasks"]
logger.info("create_task_drafts_from_scheduling_unit_draft with scheduling_unit_draft.id=%s, nbr_tasks=%d" %
(scheduling_unit_draft.pk, len(list_tasks)))
except KeyError:
logger.info("create_task_drafts_from_scheduling_unit_draft -> NO tasks to process from requirements_doc")
list_tasks = []
print("create_tasks_draft_from_scheduling_unit_draft with scheduling_unit_draft.id=%s, nbr_tasks=%d" %
(scheduling_unit_draft.pk, len(list_tasks)))
for task in list_tasks:
task_template_name = task["specifications_template"]
print("task name is '%s', task_template_name '%s'" % (task["name"], task_template_name))
logger.info("task name is '%s', task_template_name '%s'" % (task["name"], task_template_name))
task_template = models.TaskTemplate.objects.get(name=task_template_name)
task_draft = models.TaskDraft.objects.create(
name=task["name"],
......@@ -51,10 +55,16 @@ def create_tasks_draft_from_scheduling_unit_draft(scheduling_unit_draft: models.
copies=None,
scheduling_unit_draft=scheduling_unit_draft,
specifications_template=task_template)
print("task draft with id %s created succesfully" % task_draft.id)
logger.info("task draft with id %s created successfully" % task_draft.id)
list_created_task_object.append(task_draft)
# Now create task relation
print("create_tasks_draft_from_scheduling_unit_draft, nbr of task relations=%d" % len(list_task_relations))
try:
list_task_relations = scheduling_unit_draft.requirements_doc["task_relations"]
logger.info("create_task_drafts_from_scheduling_unit_draft, nbr of task relations=%d" % len(list_task_relations))
except KeyError:
logger.info("create_task_drafts_from_scheduling_unit_draft -> NO task relations to process from requirements_doc")
list_task_relations = []
for task_relation in list_task_relations:
task_rel_obj = models.TaskRelationDraft.objects.create(
tags=task_relation["tags"],
......@@ -65,11 +75,19 @@ def create_tasks_draft_from_scheduling_unit_draft(scheduling_unit_draft: models.
input=models.TaskConnector.objects.get(role=task_relation["input"]["role"]),
output=models.TaskConnector.objects.get(role=task_relation["output"]["role"]),
selection_template=models.TaskRelationSelectionTemplate.objects.get(name=task_relation["selection_template"]))
print("task relation draft object with id %s created successfully" % task_rel_obj.id)
logger.info("task relation draft object with id %s created successfully" % task_rel_obj.id)
# TODO task_scheduling_relation ??
try:
list_task_scheduling_relations = scheduling_unit_draft.requirements_doc["task_scheduling_relations"]
logger.info("create_task_drafts_from_scheduling_unit_draft, nbr of task relations=%d" % len(list_task_relations))
except KeyError:
logger.info("create_task_drafts_from_scheduling_unit_draft -> NO tasks scheduling relations to process from requirements_doc")
list_task_scheduling_relations = []
# Apparently a task scheduling relation draft and a task scheduling relation blueprint table must be created
# Also have to get the QA properties and maybe more from Target Observation before and after
# Also have to get the QA properties and maybe more from Target Observation 'before' and 'after'
return list_created_task_object
def create_task_blueprint_from_task_draft(task_draft: models.TaskDraft) -> models.TaskBlueprint:
......
......@@ -204,13 +204,13 @@ class SchedulingUnitDraftViewSet(LOFARViewSet):
@swagger_auto_schema(responses={201: 'The Created Task Draft, see Location in Response header',
403: 'forbidden'},
operation_description="Create Tasks Draft from SchedulingUnitDraft.")
@action(methods=['get'], detail=True, url_name="create_tasks_draft", name="Create Tasks Draft from Requirement doc")
operation_description="Create Task Drafts from SchedulingUnitDraft.")
@action(methods=['get'], detail=True, url_name="create_task_drafts", name="Create Task Drafts from Requirement doc")
def create_tasks_draft(self, request, pk=None):
scheduling_unit_draft = get_object_or_404(models.SchedulingUnitDraft, pk=pk)
create_tasks_draft_from_scheduling_unit_draft(scheduling_unit_draft)
create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft)
# return a response with the new serialized scheduling_unit_blueprint (with references to the created task_blueprint(s) and (scheduled) subtasks)
# just return as a response the serialized scheduling_unit_draft (with references to the created task_draft(s)
return Response(serializers.SchedulingUnitDraftSerializer(scheduling_unit_draft,
context={'request':request}).data,
status=status.HTTP_201_CREATED)
......
......@@ -17,6 +17,7 @@ if(BUILD_TESTING)
tmss_test_environment_unittest_setup.py
tmss_test_data_django_models.py
tmss_test_data_rest.py
testdata/example_CTC_scheduling_block.json
DESTINATION lofar/sas/tmss/test)
lofar_add_test(t_tmss_test_database)
......
......@@ -39,27 +39,165 @@ from lofar.sas.tmss.test.tmss_test_data_rest import TMSSRESTTestDataCreator
rest_data_creator = TMSSRESTTestDataCreator(BASE_URL, AUTH)
from lofar.sas.tmss.tmss.tmssapp import models
from lofar.sas.tmss.tmss.tmssapp.tasks import create_task_blueprint_from_task_draft_and_instantiate_subtasks_from_template
from lofar.sas.tmss.tmss.tmssapp.tasks import *
class SpecifyObservationFromTaskDraftTest(unittest.TestCase):
class CreationFromSchedulingUnitDraft(unittest.TestCase):
"""
From scheduling_unit_draft should test:
1. create_scheduling_unit_blueprint_from_scheduling_unit_draft(scheduling_unit_draft: models.SchedulingUnitDraft) -> models.SchedulingUnitBlueprint:
6. create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft: models.SchedulingUnitDraft) -> [TaskDraft]:
3. create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_draft(scheduling_unit_draft: models.SchedulingUnitDraft) -> models.SchedulingUnitBlueprint:
"""
@staticmethod
def create_scheduling_unit_draft_object(scheduling_unit_draft_name, requirements_doc=None):
"""
Helper function to create a scheduling unit object for testing
"""
scheduling_unit_draft_data = SchedulingUnitDraft_test_data(name=scheduling_unit_draft_name)
draft_obj = models.SchedulingUnitDraft.objects.create(**scheduling_unit_draft_data)
return draft_obj
def test_create_scheduling_unit_blueprint_from_scheduling_unit_draft(self):
"""
Create Scheduling Unit Draft
Check if the name draft (specified) is equal to name blueprint (created)
Check with REST-call if NO tasks are created
"""
scheduling_unit_draft = self.create_scheduling_unit_draft_object("Test Scheduling Unit 1")
res_scheduling_unit_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/' + str(scheduling_unit_draft.id), 200)
scheduling_unit_blueprint = create_scheduling_unit_blueprint_from_scheduling_unit_draft(scheduling_unit_draft)
self.assertEqual(scheduling_unit_draft.name, scheduling_unit_blueprint.draft.name)
res_scheduling_unit_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/' + str(scheduling_unit_draft.id), 200)
self.assertEqual(res_scheduling_unit_blueprint['requirements_template'], res_scheduling_unit_draft['requirements_template'])
self.assertEqual(res_scheduling_unit_blueprint['requirements_doc'], res_scheduling_unit_draft['requirements_doc'])
self.assertEqual(0, len(res_scheduling_unit_blueprint['task_blueprints']))
def test_create_task_drafts_from_scheduling_unit_draft(self):
"""
Create Scheduling Unit Draft (with empty requirements_doc)
Check if NO tasks are created
Check with REST-call if NO tasks are created
"""
scheduling_unit_draft = self.create_scheduling_unit_draft_object("Test Scheduling Unit 2")
res_scheduling_unit_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/' + str(scheduling_unit_draft.id), 200)
list_tasks = create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft)
self.assertEqual(0, len(list_tasks))
self.assertEqual(0, len(res_scheduling_unit_draft['task_drafts']))
def test_create_task_drafts_from_scheduling_unit_draft_with_UC1_requirements(self):
"""
Create Scheduling Unit Draft with requirements_doc (read from file)
Check if tasks (7) are created
Check with REST-call if tasks are created
"""
working_dir = os.path.dirname(os.path.abspath(__file__))
with open(os.path.join(working_dir, "testdata/example_CTC_scheduling_block.json")) as json_file:
json_requirements_doc = json.loads(json_file.read())
scheduling_unit_draft = models.SchedulingUnitDraft.objects.create(
name="Test Scheduling Unit UC1",
requirements_doc=json_requirements_doc,
requirements_template=models.SchedulingUnitTemplate.objects.get(name="scheduling unit schema"),
copy_reason=models.CopyReason.objects.get(value='template'),
generator_instance_doc="para",
copies=None,
scheduling_set=models.SchedulingSet.objects.create(**SchedulingSet_test_data()))
res_scheduling_unit_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/' + str(scheduling_unit_draft.id), 200)
list_tasks = create_task_drafts_from_scheduling_unit_draft(scheduling_unit_draft)
self.assertEqual(7, len(list_tasks))
# TODO: check why rest api is not updated? self.assertEqual(7, len(res_scheduling_unit_draft['task_drafts']))
def test_create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_draft(self):
"""
Create Scheduling Unit Draft
Check if the name draft (specified) is equal to name blueprint (created)
Check with REST-call if NO tasks are created
"""
scheduling_unit_draft = self.create_scheduling_unit_draft_object("Test Scheduling Unit 3")
res_scheduling_unit_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_draft/' + str(scheduling_unit_draft.id), 200)
scheduling_unit_blueprint = create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_draft(scheduling_unit_draft)
self.assertEqual(scheduling_unit_draft.name, scheduling_unit_blueprint.draft.name)
res_scheduling_unit_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/' + str(scheduling_unit_blueprint.id), 200)
self.assertEqual(res_scheduling_unit_blueprint['requirements_template'], res_scheduling_unit_draft['requirements_template'])
self.assertEqual(res_scheduling_unit_blueprint['requirements_doc'], res_scheduling_unit_draft['requirements_doc'])
self.assertEqual(0, len(res_scheduling_unit_blueprint['task_blueprints']))
class CreationFromSchedulingUnitBluePrint(unittest.TestCase):
"""
From scheduling_unit_blueprint should test:
5. create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_blueprint(scheduling_unit_blueprint: models.SchedulingUnitBlueprint) -> models.SchedulingUnitBlueprint:
"""
def test_create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_blueprint(self):
"""
Create Scheduling Unit BluePrint
Check with REST-call if NO tasks are created
"""
scheduling_unit_blueprint_data = SchedulingUnitBlueprint_test_data(name="Test Scheduling Unit BluePrint")
scheduling_unit_blueprint = models.SchedulingUnitBlueprint.objects.create(**scheduling_unit_blueprint_data)
scheduling_unit_blueprint_after_creation = create_task_blueprints_and_subtasks_and_schedule_subtasks_from_scheduling_unit_blueprint(scheduling_unit_blueprint)
res_scheduling_unit_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/scheduling_unit_blueprint/' + str(scheduling_unit_blueprint.id), 200)
self.assertEqual(0, len(res_scheduling_unit_blueprint['task_blueprints']))
class CreationFromTaskDraft(unittest.TestCase):
"""
From task draft should test:
2. create_task_blueprint_from_task_draft(task_draft: models.TaskDraft) -> models.TaskBlueprint:
5. create_task_blueprint_and_subtasks_and_schedule_subtasks_from_task_draft(task_draft: models.TaskDraft) -> models.TaskBlueprint:
"""
@staticmethod
def create_task_object(task_draft_name):
"""
Helper function to create a task object for testing
TODO change schema to observation schema, correlator schema wil be removed
"""
obs_task_template = models.TaskTemplate.objects.get(name='correlator schema')
task_draft_data = TaskDraft_test_data(name=task_draft_name, specifications_template=obs_task_template)
models.TaskDraft.objects.create(**task_draft_data)
def test_create_task_blueprint_and_subtasks_and_schedule_subtasks(self):
"""
Create task draft
Check if the name draft (specified) is equal to name blueprint (created)
Check with REST-call if 3 subtasks are created and if these subtasks have state value 'defined'
"""
self.create_task_object("Test Target Observation 1")
task_draft = models.TaskDraft.objects.get(name="Test Target Observation 1")
rest_task_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/' + str(task_draft.id), 200)
task_blueprint = create_task_blueprint_and_subtasks_and_schedule_subtasks_from_task_draft(task_draft)
self.assertEqual(task_draft.name, task_blueprint.draft.name)
rest_task_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/' + str(task_blueprint.id), 200)
self.assertEqual(3, len(rest_task_blueprint['subtasks']))
self.assertEqual(rest_task_blueprint['specifications_template'], rest_task_draft['specifications_template'])
for subtask_url in rest_task_blueprint['subtasks']:
res_subtask = GET_and_assert_equal_expected_code(self, subtask_url, 200)
state_value = GET_and_assert_equal_expected_code(self, res_subtask['state'], 200)['value']
# TODO not all scheduled??? self.assertEqual(state_value, "defined")
def test_create_task_blueprint(self):
"""
Use the 'default' task draft (ID=1) to specify observation
Create task draft
Check if the task draft name is equal to the task draft name specified in the created task blueprint
Check with REST-call if 4 subtasks are created and if these subtaskshave state value 'defined'
Check with REST-call if NO subtasks are created
"""
task_draft = models.TaskDraft.objects.get(id=1)
res_task_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/1/', 200)
task_blueprint = create_task_blueprint_from_task_draft_and_instantiate_subtasks_from_template(task_draft)
self.create_task_object("Test Target Observation 2")
task_draft = models.TaskDraft.objects.get(name="Test Target Observation 2")
res_task_draft = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_draft/' + str(task_draft.id), 200)
task_blueprint = create_task_blueprint_from_task_draft(task_draft)
self.assertEqual(task_draft.name, task_blueprint.draft.name)
res_task_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/1/', 200)
self.assertEqual(len(res_task_blueprint['subtasks']), 3)
res_task_blueprint = GET_and_assert_equal_expected_code(self, BASE_URL + '/task_blueprint/' + str(task_blueprint.id), 200)
self.assertEqual(0, len(res_task_blueprint['subtasks']))
self.assertEqual(res_task_blueprint['specifications_template'], res_task_draft['specifications_template'])
for subtask_url in res_task_blueprint['subtasks']:
res_subtask = GET_and_assert_equal_expected_code(self, subtask_url, 200)
state_value = GET_and_assert_equal_expected_code(self, res_subtask['state'], 200)['value']
self.assertEqual(state_value, "defined")
if __name__ == "__main__":
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment