comparison Tests/Tests.py @ 423:cef3847dc8af

test_query_retrieve_format
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Jun 2021 18:12:48 +0200
parents 07fbbd3a3fac
children 934f505677da
comparison
equal deleted inserted replaced
422:91170313187c 423:cef3847dc8af
177 warnings.simplefilter("ignore", ResourceWarning) 177 warnings.simplefilter("ignore", ResourceWarning)
178 178
179 DropOrthanc(_LOCAL) 179 DropOrthanc(_LOCAL)
180 DropOrthanc(_REMOTE) 180 DropOrthanc(_REMOTE)
181 UninstallLuaCallbacks(_REMOTE) 181 UninstallLuaCallbacks(_REMOTE)
182
183 # Reset stuff possibly set by some integration tests
184 DoPut(_REMOTE, '/tools/default-encoding', 'Latin1')
185 DoPut(_REMOTE, '/tools/accepted-transfer-syntaxes', [ '1.2.840.10008.1.*' ])
186 DoPut(_REMOTE, '/tools/unknown-sop-class-accepted', '0')
187
188 for i in [ 'toto', 'tata' ]:
189 if i in DoGet(_REMOTE, '/modalities'):
190 DoDelete(_REMOTE, '/modalities/%s' % i)
191 if i in DoGet(_REMOTE, '/peers'):
192 DoDelete(_REMOTE, '/peers/%s' % i)
193
182 #print("%s: In test %s" % (datetime.now(), self._testMethodName)) 194 #print("%s: In test %s" % (datetime.now(), self._testMethodName))
183 195
184 def AssertSameImages(self, truth, url): 196 def AssertSameImages(self, truth, url):
185 im = GetImage(_REMOTE, url) 197 im = GetImage(_REMOTE, url)
186 self.assertTrue(CompareLists(truth, im.getdata())) 198 self.assertTrue(CompareLists(truth, im.getdata()))
1540 'Modality' : 'MR\\US' }) 1552 'Modality' : 'MR\\US' })
1541 self.assertEqual(0, len(t)) 1553 self.assertEqual(0, len(t))
1542 1554
1543 1555
1544 def test_update_modalities(self): 1556 def test_update_modalities(self):
1545 try:
1546 DoDelete(_REMOTE, '/modalities/toto')
1547 except:
1548 pass
1549 try:
1550 DoDelete(_REMOTE, '/modalities/tata')
1551 except:
1552 pass
1553 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/toto')) 1557 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/toto'))
1554 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/modalities/toto')) 1558 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/modalities/toto'))
1555 DoPut(_REMOTE, '/modalities/toto', [ "STORESCP", "localhost", 2000 ]) 1559 DoPut(_REMOTE, '/modalities/toto', [ "STORESCP", "localhost", 2000 ])
1556 DoPut(_REMOTE, '/modalities/tata', [ "STORESCP", "localhost", 2000, 'MedInria' ]) # check backward compatiblity with obsolete manufacturer 1560 DoPut(_REMOTE, '/modalities/tata', [ "STORESCP", "localhost", 2000, 'MedInria' ]) # check backward compatiblity with obsolete manufacturer
1557 DoDelete(_REMOTE, '/modalities/tata') 1561 DoDelete(_REMOTE, '/modalities/tata')
1577 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/tata')) 1581 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/tata'))
1578 1582
1579 1583
1580 def test_update_peers(self): 1584 def test_update_peers(self):
1581 # curl -X PUT http://localhost:8042/peers/toto -d '["http://localhost:8042/"]' -v 1585 # curl -X PUT http://localhost:8042/peers/toto -d '["http://localhost:8042/"]' -v
1582 try:
1583 DoDelete(_REMOTE, '/peers/toto')
1584 except:
1585 pass
1586 try:
1587 DoDelete(_REMOTE, '/peers/tata')
1588 except:
1589 pass
1590 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/peers/toto')) 1586 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/peers/toto'))
1591 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/peers/toto')) 1587 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/peers/toto'))
1592 DoPut(_REMOTE, '/peers/toto', [ 'http://localhost:8042/' ]) 1588 DoPut(_REMOTE, '/peers/toto', [ 'http://localhost:8042/' ])
1593 DoPut(_REMOTE, '/peers/tata', { 'Url': 'http://localhost:8042/', 1589 DoPut(_REMOTE, '/peers/tata', { 'Url': 'http://localhost:8042/',
1594 'Username': 'user', 1590 'Username': 'user',
2585 DoDelete(_REMOTE, '/instances/%s' % f) 2581 DoDelete(_REMOTE, '/instances/%s' % f)
2586 f = UploadInstance(_REMOTE, 'Issue32.dcm')['ID'] 2582 f = UploadInstance(_REMOTE, 'Issue32.dcm')['ID']
2587 tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % f) 2583 tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % f)
2588 self.assertNotEqual(u'Рентгенография', tags['SeriesDescription']) 2584 self.assertNotEqual(u'Рентгенография', tags['SeriesDescription'])
2589 2585
2590 # Back to UTF-8
2591 self.assertEqual('Utf8', DoPut(_REMOTE, '/tools/default-encoding', 'Utf8'))
2592
2593 2586
2594 def test_encodings(self): 2587 def test_encodings(self):
2595 # Latin-1 (ISO_IR 100) 2588 # Latin-1 (ISO_IR 100)
2596 brainix = UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-0001.dcm')['ID'] 2589 brainix = UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-0001.dcm')['ID']
2597 tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % brainix) 2590 tags = DoGet(_REMOTE, '/instances/%s/tags?simplify' % brainix)
3642 'Query' : { }}) 3635 'Query' : { }})
3643 self.assertEqual(1, len(a)) 3636 self.assertEqual(1, len(a))
3644 3637
3645 tmp = ENCODINGS[name][1] 3638 tmp = ENCODINGS[name][1]
3646 self.assertEqual(TEST.encode(tmp, 'ignore').decode(tmp), a[0]["PatientMainDicomTags"]["PatientName"]) 3639 self.assertEqual(TEST.encode(tmp, 'ignore').decode(tmp), a[0]["PatientMainDicomTags"]["PatientName"])
3647
3648 # Back to UTF-8
3649 self.assertEqual('Utf8', DoPut(_REMOTE, '/tools/default-encoding', 'Utf8'))
3650 3640
3651 3641
3652 def test_reconstruct(self): 3642 def test_reconstruct(self):
3653 def CompareMainDicomTag(expected, instance, level, tag): 3643 def CompareMainDicomTag(expected, instance, level, tag):
3654 self.assertEqual(expected, DoGet(_REMOTE, '/instances/%s/%s' % (instance, level))['MainDicomTags'][tag].strip()) 3644 self.assertEqual(expected, DoGet(_REMOTE, '/instances/%s/%s' % (instance, level))['MainDicomTags'][tag].strip())
7842 7832
7843 instances = DoGet(_REMOTE, '/instances') 7833 instances = DoGet(_REMOTE, '/instances')
7844 self.assertEqual(2, len(instances)) 7834 self.assertEqual(2, len(instances))
7845 self.assertTrue(brainix in instances) 7835 self.assertTrue(brainix in instances)
7846 self.assertFalse(knee in instances) 7836 self.assertFalse(knee in instances)
7837
7838
7839 def test_query_retrieve_format(self):
7840 # New in Orthanc 1.9.5
7841 # https://groups.google.com/g/orthanc-users/c/1KC4d-0K8s0/m/hfYYz1-tAgAJ
7842 i = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm') ['ID']
7843 study = DoGet(_REMOTE, '/instances/%s/study' % i) ['MainDicomTags']['StudyInstanceUID']
7844
7845 a = DoPost(_REMOTE, '/modalities/self/query', {
7846 'Level' : 'Study',
7847 'Query' : {}
7848 })
7849
7850 b = DoGet(_REMOTE, a['Path'] + '/answers')
7851 self.assertEqual(1, len(b))
7852 self.assertEqual('0', b[0])
7853
7854 b = DoGet(_REMOTE, a['Path'] + '/answers?expand')
7855 self.assertEqual(1, len(b))
7856 self.assertEqual(6, len(b[0]))
7857 self.assertEqual('ISO_IR 100', b[0]['0008,0005']['Value'])
7858 self.assertEqual('SpecificCharacterSet', b[0]['0008,0005']['Name'])
7859 self.assertEqual('A10003245599', b[0]['0008,0050']['Value'])
7860 self.assertEqual('AccessionNumber', b[0]['0008,0050']['Name'])
7861 self.assertEqual('STUDY', b[0]['0008,0052']['Value'])
7862 self.assertEqual('QueryRetrieveLevel', b[0]['0008,0052']['Name'])
7863 self.assertEqual('ORTHANC', b[0]['0008,0054']['Value'])
7864 self.assertEqual('RetrieveAETitle', b[0]['0008,0054']['Name'])
7865 self.assertEqual('887', b[0]['0010,0020']['Value'])
7866 self.assertEqual('PatientID', b[0]['0010,0020']['Name'])
7867 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b[0]['0020,000d']['Value'])
7868 self.assertEqual('StudyInstanceUID', b[0]['0020,000d']['Name'])
7869
7870 for (key, value) in b[0].items():
7871 self.assertEqual('String', value['Type'])
7872
7873 self.assertEqual(json.dumps(b[0]),
7874 json.dumps(DoGet(_REMOTE, a['Path'] + '/answers/0/content')))
7875
7876 # What is below this point didn't work on Orthanc <= 1.9.3
7877
7878 b = DoGet(_REMOTE, a['Path'] + '/answers?expand&short')
7879 self.assertEqual(1, len(b))
7880 self.assertEqual(6, len(b[0]))
7881 self.assertEqual('ISO_IR 100', b[0]['0008,0005'])
7882 self.assertEqual('A10003245599', b[0]['0008,0050'])
7883 self.assertEqual('STUDY', b[0]['0008,0052'])
7884 self.assertEqual('ORTHANC', b[0]['0008,0054'])
7885 self.assertEqual('887', b[0]['0010,0020'])
7886 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b[0]['0020,000d'])
7887 self.assertEqual(json.dumps(b[0]),
7888 json.dumps(DoGet(_REMOTE, a['Path'] + '/answers/0/content?short')))
7889
7890 b = DoGet(_REMOTE, a['Path'] + '/answers?expand&simplify')
7891 self.assertEqual(1, len(b))
7892 self.assertEqual(6, len(b[0]))
7893 self.assertEqual('ISO_IR 100', b[0]['SpecificCharacterSet'])
7894 self.assertEqual('A10003245599', b[0]['AccessionNumber'])
7895 self.assertEqual('STUDY', b[0]['QueryRetrieveLevel'])
7896 self.assertEqual('ORTHANC', b[0]['RetrieveAETitle'])
7897 self.assertEqual('887', b[0]['PatientID'])
7898 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b[0]['StudyInstanceUID'])
7899 self.assertEqual(json.dumps(b[0]),
7900 json.dumps(DoGet(_REMOTE, a['Path'] + '/answers/0/content?simplify')))
7901
7902 b = DoPost(_REMOTE, '/queries/%s/retrieve' % a['ID'], {})
7903 self.assertEqual('REST API', b['Description'])
7904 self.assertEqual('ORTHANC', b['LocalAet'])
7905 self.assertEqual('ORTHANC', b['RemoteAet'])
7906 self.assertEqual(1, len(b['Query']))
7907 self.assertEqual(4, len(b['Query'][0]))
7908 self.assertEqual('A10003245599', b['Query'][0]['0008,0050'])
7909 self.assertEqual('STUDY', b['Query'][0]['0008,0052'])
7910 self.assertEqual('887', b['Query'][0]['0010,0020'])
7911 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b['Query'][0]['0020,000d'])
7912
7913 # What is below this point didn't work on Orthanc <= 1.9.4
7914
7915 b = DoPost(_REMOTE, '/queries/%s/retrieve' % a['ID'], { 'Full' : True })
7916 self.assertEqual('REST API', b['Description'])
7917 self.assertEqual('ORTHANC', b['LocalAet'])
7918 self.assertEqual('ORTHANC', b['RemoteAet'])
7919 self.assertEqual(1, len(b['Query']))
7920 self.assertEqual(4, len(b['Query'][0]))
7921 self.assertEqual('A10003245599', b['Query'][0]['0008,0050']['Value'])
7922 self.assertEqual('STUDY', b['Query'][0]['0008,0052']['Value'])
7923 self.assertEqual('887', b['Query'][0]['0010,0020']['Value'])
7924 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b['Query'][0]['0020,000d']['Value'])
7925 self.assertEqual('AccessionNumber', b['Query'][0]['0008,0050']['Name'])
7926 self.assertEqual('QueryRetrieveLevel', b['Query'][0]['0008,0052']['Name'])
7927 self.assertEqual('PatientID', b['Query'][0]['0010,0020']['Name'])
7928 self.assertEqual('StudyInstanceUID', b['Query'][0]['0020,000d']['Name'])
7929
7930 b = DoPost(_REMOTE, '/queries/%s/retrieve' % a['ID'], { 'Simplify' : True })
7931 self.assertEqual('REST API', b['Description'])
7932 self.assertEqual('ORTHANC', b['LocalAet'])
7933 self.assertEqual('ORTHANC', b['RemoteAet'])
7934 self.assertEqual(1, len(b['Query']))
7935 self.assertEqual(4, len(b['Query'][0]))
7936 self.assertEqual('A10003245599', b['Query'][0]['AccessionNumber'])
7937 self.assertEqual('STUDY', b['Query'][0]['QueryRetrieveLevel'])
7938 self.assertEqual('887', b['Query'][0]['PatientID'])
7939 self.assertEqual('2.16.840.1.113669.632.20.121711.10000160881', b['Query'][0]['StudyInstanceUID'])