diff NewTests/Housekeeper/test_housekeeper.py @ 473:4ee85b016a40

added NewTests framework - only the Housekeeper tests right now
author Alain Mazy <am@osimis.io>
date Sat, 30 Apr 2022 19:38:34 +0200
parents
children 6917a26881ed
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NewTests/Housekeeper/test_housekeeper.py	Sat Apr 30 19:38:34 2022 +0200
@@ -0,0 +1,124 @@
+import unittest
+import time
+from helpers import OrthancTestCase, Helpers
+
+from orthanc_api_client import OrthancApiClient, generate_test_dicom_file
+
+import pathlib
+here = pathlib.Path(__file__).parent.resolve()
+
+
+class TestHousekeeper(OrthancTestCase):
+
+    @classmethod
+    def prepare(cls):
+        print('-------------- preparing TestHousekeeper tests')
+
+        cls.clear_storage(storage_name="housekeeper")
+
+        cls.launch_orthanc_to_prepare_db(
+            config_name="housekeeper_preparation",
+            storage_name="housekeeper",
+            config={
+                "StorageCompression": False,
+                "Housekeeper": {
+                    "Enable": False
+                }
+            },
+            plugins=Helpers.plugins
+        )
+
+        # upload a study and keep track of data before housekeeper runs
+        cls.o.upload_folder(here / "../../Database/Knix/Loc")
+
+        cls.instance_before, cls.series_before, cls.study_before, cls.patient_before = cls.get_infos()
+
+        cls.kill_orthanc()
+
+        # generate config for orthanc-under-tests (change StorageCompression and add ExtraMainDicomTags)
+        config_path = cls.generate_configuration(
+            config_name="housekeeper_under_test",
+            storage_name="housekeeper",
+            config={
+                "StorageCompression": True,
+                "ExtraMainDicomTags": {
+                    "Patient" : ["PatientWeight", "PatientAge"],
+                    "Study": ["NameOfPhysiciansReadingStudy"],
+                    "Series": ["ScanOptions"],
+                    "Instance": ["Rows", "Columns"]
+                },
+                "Housekeeper": {
+                    "Enable": True
+                }
+            },
+            plugins=Helpers.plugins
+        )
+
+        print('-------------- prepared TestHousekeeper tests')
+        if Helpers.break_after_preparation:
+            print(f"++++ It is now time to start your Orthanc under tests with configuration file '{config_path}' +++++")
+            input("Press Enter to continue")
+        else:
+            print('-------------- launching TestHousekeeper tests')
+            cls.launch_orthanc(
+                exe_path=Helpers.orthanc_under_tests_exe,
+                config_path=config_path
+            )
+
+        print('-------------- waiting for orthanc-under-tests to be available')
+        cls.o.wait_started()
+        
+        completed = False
+        while not completed:
+            print('-------------- waiting for housekeeper to finish processing')
+            time.sleep(1)
+            housekeeper_status = cls.o.get_json("/housekeeper/status")
+            completed = (housekeeper_status["LastProcessedConfiguration"]["StorageCompressionEnabled"] == True) \
+                        and (housekeeper_status["LastChangeToProcess"] == housekeeper_status["LastProcessedChange"])
+
+
+    @classmethod
+    def get_infos(cls):
+        instance_id = cls.o.lookup(
+            needle="1.2.840.113619.2.176.2025.1499492.7040.1171286241.704",
+            filter="Instance"
+        )[0]
+
+        instance_info = cls.o.get_json(relative_url=f"/instances/{instance_id}")
+        
+        series_id = instance_info["ParentSeries"]
+        series_info = cls.o.get_json(relative_url=f"/series/{series_id}")
+        
+        study_id = series_info["ParentStudy"]
+        study_info = cls.o.get_json(relative_url=f"/studies/{study_id}")
+
+        patient_id = study_info["ParentPatient"]
+        patient_info = cls.o.get_json(relative_url=f"/patients/{patient_id}")
+
+        return instance_info, series_info, study_info, patient_info
+
+
+
+    def test_before_after_reconstruction(self):
+
+        # make sure it has run once !
+        housekeeper_status = self.o.get_json("/housekeeper/status")
+        self.assertIsNotNone(housekeeper_status["LastTimeStarted"])
+
+        instance_after, series_after, study_after, patient_after = self.get_infos()
+
+        # extra tags were not in DB before reconstruction
+        self.assertNotIn("Rows", self.instance_before["MainDicomTags"])
+        self.assertNotIn("ScanOptions", self.series_before["MainDicomTags"])
+        self.assertNotIn("NameOfPhysiciansReadingStudy", self.study_before["MainDicomTags"])
+        self.assertNotIn("PatientWeight", self.patient_before["MainDicomTags"])
+
+        # extra tags are in  DB after reconstruction
+        self.assertIn("Rows", instance_after["MainDicomTags"])
+        self.assertIn("ScanOptions", series_after["MainDicomTags"])
+        self.assertIn("NameOfPhysiciansReadingStudy", study_after["MainDicomTags"])
+        self.assertIn("PatientWeight", patient_after["MainDicomTags"])
+
+        # storage has been compressed during reconstruction
+        self.assertTrue(self.instance_before["FileSize"] > instance_after["FileSize"]) 
+        self.assertNotEqual(self.instance_before["FileUuid"], instance_after["FileUuid"]) # files ID have changed