comparison Tests/Tests.py @ 13:7b69a561f4d3

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 18 Jun 2015 16:22:44 +0200
parents 15c166240dfb
children ed9a9fe66002
comparison
equal deleted inserted replaced
12:15c166240dfb 13:7b69a561f4d3
18 18
19 import unittest 19 import unittest
20 20
21 from PIL import ImageChops 21 from PIL import ImageChops
22 from Toolbox import * 22 from Toolbox import *
23 from xml.dom import minidom
23 24
24 _LOCAL = None 25 _LOCAL = None
25 _REMOTE = None 26 _REMOTE = None
26 27
27 28
736 self.assertEqual("RGB", im.mode) 737 self.assertEqual("RGB", im.mode)
737 self.assertEqual(41, im.size[0]) 738 self.assertEqual(41, im.size[0])
738 self.assertEqual(41, im.size[1]) 739 self.assertEqual(41, im.size[1])
739 740
740 # http://effbot.org/zone/pil-comparing-images.htm 741 # http://effbot.org/zone/pil-comparing-images.htm
741 truth = Image.open(os.path.join(os.path.dirname(__file__), '..', 'Database', 'ColorTestMalaterre.png')) 742 truth = Image.open(GetDatabasePath('ColorTestMalaterre.png'))
742 self.assertTrue(ImageChops.difference(im, truth).getbbox() is None) 743 self.assertTrue(ImageChops.difference(im, truth).getbbox() is None)
743 744
744 745
745 def test_faking_ruby_put(self): 746 def test_faking_ruby_put(self):
746 UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm') 747 UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm')
828 self.assertEqual('hello', DoGet(_REMOTE, '/patients/%s/metadata/5555' % p)) 829 self.assertEqual('hello', DoGet(_REMOTE, '/patients/%s/metadata/5555' % p))
829 DoDelete(_REMOTE, '/patients/%s/metadata/5555' % p) 830 DoDelete(_REMOTE, '/patients/%s/metadata/5555' % p)
830 m = DoGet(_REMOTE, '/patients/%s/metadata' % p) 831 m = DoGet(_REMOTE, '/patients/%s/metadata' % p)
831 self.assertEqual(1, len(m)) 832 self.assertEqual(1, len(m))
832 self.assertTrue('LastUpdate' in m) 833 self.assertTrue('LastUpdate' in m)
834
835
836 def test_statistics(self):
837 # Upload 16 instances
838 for i in range(4):
839 UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-000%d.dcm' % (i + 1))
840 UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-000%d.dcm' % (i + 1))
841 UploadInstance(_REMOTE, 'Knee/T1/IM-0001-000%d.dcm' % (i + 1))
842 UploadInstance(_REMOTE, 'Knee/T2/IM-0001-000%d.dcm' % (i + 1))
843
844 s = DoGet(_REMOTE, '/statistics')
845 self.assertEqual(16, s['CountInstances'])
846 self.assertEqual(2, s['CountPatients'])
847 self.assertEqual(2, s['CountStudies'])
848 self.assertEqual(4, s['CountSeries'])
849 d = int(s['TotalUncompressedSize'])
850
851 e = 0
852 for patient in DoGet(_REMOTE, '/patients'):
853 s = DoGet(_REMOTE, '/patients/%s/statistics' % patient)
854 self.assertEqual(8, s['CountInstances'])
855 self.assertEqual(1, s['CountStudies'])
856 self.assertEqual(2, s['CountSeries'])
857 e += int(s['UncompressedSize'])
858
859 for study in DoGet(_REMOTE, '/studies'):
860 s = DoGet(_REMOTE, '/studies/%s/statistics' % study)
861 self.assertEqual(8, s['CountInstances'])
862 self.assertEqual(2, s['CountSeries'])
863 e += int(s['UncompressedSize'])
864
865 for series in DoGet(_REMOTE, '/series'):
866 s = DoGet(_REMOTE, '/series/%s/statistics' % series)
867 self.assertEqual(4, s['CountInstances'])
868 e += int(s['UncompressedSize'])
869
870 self.assertEqual(3 * d, e)
871
872
873 def test_custom_attachment(self):
874 UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-0001.dcm')
875 patient = DoGet(_REMOTE, '/patients')[0]
876 instance = DoGet(_REMOTE, '/instances')[0]
877 size = int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize'])
878 self.assertEqual(size, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
879
880 self.assertEqual(0, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient)))
881 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
882 self.assertTrue('dicom' in DoGet(_REMOTE, '/instances/%s/attachments' % instance))
883 self.assertTrue('dicom-as-json' in DoGet(_REMOTE, '/instances/%s/attachments' % instance))
884
885 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/patients/%s/attachments/22' % patient, 'hello'))
886 hello = 'hellohellohellohellohellohellohellohellohello'
887 DoPut(_REMOTE, '/patients/%s/attachments/1025' % patient, hello)
888 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
889 int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
890 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
891 size + int(DoGet(_REMOTE, '/patients/%s/attachments/1025/compressed-size' % patient)))
892
893 DoPut(_REMOTE, '/patients/%s/attachments/1026' % patient, 'world')
894 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
895 int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
896 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
897 size +
898 int(DoGet(_REMOTE, '/patients/%s/attachments/1025/compressed-size' % patient)) +
899 int(DoGet(_REMOTE, '/patients/%s/attachments/1026/compressed-size' % patient)))
900
901 self.assertEqual(2, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient)))
902 self.assertEqual(hello, DoGet(_REMOTE, '/patients/%s/attachments/1025/data' % patient))
903 self.assertEqual('world', DoGet(_REMOTE, '/patients/%s/attachments/1026/data' % patient))
904 DoPost(_REMOTE, '/patients/%s/attachments/1025/verify-md5' % patient)
905 DoPost(_REMOTE, '/patients/%s/attachments/1026/verify-md5' % patient)
906 DoPut(_REMOTE, '/patients/%s/attachments/1026' % patient, 'world2')
907 self.assertEqual('world2', DoGet(_REMOTE, '/patients/%s/attachments/1026/data' % patient))
908
909 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/instances/%s/attachments/dicom' % instance))
910 DoDelete(_REMOTE, '/patients/%s/attachments/1025' % patient)
911 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
912 int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
913 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
914 size + int(DoGet(_REMOTE, '/patients/%s/attachments/1026/compressed-size' % patient)))
915
916 self.assertEqual(1, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient)))
917 DoDelete(_REMOTE, '/patients/%s/attachments/1026' % patient)
918 self.assertEqual(0, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient)))
919
920 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']), size)
921 self.assertEqual(size, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
922
923
924 def test_incoming_storescu(self):
925 self.assertEqual(0, len(DoGet(_REMOTE, '/patients')))
926 subprocess.check_call([ 'storescu', _REMOTE['Server'], str(_REMOTE['DicomPort']),
927 GetDatabasePath('ColorTestImageJ.dcm') ])
928 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
929
930
931 def test_incoming_findscu(self):
932 def CallFindScu(args):
933 p = subprocess.Popen([ 'findscu', '-P', '-aec', _REMOTE['DicomAet'], '-aet', _LOCAL['DicomAet'],
934 _REMOTE['Server'], str(_REMOTE['DicomPort']) ] + args,
935 stderr=subprocess.PIPE)
936 return p.communicate()[1]
937
938 UploadInstance(_REMOTE, 'Multiframe.dcm')
939 UploadInstance(_REMOTE, 'ColorTestImageJ.dcm')
940
941 i = CallFindScu([ '-k', '0008,0052=PATIENT', '-k', '0010,0010' ])
942 patientNames = re.findall('\(0010,0010\).*?\[(.*?)\]', i)
943 self.assertEqual(2, len(patientNames))
944 self.assertTrue('Test Patient BG ' in patientNames)
945 self.assertTrue('Anonymized' in patientNames)
946
947 i = CallFindScu([ '-k', '0008,0052=SERIES', '-k', '0008,0021' ])
948 series = re.findall('\(0008,0021\).*?\[\s*(.*?)\s*\]', i)
949 self.assertEqual(2, len(series))
950 self.assertTrue('20070208' in series)
951 self.assertTrue('19980312' in series)
952
953 i = CallFindScu([ '-k', '0008,0052=SERIES', '-k', 'PatientName=Anonymized' ])
954 series = re.findall('\(0010,0010\).*?\[\s*(.*?)\s*\]', i)
955 self.assertEqual(1, len(series))
956
957 # Test the "CaseSentitivePN" flag (false by default)
958 i = CallFindScu([ '-k', '0008,0052=SERIES', '-k', 'PatientName=anonymized' ])
959 series = re.findall('\(0010,0010\).*?\[\s*(.*?)\s*\]', i)
960 self.assertEqual(1, len(series))
961
962
963 @unittest.skip("This test fails, to fix")
964 def test_incoming_movescu(self):
965 def CallMoveScu(args):
966 subprocess.check_call([ 'movescu',
967 '--move', _LOCAL['DicomAet'], # Target AET (i.e. storescp)
968 '--call', _REMOTE['DicomAet'], # Called AET (i.e. Orthanc)
969 '--aetitle', _LOCAL['DicomAet'], # Calling AET (i.e. storescp)
970 _REMOTE['Server'], str(_REMOTE['DicomPort']) ] + args,
971 stderr=subprocess.PIPE)
972
973 UploadInstance(_REMOTE, 'Multiframe.dcm')
974
975 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
976 #CallMoveScu([ '--patient', '-k', '0008,0052=PATIENT', '-k', 'PatientID=none' ])
977 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
978 CallMoveScu([ '--patient', '-k', '0008,0052=PATIENT', '-k', 'PatientID=12345678' ])
979 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))
980
981
982 def test_findscu(self):
983 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
984 j = UploadInstance(_REMOTE, 'Issue22.dcm')['ID']
985 k = UploadInstance(_REMOTE, 'ColorTestImageJ.dcm')['ID']
986 DoPost(_REMOTE, '/modalities/orthanctest/store', str(i), 'text/plain')
987
988 # Test the "find-patient" level
989 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { })
990 self.assertEqual(1, len(p))
991 self.assertEqual('ozp00SjY2xG', p[0]['PatientID'])
992
993 # Test wildcards constraints. The "LO" value representation
994 # for PatientID is always case-sensitive, but the "PN" for
995 # PatientName might depend on the implementation:
996 # "GenerateConfigurationForTests.py" will force it to be case
997 # insensitive (which was the default until Orthanc 0.8.6).
998 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientName' : 'K*' })
999 self.assertEqual(1, len(p))
1000
1001 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientName' : 'k*' })
1002 self.assertEqual(1, len(p))
1003
1004 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientID' : 'ozp*' })
1005 self.assertEqual(1, len(p))
1006
1007 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientID' : 'o?p*' })
1008 self.assertEqual(1, len(p))
1009
1010 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientID' : '0?q*' })
1011 self.assertEqual(0, len(p))
1012
1013 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientName' : 'B*' })
1014 self.assertEqual(0, len(p))
1015
1016 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientName' : 'b*' })
1017 self.assertEqual(0, len(p))
1018
1019 DoPost(_REMOTE, '/modalities/orthanctest/store', str(j), 'text/plain')
1020 DoPost(_REMOTE, '/modalities/orthanctest/store', str(k), 'text/plain')
1021 DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { })
1022 self.assertEqual(3, len(DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { })))
1023
1024 p = DoPost(_REMOTE, '/modalities/orthanctest/find-patient', { 'PatientName' : 'A*' })
1025 self.assertEqual(2, len(p))
1026
1027 # Test the "find-study" level. This is the instance "ColorTestImageJ.dcm"
1028 s = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ' })
1029 self.assertEqual(1, len(s))
1030 self.assertEqual('20070208', s[0]['StudyDate'])
1031
1032 # Test range searches
1033 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1034 'StudyDate' : '-20070101' })
1035 self.assertEqual(0, len(t))
1036
1037 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1038 'StudyDate' : '20090101-' })
1039 self.assertEqual(0, len(t))
1040
1041 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1042 'StudyDate' : '20070101-' })
1043 self.assertEqual(1, len(t))
1044
1045 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1046 'StudyDate' : '-20090101' })
1047 self.assertEqual(1, len(t))
1048
1049 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1050 'StudyDate' : '20070207-20070207' })
1051 self.assertEqual(0, len(t))
1052
1053 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1054 'StudyDate' : '20070208-20070208' })
1055 self.assertEqual(1, len(t))
1056
1057 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', { 'PatientID' : 'B9uTHKOZ',
1058 'StudyDate' : '20070209-20070209' })
1059 self.assertEqual(0, len(t))
1060
1061 # Test the ModalitiesInStudy tag
1062 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', {
1063 'PatientID' : 'B9uTHKOZ',
1064 'ModalitiesInStudy' : 'US' })
1065 self.assertEqual(0, len(t))
1066
1067 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', {
1068 'PatientID' : 'B9uTHKOZ',
1069 'ModalitiesInStudy' : 'CT' })
1070 self.assertEqual(1, len(t))
1071
1072 t = DoPost(_REMOTE, '/modalities/orthanctest/find-study', {
1073 'PatientID' : 'B9uTHKOZ',
1074 'ModalitiesInStudy' : 'US\\CT' })
1075 self.assertEqual(1, len(t))
1076
1077 # Test the "find-series" level
1078 t = DoPost(_REMOTE, '/modalities/orthanctest/find-series', {
1079 'PatientID' : 'B9uTHKOZ',
1080 'StudyInstanceUID' : s[0]['StudyInstanceUID'] })
1081 self.assertEqual(1, len(t))
1082
1083 # Test "\" separator
1084 t = DoPost(_REMOTE, '/modalities/orthanctest/find-series', {
1085 'PatientID' : 'B9uTHKOZ',
1086 'StudyInstanceUID' : s[0]['StudyInstanceUID'],
1087 'Modality' : 'MR\\CT\\US' })
1088 self.assertEqual(1, len(t))
1089
1090 t = DoPost(_REMOTE, '/modalities/orthanctest/find-series', {
1091 'PatientID' : 'B9uTHKOZ',
1092 'StudyInstanceUID' : s[0]['StudyInstanceUID'],
1093 'Modality' : 'MR\\US' })
1094 self.assertEqual(0, len(t))
1095
1096
1097 def test_update_modalities(self):
1098 try:
1099 DoDelete(_REMOTE, '/modalities/toto')
1100 except:
1101 pass
1102 try:
1103 DoDelete(_REMOTE, '/modalities/tata')
1104 except:
1105 pass
1106 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/toto'))
1107 DoPut(_REMOTE, '/modalities/toto', [ "STORESCP", "localhost", 2000 ])
1108 DoPut(_REMOTE, '/modalities/tata', [ "STORESCP", "localhost", 2000, 'MedInria' ])
1109 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/modalities/toto', [ "STORESCP", "localhost", 2000, 'MedInriaaa' ]))
1110 self.assertTrue('store' in DoGet(_REMOTE, '/modalities/toto'))
1111 self.assertTrue('store' in DoGet(_REMOTE, '/modalities/tata'))
1112 DoDelete(_REMOTE, '/modalities/toto')
1113 DoDelete(_REMOTE, '/modalities/tata')
1114 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/toto'))
1115 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/modalities/tata'))
1116
1117
1118 def test_update_peers(self):
1119 # curl -X PUT http://localhost:8042/peers/toto -d '["http://localhost:8042/"]' -v
1120 try:
1121 DoDelete(_REMOTE, '/peers/toto')
1122 except:
1123 pass
1124 try:
1125 DoDelete(_REMOTE, '/peers/tata')
1126 except:
1127 pass
1128 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/peers/toto'))
1129 DoPut(_REMOTE, '/peers/toto', [ 'http://localhost:8042/' ])
1130 DoPut(_REMOTE, '/peers/tata', [ 'http://localhost:8042/', 'user', 'pass' ])
1131 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/peers/toto', [ 'http://localhost:8042/', 'a' ]))
1132 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/peers/toto', [ 'http://localhost:8042/', 'a', 'b', 'c' ]))
1133 self.assertTrue('store' in DoGet(_REMOTE, '/peers/toto'))
1134 self.assertTrue('store' in DoGet(_REMOTE, '/peers/tata'))
1135 DoDelete(_REMOTE, '/peers/toto')
1136 DoDelete(_REMOTE, '/peers/tata')
1137 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/peers/toto'))
1138 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/peers/tata'))
1139
1140
1141 def test_mesterhazy_modification(self):
1142 # When I modify a series ( eg. curl
1143 # http://localhost:8042/series/uidhere/modify -X POST -d
1144 # '{"Replace":{"SeriesDate":"19990101"}}' ) the modified
1145 # series is added to a new Study, instead of the existing
1146 # Study. Fixed in Orthanc 0.7.5
1147
1148 u = UploadInstance(_REMOTE, 'DummyCT.dcm')
1149 study = 'b9c08539-26f93bde-c81ab0d7-bffaf2cb-a4d0bdd0'
1150 series = 'f2635388-f01d497a-15f7c06b-ad7dba06-c4c599fe'
1151
1152 modified = DoPost(_REMOTE, '/series/%s/modify' % series,
1153 json.dumps({ "Replace" : { "SeriesDate" : "19990101" }}))
1154
1155 self.assertEqual(study, DoGet(_REMOTE, '/series/%s' % modified['ID']) ['ParentStudy'])
1156
1157
1158 def test_create(self):
1159 i = DoPost(_REMOTE, '/tools/create-dicom',
1160 json.dumps({
1161 'PatientName' : 'Jodogne',
1162 'Modality' : 'CT',
1163 'PixelData' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==' # red dot in RGBA
1164 }))
1165
1166 self.assertEqual('Jodogne', DoGet(_REMOTE, '/instances/%s/content/PatientName' % i['ID']).strip())
1167 self.assertEqual('CT', DoGet(_REMOTE, '/instances/%s/content/Modality' % i['ID']).strip())
1168
1169 png = GetImage(_REMOTE, '/instances/%s/preview' % i['ID'])
1170 self.assertEqual((5, 5), png.size)
1171
1172
1173 def test_pilates(self):
1174 # "SCU failed error when accessing orthanc with osirix" by
1175 # Pilates Agentur (Mar 10, 2014 at 9:33 PM)
1176 i = UploadInstance(_REMOTE, 'PilatesArgenturGEUltrasoundOsiriX.dcm')['ID']
1177 self.assertEqual(0, len(DoGet(_LOCAL, '/patients')))
1178 j = DoPost(_REMOTE, '/modalities/orthanctest/store', str(i), 'text/plain')
1179 self.assertEqual(1, len(DoGet(_LOCAL, '/patients')))
1180
1181
1182 def test_shared_tags(self):
1183 a = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm')['ID']
1184 b = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0002.dcm')['ID']
1185 p = DoGet(_REMOTE, '/patients')[0]
1186
1187 self.assertTrue('0010,0010' in DoGet(_REMOTE, '/patients/%s/shared-tags' % p))
1188 self.assertTrue('PatientName' in DoGet(_REMOTE, '/patients/%s/shared-tags?simplify' % p))
1189 self.assertTrue('0008,1030' in DoGet(_REMOTE, '/patients/%s/shared-tags' % p))
1190 self.assertTrue('StudyDescription' in DoGet(_REMOTE, '/patients/%s/shared-tags?simplify' % p))
1191 self.assertTrue('0008,103e' in DoGet(_REMOTE, '/patients/%s/shared-tags' % p))
1192 self.assertTrue('SeriesDescription' in DoGet(_REMOTE, '/patients/%s/shared-tags?simplify' % p))
1193 self.assertFalse('0008,0018' in DoGet(_REMOTE, '/patients/%s/shared-tags' % p))
1194 self.assertFalse('SOPInstanceUID' in DoGet(_REMOTE, '/patients/%s/shared-tags?simplify' % p))
1195
1196 self.assertTrue('0008,0018' in DoGet(_REMOTE, '/instances/%s/tags' % a))
1197 self.assertTrue('SOPInstanceUID' in DoGet(_REMOTE, '/instances/%s/tags?simplify' % a))
1198
1199
1200 def test_modules(self):
1201 a = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm')['ID']
1202 p = DoGet(_REMOTE, '/patients')[0]
1203 s = DoGet(_REMOTE, '/studies')[0]
1204 t = DoGet(_REMOTE, '/series')[0]
1205
1206 self.assertTrue('0010,0010' in DoGet(_REMOTE, '/patients/%s/module' % p))
1207 self.assertTrue('PatientName' in DoGet(_REMOTE, '/patients/%s/module?simplify' % p))
1208 self.assertTrue('0010,0010' in DoGet(_REMOTE, '/studies/%s/module-patient' % p))
1209 self.assertTrue('PatientName' in DoGet(_REMOTE, '/studies/%s/module-patient?simplify' % p))
1210 self.assertTrue('0008,1030' in DoGet(_REMOTE, '/studies/%s/module' % s))
1211 self.assertTrue('StudyDescription' in DoGet(_REMOTE, '/studies/%s/module?simplify' % s))
1212 self.assertTrue('0008,103e' in DoGet(_REMOTE, '/series/%s/module' % p))
1213 self.assertTrue('SeriesDescription' in DoGet(_REMOTE, '/series/%s/module?simplify' % p))
1214 self.assertTrue('0008,0018' in DoGet(_REMOTE, '/instances/%s/module' % a))
1215 self.assertTrue('SOPInstanceUID' in DoGet(_REMOTE, '/instances/%s/module?simplify' % a))
1216
1217
1218 def test_auto_directory(self):
1219 a = UploadInstance(_REMOTE, 'Knee/T1/IM-0001-0001.dcm')['ID']
1220 self.assertTrue('now' in DoGet(_REMOTE, '/tools'))
1221 self.assertTrue('dicom-conformance' in DoGet(_REMOTE, '/tools'))
1222 self.assertTrue(len(DoGet(_REMOTE, '/tools/dicom-conformance')) > 1000)
1223 self.assertTrue('orthanctest' in DoGet(_REMOTE, '/modalities'))
1224 self.assertTrue('echo' in DoGet(_REMOTE, '/modalities/orthanctest'))
1225 self.assertTrue('find' in DoGet(_REMOTE, '/modalities/orthanctest'))
1226 self.assertTrue('find-instance' in DoGet(_REMOTE, '/modalities/orthanctest'))
1227 self.assertTrue('find-patient' in DoGet(_REMOTE, '/modalities/orthanctest'))
1228 self.assertTrue('find-series' in DoGet(_REMOTE, '/modalities/orthanctest'))
1229 self.assertTrue('find-study' in DoGet(_REMOTE, '/modalities/orthanctest'))
1230 self.assertTrue('store' in DoGet(_REMOTE, '/modalities/orthanctest'))
1231 self.assertTrue('store' in DoGet(_REMOTE, '/peers/peer'))
1232 self.assertTrue('matlab' in DoGet(_REMOTE, '/instances/%s/frames/0' % a))
1233 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/tools/nope'))
1234
1235
1236 def test_echo(self):
1237 DoPost(_REMOTE, '/modalities/orthanctest/echo')
1238
1239
1240 def test_xml(self):
1241 json = DoGet(_REMOTE, '/tools', headers = { 'accept' : 'application/json' })
1242 xml = minidom.parseString(DoGet(_REMOTE, '/tools', headers = { 'accept' : 'application/xml' }))
1243 items = xml.getElementsByTagName('root')[0].getElementsByTagName('item')
1244 self.assertEqual(len(items), len(json))
1245
1246 self.assertTrue('dicom-conformance' in json)
1247
1248 ok = False
1249 for i in items:
1250 if i.childNodes[0].data == 'dicom-conformance':
1251 ok = True
1252 self.assertTrue(ok)
1253
1254
1255 def test_issue_16(self):
1256 i = UploadInstance(_REMOTE, 'Issue16.dcm')['ID']
1257 t = DoGet(_REMOTE, '/instances/%s/tags?simplify' % i)['FrameIncrementPointer']
1258 self.assertEqual('0018,1063', t)
1259
1260
1261 def test_issue_22(self):
1262 s = UploadInstance(_REMOTE, 'Issue22.dcm')['ID']
1263 a = [
1264 "f804691f62197040438f4627c6b994f1", # Frame 0
1265 "c69eee9a51eea3e8611e82e578897254",
1266 "315666be83e2d0111c77bc0996d84901",
1267 "3e27aa959d911172c48a1436443c72b1",
1268 "958642c9e7e9d232d3869faff546058c",
1269 "5e7ea8e3e4230cae707d143481355c59",
1270 "eda37f83558d858a596175aed8b2ad47",
1271 "486713bd2895c4ecbe0e97715ac7f80a",
1272 "091ef729eb169e67da8a0faa9631f9a8",
1273 "5aa2b8c7ffe0a483efaa8e12417686ca",
1274 "e2f39e85896fe58876654b94cd0b5013",
1275 "6fd2129e4950abbe1be053bc814d5da8",
1276 "c3331a8ba7a757f3d423735ab7fa81f9",
1277 "746f808582156734dd6b6fdfd3a0b72c",
1278 "8075ea2b227a70c60ea6b7b75a6bb190",
1279 "806b8b3e300c615099c11a5ec23465aa",
1280 "7c836aa298ba6eef96434579af631a11",
1281 "a0357dc9f4f72d73a885c33d7c287446",
1282 "f25ba3be1cc7d7fad95706adc199ea7d",
1283 "8b114c526b8cbed6cad8a3248b7b480c",
1284 "44e6670f127e612a2b4aa60a0d207698",
1285 "b8945f90fe02facf2ace24ca1ecbe0a5",
1286 "95c796c2fa8f59018b15cf2987b1f79b",
1287 "ce0a51ab30224205b44920221dc27351", # Frame 23
1288 ]
1289
1290 self.assertEqual(24, len(DoGet(_REMOTE, '/instances/%s/frames' % s)))
1291 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/instances/%s/frames/24/preview' % s))
1292
1293 for i in range(len(a)):
1294 self.assertEqual(a[i], ComputeMD5(DoGet(_REMOTE, '/instances/%s/frames/%d/preview' % (s, i))))
1295
1296
1297 def test_issue_19(self):
1298 # This is an image with "YBR_FULL" photometric interpretation
1299 # gdcmconv -i /home/jodogne/DICOM/GdcmDatabase/US_DataSet/HDI5000_US/3EAF5E01 -w -o Issue19.dcm
1300
1301 a = UploadInstance(_REMOTE, 'Issue19.dcm')['ID']
1302 i = DoGet(_REMOTE, '/instances/941ad3c8-05d05b88-560459f9-0eae0e20-6cddd533/preview')
1303
1304 # eb5d156c3594497f589158a6c6f3ca51 <=> Unsupported.png
1305 self.assertEqual('eb5d156c3594497f589158a6c6f3ca51', ComputeMD5(i))
1306
1307
1308 def test_issue_37(self):
1309 # Same test for issues 35 and 37. Fixed in Orthanc 0.9.1
1310 u = UploadInstance(_REMOTE, 'Beaufix/IM-0001-0001.dcm')['ID']
1311
1312 a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series',
1313 'CaseSensitive' : True,
1314 'Query' : { 'StationName' : 'SMR4-MP3' }})
1315 self.assertEqual(1, len(a))