-
Jörn Künsemöller authored
TMSS-200: Remove SubtaskInputSelectionTemplate since and use TaskRelationSelectionTemplate instead. Fix test.
Jörn Künsemöller authoredTMSS-200: Remove SubtaskInputSelectionTemplate since and use TaskRelationSelectionTemplate instead. Fix test.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
t_tmssapp_scheduling_django_API.py 15.81 KiB
#!/usr/bin/env python3
# Copyright (C) 2018 ASTRON (Netherlands Institute for Radio Astronomy)
# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands
#
# This file is part of the LOFAR software suite.
# The LOFAR software suite is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# The LOFAR software suite is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>.
# $Id: $
import os
import unittest
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)
# todo: Tags? -> Decide how to deal with them first.
# todo: Immutability of Blueprints on db level?
# Do Mandatory setup:
# use setup/teardown magic for tmss test database
# (ignore pycharm unused import statement, python unittests does use at RunTime the tmss_database_unittest_setup module)
from lofar.sas.tmss.test.tmss_database_unittest_setup import *
from lofar.sas.tmss.test.tmss_test_data_django_models import *
from django.db.utils import IntegrityError
class SubtaskTemplateTest(unittest.TestCase):
def test_SubtaskTemplate_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.SubtaskTemplate.objects.create(**SubtaskTemplate_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_SubtaskTemplate_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.SubtaskTemplate.objects.create(**SubtaskTemplate_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class DataproductSpecificationsTemplateTest(unittest.TestCase):
def test_DataproductSpecificationsTemplate_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.DataproductSpecificationsTemplate.objects.create(**DataproductSpecificationsTemplate_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_DataproductSpecificationsTemplate_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.DataproductSpecificationsTemplate.objects.create(**DataproductSpecificationsTemplate_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class DataproductFeedbackTemplateTest(unittest.TestCase):
# This currently adds nothing on top of the template base class, so nothing new to test here.
pass
class SubtaskOutputTest(unittest.TestCase):
def test_SubtaskOutput_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.SubtaskOutput.objects.create(**SubtaskOutput_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_SubtaskOutput_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.SubtaskOutput.objects.create(**SubtaskOutput_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
def test_SubtaskOutput_prevents_missing_subtask(self):
# setup
test_data = dict(SubtaskOutput_test_data())
test_data['subtask'] = None
# assert
with self.assertRaises(IntegrityError):
models.SubtaskOutput.objects.create(**test_data)
class SubtaskInputTest(unittest.TestCase):
def test_SubtaskInput_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.SubtaskInput.objects.create(**SubtaskInput_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_SubtaskInput_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.SubtaskInput.objects.create(**SubtaskInput_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
def test_SubtaskInput_prevents_missing_subtask(self):
# setup
test_data = dict(SubtaskInput_test_data())
test_data['subtask'] = None
# assert
with self.assertRaises(IntegrityError):
models.SubtaskInput.objects.create(**test_data)
class SubtaskTest(unittest.TestCase):
def test_Subtask_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.Subtask.objects.create(**Subtask_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_Subtask_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.Subtask.objects.create(**Subtask_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
def test_Subtask_prevents_missing_template(self):
# setup
test_data = dict(Subtask_test_data())
test_data['specifications_template'] = None
# assert
with self.assertRaises(IntegrityError):
models.Subtask.objects.create(**test_data)
def test_Subtask_predecessors_and_successors_none(self):
subtask1:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask2:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
self.assertEqual(set(), set(subtask1.predecessors.all()))
self.assertEqual(set(), set(subtask2.predecessors.all()))
self.assertEqual(set(), set(subtask1.successors.all()))
self.assertEqual(set(), set(subtask2.successors.all()))
def test_Subtask_predecessors_and_successors_simple(self):
subtask1:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask2:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
output1 = models.SubtaskOutput.objects.create(subtask=subtask1)
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask2, producer=output1))
self.assertEqual(subtask1, subtask2.predecessors.all()[0])
self.assertEqual(subtask2, subtask1.successors.all()[0])
def test_Subtask_predecessors_and_successors_complex(self):
subtask1:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask2:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask3:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask4:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask5:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
subtask6:models.Subtask = models.Subtask.objects.create(**Subtask_test_data())
# ST1 ---> ST3 ---> ST4
# | |
# ST2 - -> ST5 ---> ST6
output1 = models.SubtaskOutput.objects.create(subtask=subtask1)
output2 = models.SubtaskOutput.objects.create(subtask=subtask2)
output3 = models.SubtaskOutput.objects.create(subtask=subtask3)
output4 = models.SubtaskOutput.objects.create(subtask=subtask4)
output5 = models.SubtaskOutput.objects.create(subtask=subtask5)
output6 = models.SubtaskOutput.objects.create(subtask=subtask6)
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask3, producer=output1))
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask3, producer=output2))
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask4, producer=output3))
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask5, producer=output3))
models.SubtaskInput.objects.create(**SubtaskInput_test_data(subtask=subtask6, producer=output5))
self.assertEqual(set((subtask1, subtask2)), set(subtask3.predecessors.all()))
self.assertEqual(set((subtask4, subtask5)), set(subtask3.successors.all()))
self.assertEqual(set((subtask3,)), set(subtask4.predecessors.all()))
self.assertEqual(set((subtask3,)), set(subtask5.predecessors.all()))
self.assertEqual(set((subtask3,)), set(subtask1.successors.all()))
self.assertEqual(set((subtask3,)), set(subtask2.successors.all()))
self.assertEqual(set(), set(subtask1.predecessors.all()))
self.assertEqual(set(), set(subtask2.predecessors.all()))
self.assertEqual(set(), set(subtask4.successors.all()))
self.assertEqual(set((subtask6,)), set(subtask5.successors.all()))
class DataproductTest(unittest.TestCase):
def test_Dataproduct_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.Dataproduct.objects.create(**Dataproduct_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_Dataproduct_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.Dataproduct.objects.create(**Dataproduct_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
def test_Dataproduct_prevents_missing_specifications_template(self):
# setup
test_data = dict(Dataproduct_test_data())
test_data['specifications_template'] = None
# assert
with self.assertRaises(IntegrityError):
models.Dataproduct.objects.create(**test_data)
class AntennaSetTest(unittest.TestCase):
def test_AntennaSet_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.AntennaSet.objects.create(**AntennaSet_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_AntennaSet_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.AntennaSet.objects.create(**AntennaSet_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class DataproductTransformTest(unittest.TestCase):
def test_DataproductTransform_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.DataproductTransform.objects.create(**DataproductTransform_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_DataproductTransform_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.DataproductTransform.objects.create(**DataproductTransform_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class FilesystemTest(unittest.TestCase):
def test_Filesystem_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.Filesystem.objects.create(**Filesystem_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_Filesystem_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.Filesystem.objects.create(**Filesystem_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class ClusterTest(unittest.TestCase):
def test_Cluster_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.Cluster.objects.create(**Cluster_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_Cluster_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.Cluster.objects.create(**Cluster_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class DataproductArchiveInfoTest(unittest.TestCase):
def test_DataproductArchiveInfo_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.DataproductArchiveInfo.objects.create(**DataproductArchiveInfo_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_DataproductArchiveInfo_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.DataproductArchiveInfo.objects.create(**DataproductArchiveInfo_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
class DataproductHashTest(unittest.TestCase):
def test_DataproductHash_gets_created_with_correct_creation_timestamp(self):
# setup
before = datetime.utcnow()
entry = models.DataproductHash.objects.create(**DataproductHash_test_data())
after = datetime.utcnow()
# assert
self.assertLess(before, entry.created_at)
self.assertGreater(after, entry.created_at)
def test_DataproductHash_update_timestamp_gets_changed_correctly(self):
# setup
entry = models.DataproductHash.objects.create(**DataproductHash_test_data())
before = datetime.utcnow()
entry.save()
after = datetime.utcnow()
# assert
self.assertLess(before, entry.updated_at)
self.assertGreater(after, entry.updated_at)
if __name__ == "__main__":
os.environ['TZ'] = 'UTC'
unittest.main()