comparison Tests/Tests.py @ 509:17a74118d73a

allow the tests to run with more recent LOCAL version of Orthanc (1.11.2 instead of 0.8.6)
author Alain Mazy <am@osimis.io>
date Tue, 14 Mar 2023 10:34:36 +0100
parents ae493446336a
children fb900401be28
comparison
equal deleted inserted replaced
508:ae493446336a 509:17a74118d73a
219 systemInfo = DoGet(_REMOTE, '/system') 219 systemInfo = DoGet(_REMOTE, '/system')
220 if systemInfo["Version"] == "mainline": 220 if systemInfo["Version"] == "mainline":
221 print("Skipping version checks since you're currently in mainline") 221 print("Skipping version checks since you're currently in mainline")
222 return 222 return
223 223
224 self.assertTrue(IsOrthancVersionAbove(_LOCAL, 0, 8, 6)) 224 if not IsOrthancVersionAbove(_LOCAL, 0, 8, 7):
225 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 0, 8, 7)) 225 self.assertTrue(IsOrthancVersionAbove(_LOCAL, 0, 8, 6))
226 self.assertTrue(IsOrthancVersionAbove(_LOCAL, 0, 7, 6)) 226 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 0, 8, 7))
227 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 0, 9, 6)) 227 self.assertTrue(IsOrthancVersionAbove(_LOCAL, 0, 7, 6))
228 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 1, 8, 6)) 228 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 0, 9, 6))
229 self.assertFalse(IsOrthancVersionAbove(_LOCAL, 1, 8, 6))
229 230
230 231
231 def test_upload(self): 232 def test_upload(self):
232 self.assertEqual('0', DoGet(_REMOTE, '/statistics')['TotalDiskSize']) 233 self.assertEqual('0', DoGet(_REMOTE, '/statistics')['TotalDiskSize'])
233 self.assertEqual('0', DoGet(_REMOTE, '/statistics')['TotalUncompressedSize']) 234 self.assertEqual('0', DoGet(_REMOTE, '/statistics')['TotalUncompressedSize'])
2059 for q in DoGet(_REMOTE, '/queries'): 2060 for q in DoGet(_REMOTE, '/queries'):
2060 DoDelete(_REMOTE, '/queries/%s' % q) 2061 DoDelete(_REMOTE, '/queries/%s' % q)
2061 2062
2062 self.assertEqual(0, len(DoGet(_REMOTE, '/patients'))) 2063 self.assertEqual(0, len(DoGet(_REMOTE, '/patients')))
2063 self.assertEqual(0, len(DoGet(_REMOTE, '/queries'))) 2064 self.assertEqual(0, len(DoGet(_REMOTE, '/queries')))
2064 a = DoPost(_REMOTE, '/modalities/orthanctest/query', { 'Level' : 'Series', 2065
2065 'Query' : { 2066 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # TODO: check why this works with 0.8.6 and not with more recent versions
2066 'PatientName' : '*NE*', 2067 a = DoPost(_REMOTE, '/modalities/orthanctest/query', { 'Level' : 'Series',
2067 'StudyDate' : '*', 2068 'Query' : {
2068 }})['ID'] 2069 'PatientName' : '*NE*',
2069 self.assertEqual(1, len(DoGet(_REMOTE, '/queries'))) 2070 'StudyDate' : '*',
2070 2071 }})['ID']
2071 b = DoGet(_REMOTE, '/queries/%s' % a) 2072 self.assertEqual(1, len(DoGet(_REMOTE, '/queries')))
2072 self.assertTrue('answers' in b) 2073
2073 self.assertTrue('level' in b) 2074 b = DoGet(_REMOTE, '/queries/%s' % a)
2074 self.assertTrue('modality' in b) 2075 self.assertTrue('answers' in b)
2075 self.assertTrue('query' in b) 2076 self.assertTrue('level' in b)
2076 self.assertTrue('retrieve' in b) 2077 self.assertTrue('modality' in b)
2077 self.assertEqual('Series', DoGet(_REMOTE, '/queries/%s/level' % a)) 2078 self.assertTrue('query' in b)
2078 self.assertEqual('orthanctest', DoGet(_REMOTE, '/queries/%s/modality' % a)) 2079 self.assertTrue('retrieve' in b)
2079 2080 self.assertEqual('Series', DoGet(_REMOTE, '/queries/%s/level' % a))
2080 q = DoGet(_REMOTE, '/queries/%s/query?simplify' % a) 2081 self.assertEqual('orthanctest', DoGet(_REMOTE, '/queries/%s/modality' % a))
2081 self.assertEqual(2, len(q)) 2082
2082 self.assertTrue('PatientName' in q) 2083 q = DoGet(_REMOTE, '/queries/%s/query?simplify' % a)
2083 self.assertTrue('StudyDate' in q) 2084 self.assertEqual(2, len(q))
2084 self.assertEqual('*NE*', q['PatientName']) 2085 self.assertTrue('PatientName' in q)
2085 self.assertEqual('*', q['StudyDate']) 2086 self.assertTrue('StudyDate' in q)
2086 2087 self.assertEqual('*NE*', q['PatientName'])
2087 self.assertEqual(2, len(DoGet(_REMOTE, '/queries/%s/answers' % a))) 2088 self.assertEqual('*', q['StudyDate'])
2088 2089
2089 s = DoGet(_REMOTE, '/queries/%s/answers/0' % a) 2090 self.assertEqual(2, len(DoGet(_REMOTE, '/queries/%s/answers' % a)))
2090 self.assertTrue('content' in s) 2091
2091 self.assertTrue('retrieve' in s) 2092 s = DoGet(_REMOTE, '/queries/%s/answers/0' % a)
2092 2093 self.assertTrue('content' in s)
2093 s = DoGet(_REMOTE, '/queries/%s/answers/0/content?simplify' % a) 2094 self.assertTrue('retrieve' in s)
2094 self.assertEqual('887', s['PatientID']) 2095
2095 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', s['StudyInstanceUID']) 2096 s = DoGet(_REMOTE, '/queries/%s/answers/0/content?simplify' % a)
2096 2097 self.assertEqual('887', s['PatientID'])
2097 self.assertEqual(0, len(DoGet(_REMOTE, '/patients'))) 2098 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', s['StudyInstanceUID'])
2098 DoPost(_REMOTE, '/queries/%s/answers/0/retrieve' % a, 'ORTHANC') 2099
2099 self.assertEqual(1, len(DoGet(_REMOTE, '/patients'))) 2100 self.assertEqual(0, len(DoGet(_REMOTE, '/patients')))
2100 self.assertEqual(1, len(DoGet(_REMOTE, '/studies'))) 2101 DoPost(_REMOTE, '/queries/%s/answers/0/retrieve' % a, 'ORTHANC')
2101 self.assertEqual(1, len(DoGet(_REMOTE, '/series'))) 2102 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
2102 self.assertEqual(2, len(DoGet(_REMOTE, '/instances'))) 2103 self.assertEqual(1, len(DoGet(_REMOTE, '/studies')))
2103 2104 self.assertEqual(1, len(DoGet(_REMOTE, '/series')))
2104 DoPost(_REMOTE, '/queries/%s/answers/1/retrieve' % a, 'ORTHANC', 'application/json') # make sure the issue #36 is fixed (query/retrieve Rest API: /retrieve route shall accept application/json content type) 2105 self.assertEqual(2, len(DoGet(_REMOTE, '/instances')))
2105 self.assertEqual(1, len(DoGet(_REMOTE, '/patients'))) 2106
2106 self.assertEqual(1, len(DoGet(_REMOTE, '/studies'))) 2107 DoPost(_REMOTE, '/queries/%s/answers/1/retrieve' % a, 'ORTHANC', 'application/json') # make sure the issue #36 is fixed (query/retrieve Rest API: /retrieve route shall accept application/json content type)
2107 self.assertEqual(2, len(DoGet(_REMOTE, '/series'))) 2108 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
2108 self.assertEqual(4, len(DoGet(_REMOTE, '/instances'))) 2109 self.assertEqual(1, len(DoGet(_REMOTE, '/studies')))
2109 2110 self.assertEqual(2, len(DoGet(_REMOTE, '/series')))
2110 # New in Orthanc 1.4.3 2111 self.assertEqual(4, len(DoGet(_REMOTE, '/instances')))
2111 s = DoGet(_REMOTE, '/queries/%s/answers?expand&simplify' % a) 2112
2112 self.assertEqual(2, len(s)) 2113 # New in Orthanc 1.4.3
2113 for i in range(2): 2114 s = DoGet(_REMOTE, '/queries/%s/answers?expand&simplify' % a)
2114 self.assertEqual('SERIES', s[i]['QueryRetrieveLevel']) 2115 self.assertEqual(2, len(s))
2115 self.assertEqual('887', s[i]['PatientID']) 2116 for i in range(2):
2116 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', s[i]['StudyInstanceUID']) 2117 self.assertEqual('SERIES', s[i]['QueryRetrieveLevel'])
2117 2118 self.assertEqual('887', s[i]['PatientID'])
2118 DoDelete(_REMOTE, '/queries/%s' % a) 2119 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', s[i]['StudyInstanceUID'])
2119 self.assertEqual(0, len(DoGet(_REMOTE, '/queries'))) 2120
2121 DoDelete(_REMOTE, '/queries/%s' % a)
2122 self.assertEqual(0, len(DoGet(_REMOTE, '/queries')))
2120 2123
2121 2124
2122 def test_parent(self): 2125 def test_parent(self):
2123 u = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID'] 2126 u = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
2124 patient = '6816cb19-844d5aee-85245eba-28e841e6-2414fae2' 2127 patient = '6816cb19-844d5aee-85245eba-28e841e6-2414fae2'
5953 self.assertRaises(Exception, lambda: 5956 self.assertRaises(Exception, lambda:
5954 DoPost(_REMOTE, '/storage-commitment/%s/remove' % transaction)) 5957 DoPost(_REMOTE, '/storage-commitment/%s/remove' % transaction))
5955 5958
5956 5959
5957 # Against Orthanc 0.8.6, that does not support storage commitment 5960 # Against Orthanc 0.8.6, that does not support storage commitment
5958 self.assertRaises(Exception, lambda: 5961 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # don't know which specific version the behaviour changed but this fails with 0.8.6
5959 DoPost(_REMOTE, '/modalities/orthanctest/storage-commitment', { 5962 self.assertRaises(Exception, lambda:
5960 "DicomInstances" : [ 5963 DoPost(_REMOTE, '/modalities/orthanctest/storage-commitment', {
5961 [ sopClassUid, sopInstanceUid ], 5964 "DicomInstances" : [
5962 ] 5965 [ sopClassUid, sopInstanceUid ],
5963 })) 5966 ]
5967 }))
5964 5968
5965 5969
5966 5970
5967 def test_storage_commitment_store(self): 5971 def test_storage_commitment_store(self):
5968 # Storage commitment is available since Orthanc 1.6.0 5972 # Storage commitment is available since Orthanc 1.6.0
5978 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID'] 5982 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
5979 self.assertEqual(1, len(DoGet(_REMOTE, '/instances'))) 5983 self.assertEqual(1, len(DoGet(_REMOTE, '/instances')))
5980 self.assertEqual(0, len(DoGet(_LOCAL, '/instances'))) 5984 self.assertEqual(0, len(DoGet(_LOCAL, '/instances')))
5981 5985
5982 # The Orthanc 0.8.6 from "_LOCAL" does not support storage commitment 5986 # The Orthanc 0.8.6 from "_LOCAL" does not support storage commitment
5983 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/modalities/orthanctest/store', { 5987 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # don't know which specific version the behaviour changed but this fails with 0.8.6
5984 'Resources' : [ i ], 5988 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/modalities/orthanctest/store', {
5985 'StorageCommitment' : True, 5989 'Resources' : [ i ],
5986 })) 5990 'StorageCommitment' : True,
5991 }))
5987 5992
5988 j = DoPost(_REMOTE, '/modalities/orthanctest/store', { 5993 j = DoPost(_REMOTE, '/modalities/orthanctest/store', {
5989 'Resources' : [ i ], 5994 'Resources' : [ i ],
5990 'StorageCommitment' : False, 5995 'StorageCommitment' : False,
5991 }) 5996 })
6054 j = DoGet(_LOCAL, '/instances') 6059 j = DoGet(_LOCAL, '/instances')
6055 self.assertEqual(1, len(j)) 6060 self.assertEqual(1, len(j))
6056 uncompressedSize = len(DoGet(_LOCAL, '/instances/%s/file' % j[0])) 6061 uncompressedSize = len(DoGet(_LOCAL, '/instances/%s/file' % j[0]))
6057 self.assertTrue(uncompressedSize > rleSize / 2) 6062 self.assertTrue(uncompressedSize > rleSize / 2)
6058 6063
6059 # Export, with transcoding disabled => this fails 6064 # Export, with transcoding disabled => this fails with 0.8.6 but not with more recent versions
6060 params['AllowTranscoding'] = False 6065 params['AllowTranscoding'] = False
6061 DoPut(_REMOTE, '/modalities/toto', params) 6066 DoPut(_REMOTE, '/modalities/toto', params)
6062 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/modalities/toto/store', str(i), 'text/plain')) 6067 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # don't know which specific version the behaviour changed but this fails with 0.8.6
6068 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/modalities/toto/store', str(i), 'text/plain'))
6069 else:
6070 DoPost(_REMOTE, '/modalities/toto/store', str(i), 'text/plain')
6063 DoDelete(_REMOTE, '/modalities/toto') 6071 DoDelete(_REMOTE, '/modalities/toto')
6064 6072
6065 6073
6066 def test_bitbucket_issue_169(self): 6074 def test_bitbucket_issue_169(self):
6067 with open(GetDatabasePath('Issue169.dcm.bz2'), 'rb') as f: 6075 with open(GetDatabasePath('Issue169.dcm.bz2'), 'rb') as f:
6778 self.assertEqual(str(sourceSize), job['Content']['Size']) 6786 self.assertEqual(str(sourceSize), job['Content']['Size'])
6779 6787
6780 self.assertEqual(1, len(DoGet(_LOCAL, '/instances'))) 6788 self.assertEqual(1, len(DoGet(_LOCAL, '/instances')))
6781 DropOrthanc(_LOCAL) 6789 DropOrthanc(_LOCAL)
6782 6790
6783 # Sending to the local Orthanc 0.8.6 server, with compression: 6791 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # don't know which specific version the behaviour changed but this fails with 0.8.6
6784 # Not supported by Orthanc 0.8.6 => failure 6792 # Sending to the local Orthanc 0.8.6 server, with compression:
6785 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/peers/peer/store', { 6793 # Not supported by Orthanc 0.8.6 => failure
6786 'Resources' : [ i ], 6794 self.assertRaises(Exception, lambda: DoPost(_REMOTE, '/peers/peer/store', {
6787 'Compress' : True,
6788 }))
6789 self.assertEqual(0, len(DoGet(_LOCAL, '/instances')))
6790
6791 # Sending to the tested remote server, with compression: OK
6792 jobId = MonitorJob2(_REMOTE, lambda: DoPost(
6793 _REMOTE, '/peers/self/store', {
6794 'Resources' : [ i ], 6795 'Resources' : [ i ],
6795 'Compress' : True, 6796 'Compress' : True,
6796 'Synchronous' : False,
6797 })) 6797 }))
6798 6798 self.assertEqual(0, len(DoGet(_LOCAL, '/instances')))
6799 job = DoGet(_REMOTE, '/jobs/%s' % jobId) 6799
6800 self.assertTrue(job['Content']['Compress']) 6800 # Sending to the tested remote server, with compression: OK
6801 6801 jobId = MonitorJob2(_REMOTE, lambda: DoPost(
6802 # Compression must have divided the size of the sent data at least twice 6802 _REMOTE, '/peers/self/store', {
6803 self.assertLess(int(job['Content']['Size']), sourceSize / 2) 6803 'Resources' : [ i ],
6804 'Compress' : True,
6805 'Synchronous' : False,
6806 }))
6807
6808 job = DoGet(_REMOTE, '/jobs/%s' % jobId)
6809 self.assertTrue(job['Content']['Compress'])
6810
6811 # Compression must have divided the size of the sent data at least twice
6812 self.assertLess(int(job['Content']['Size']), sourceSize / 2)
6804 6813
6805 6814
6806 def test_move_ambra(self): 6815 def test_move_ambra(self):
6807 # "Orthanc + Ambra: Query/Retrieve" (2020-08-25) 6816 # "Orthanc + Ambra: Query/Retrieve" (2020-08-25)
6808 # https://groups.google.com/g/orthanc-users/c/yIUnZ9v9-Zs/m/GQPXiAOiCQAJ 6817 # https://groups.google.com/g/orthanc-users/c/yIUnZ9v9-Zs/m/GQPXiAOiCQAJ
7125 def test_peer_store_straight(self): 7134 def test_peer_store_straight(self):
7126 self.assertEqual(0, len(DoGet(_LOCAL, '/exports')['Exports'])) 7135 self.assertEqual(0, len(DoGet(_LOCAL, '/exports')['Exports']))
7127 self.assertEqual(0, len(DoGet(_REMOTE, '/exports')['Exports'])) 7136 self.assertEqual(0, len(DoGet(_REMOTE, '/exports')['Exports']))
7128 7137
7129 peer = DoGet(_REMOTE, '/peers/peer/system') 7138 peer = DoGet(_REMOTE, '/peers/peer/system')
7130 self.assertEqual(3, len(peer)) 7139 if not IsOrthancVersionAbove(_LOCAL, 0, 8, 6):
7131 self.assertEqual(5, peer['DatabaseVersion']) 7140 self.assertEqual(3, len(peer))
7132 self.assertEqual('MyOrthanc', peer['Name']) 7141 self.assertEqual(5, peer['DatabaseVersion'])
7133 self.assertEqual('0.8.6', peer['Version']) 7142 self.assertEqual('MyOrthanc', peer['Name'])
7143 self.assertEqual('0.8.6', peer['Version'])
7134 7144
7135 with open(GetDatabasePath('DummyCT.dcm'), 'rb') as f: 7145 with open(GetDatabasePath('DummyCT.dcm'), 'rb') as f:
7136 j = DoPost(_REMOTE, '/peers/peer/store-straight', f.read(), 'application/dicom') 7146 j = DoPost(_REMOTE, '/peers/peer/store-straight', f.read(), 'application/dicom')
7137 7147
7138 # Remote server is Orthanc 0.8.6, thus "ParentPatient", 7148 # Remote server is Orthanc 0.8.6, thus "ParentPatient",
7139 # "ParentStudy", "ParentSeries" are not reported 7149 # "ParentStudy", "ParentSeries" are not reported
7140 self.assertEqual(3, len(j)) 7150 if not IsOrthancVersionAbove(_LOCAL, 1, 11, 2): # don't know which specific version the behaviour changed but this fails with 0.8.6
7151 self.assertEqual(3, len(j))
7152 else:
7153 self.assertEqual(6, len(j))
7141 self.assertEqual('66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', j['ID']) 7154 self.assertEqual('66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', j['ID'])
7142 self.assertEqual('/instances/66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', j['Path']) 7155 self.assertEqual('/instances/66a662ce-7430e543-bad44d47-0dc5a943-ec7a538d', j['Path'])
7143 self.assertEqual('Success', j['Status']) 7156 self.assertEqual('Success', j['Status'])
7144 7157
7145 self.assertEqual(1, len(DoGet(_LOCAL, '/patients'))) 7158 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))