comparison Tests/Tests.py @ 380:b9adc7d06347

update tests following removal of dicom-as-json attachments
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 16 Feb 2021 12:03:27 +0100
parents 097329b67509
children a8dd562943a7
comparison
equal deleted inserted replaced
379:097329b67509 380:b9adc7d06347
104 '--call', _REMOTE['DicomAet'], # Called AET (i.e. Orthanc) 104 '--call', _REMOTE['DicomAet'], # Called AET (i.e. Orthanc)
105 '--aetitle', _LOCAL['DicomAet'], # Calling AET (i.e. storescp) 105 '--aetitle', _LOCAL['DicomAet'], # Calling AET (i.e. storescp)
106 _REMOTE['Server'], 106 _REMOTE['Server'],
107 str(_REMOTE['DicomPort']) 107 str(_REMOTE['DicomPort'])
108 ] 108 ]
109
110
111 def IsDicomUntilPixelDataStored(orthanc):
112 # This function detects whether the "StorageCompression" option is
113 # "true", OR the storage area does not support read-range
114
115 if IsOrthancVersionAbove(orthanc, 1, 9, 1):
116 i = UploadInstance(orthanc, 'ColorTestMalaterre.dcm') ['ID']
117 a = DoGet(orthanc, '/instances/%s/metadata/PixelDataOffset' % i)
118 if a != 0x03a0:
119 raise Exception('Internal error')
120
121 a = DoGet(orthanc, '/instances/%s/attachments' % i)
122 if len(a) != 1 and len(a) != 2 or not 'dicom' in a:
123 raise Exception('Internal error')
124
125 DoDelete(orthanc, '/instances/%s' % i)
126
127 if len(a) == 1:
128 return False
129 elif 'dicom-until-pixel-data' in a:
130 return True
131 else:
132 raise Exception('Internal error')
133
134 else:
135 return False
109 136
110 137
111 def CallMoveScu(args): 138 def CallMoveScu(args):
112 try: 139 try:
113 subprocess.check_call(GetMoveScuCommand() + args, 140 subprocess.check_call(GetMoveScuCommand() + args,
388 self.assertEqual(study['ID'], series['ParentStudy']) 415 self.assertEqual(study['ID'], series['ParentStudy'])
389 self.assertEqual('Unknown', series['Status']) 416 self.assertEqual('Unknown', series['Status'])
390 for instance in DoGet(_REMOTE, '/series/%s/instances' % series['ID']): 417 for instance in DoGet(_REMOTE, '/series/%s/instances' % series['ID']):
391 self.assertEqual(series['ID'], instance['ParentSeries']) 418 self.assertEqual(series['ID'], instance['ParentSeries'])
392 419
393 self.assertEqual(json.dumps(DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/data' % instance['ID'])), 420 if not IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
394 json.dumps(DoGet(_REMOTE, '/instances/%s/tags' % instance['ID']))) 421 # The "dicom-as-json" attachment was removed in Orthanc 1.9.1
422 self.assertEqual(json.dumps(DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/data' % instance['ID'])),
423 json.dumps(DoGet(_REMOTE, '/instances/%s/tags' % instance['ID'])))
395 424
396 425
397 r = DoDelete(_REMOTE, "/studies/%s" % brainixStudy)['RemainingAncestor'] 426 r = DoDelete(_REMOTE, "/studies/%s" % brainixStudy)['RemainingAncestor']
398 self.assertEqual(1, len(DoGet(_REMOTE, '/patients'))) 427 self.assertEqual(1, len(DoGet(_REMOTE, '/patients')))
399 self.assertEqual(1, len(DoGet(_REMOTE, '/studies'))) 428 self.assertEqual(1, len(DoGet(_REMOTE, '/studies')))
1141 1170
1142 self.assertEqual(3 * d, e) 1171 self.assertEqual(3 * d, e)
1143 1172
1144 1173
1145 def test_custom_attachment(self): 1174 def test_custom_attachment(self):
1146 UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-0001.dcm') 1175 u = UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-0001.dcm') ['ID']
1176
1147 patient = DoGet(_REMOTE, '/patients')[0] 1177 patient = DoGet(_REMOTE, '/patients')[0]
1148 instance = DoGet(_REMOTE, '/instances')[0] 1178 instance = DoGet(_REMOTE, '/instances')[0]
1149 size = int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']) 1179 size = int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize'])
1150 self.assertEqual(size, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize'])) 1180 self.assertEqual(size, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
1151 1181
1152 self.assertEqual(0, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient))) 1182 self.assertEqual(0, len(DoGet(_REMOTE, '/patients/%s/attachments' % patient)))
1153 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
1154 self.assertTrue('dicom' in DoGet(_REMOTE, '/instances/%s/attachments' % instance)) 1183 self.assertTrue('dicom' in DoGet(_REMOTE, '/instances/%s/attachments' % instance))
1155 self.assertTrue('dicom-as-json' in DoGet(_REMOTE, '/instances/%s/attachments' % instance)) 1184
1185 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
1186 if IsDicomUntilPixelDataStored(_REMOTE):
1187 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
1188 self.assertTrue('dicom-until-pixel-data' in DoGet(_REMOTE, '/instances/%s/attachments' % instance))
1189 else:
1190 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
1191 else:
1192 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
1193 self.assertTrue('dicom-as-json' in DoGet(_REMOTE, '/instances/%s/attachments' % instance))
1156 1194
1157 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/patients/%s/attachments/22' % patient, 'hello')) 1195 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/patients/%s/attachments/22' % patient, 'hello'))
1158 hello = 'hellohellohellohellohellohellohellohellohello' 1196 hello = 'hellohellohellohellohellohellohellohellohello'
1159 DoPut(_REMOTE, '/patients/%s/attachments/1025' % patient, hello) 1197 DoPut(_REMOTE, '/patients/%s/attachments/1025' % patient, hello)
1160 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']), 1198 self.assertEqual(int(DoGet(_REMOTE, '/patients/%s/statistics' % patient)['DiskSize']),
2852 2890
2853 2891
2854 def test_compression(self): 2892 def test_compression(self):
2855 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID'] 2893 i = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
2856 2894
2857 data = DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom-as-json/data' % i)[1] 2895 aa = DoGet(_REMOTE, '/instances/%s/attachments/' % i)
2858 2896 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
2859 # "StorageCompression" is enabled in the Orthanc to be tested, 2897 # This file has *no* pixel data, so "dicom-until-pixel-data" is not stored
2860 # uncompress the data before running the test 2898 self.assertEqual(1, len(aa))
2861 if DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/is-compressed' % i) != 0: 2899 self.assertTrue('dicom' in aa)
2862 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/uncompress' % i) 2900 else:
2901 self.assertEqual(2, len(aa))
2902 self.assertTrue('dicom' in aa)
2903 self.assertTrue('dicom-as-json' in aa)
2904
2905 data = DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom/data' % i)[1]
2906
2907 # If "StorageCompression" is enabled in the Orthanc to be
2908 # tested, uncompress the attachment before running the test
2909 if DoGet(_REMOTE, '/instances/%s/attachments/dicom/is-compressed' % i) != 0:
2910 DoPost(_REMOTE, '/instances/%s/attachments/dicom/uncompress' % i)
2863 2911
2864 cs = DoGet(_REMOTE, '/statistics')['TotalDiskSize'] 2912 cs = int(DoGet(_REMOTE, '/statistics')['TotalDiskSize'])
2865 us = DoGet(_REMOTE, '/statistics')['TotalUncompressedSize'] 2913 us = int(DoGet(_REMOTE, '/statistics')['TotalUncompressedSize'])
2866 size = DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/size' % i) 2914 size = int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/size' % i))
2867 md5 = DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/md5' % i) 2915 md5 = DoGet(_REMOTE, '/instances/%s/attachments/dicom/md5' % i)
2868 self.assertEqual(data, DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-data' % i)[1]) 2916 self.assertEqual(data, DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom/compressed-data' % i)[1])
2869 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-md5' % i)) 2917 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-md5' % i))
2870 self.assertEqual(size, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-size' % i)) 2918 self.assertEqual(size, int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-size' % i)))
2871 2919
2872 ops = DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json' % i) 2920 ops = DoGet(_REMOTE, '/instances/%s/attachments/dicom' % i)
2873 self.assertTrue('compress' in ops) 2921 self.assertTrue('compress' in ops)
2874 self.assertTrue('uncompress' in ops) 2922 self.assertTrue('uncompress' in ops)
2875 self.assertTrue('is-compressed' in ops) 2923 self.assertTrue('is-compressed' in ops)
2876 self.assertEqual(0, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/is-compressed' % i)) 2924 self.assertEqual(0, DoGet(_REMOTE, '/instances/%s/attachments/dicom/is-compressed' % i))
2877 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/verify-md5' % i) 2925 DoPost(_REMOTE, '/instances/%s/attachments/dicom/verify-md5' % i)
2878 2926
2879 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/compress' % i) 2927 # Re-compress the attachment
2880 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/verify-md5' % i) 2928 DoPost(_REMOTE, '/instances/%s/attachments/dicom/compress' % i)
2881 self.assertEqual(1, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/is-compressed' % i)) 2929 DoPost(_REMOTE, '/instances/%s/attachments/dicom/verify-md5' % i)
2882 self.assertLess(cs, DoGet(_REMOTE, '/statistics')['TotalDiskSize']) 2930 self.assertEqual(1, DoGet(_REMOTE, '/instances/%s/attachments/dicom/is-compressed' % i))
2883 self.assertEqual(us, DoGet(_REMOTE, '/statistics')['TotalUncompressedSize']) 2931 self.assertGreater(cs, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
2884 self.assertGreater(len(data), len(DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-data' % i)[1])) 2932 self.assertEqual(us, int(DoGet(_REMOTE, '/statistics')['TotalUncompressedSize']))
2885 self.assertGreater(size, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-size' % i)) 2933 self.assertGreater(len(data), len(DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom/compressed-data' % i)[1]))
2886 self.assertEqual(size, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/size' % i)) 2934 self.assertGreater(size, int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-size' % i)))
2887 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/md5' % i)) 2935 self.assertEqual(size, int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/size' % i)))
2888 self.assertNotEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-md5' % i)) 2936 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom/md5' % i))
2889 2937 self.assertNotEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-md5' % i))
2890 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/uncompress' % i) 2938
2891 DoPost(_REMOTE, '/instances/%s/attachments/dicom-as-json/verify-md5' % i) 2939 DoPost(_REMOTE, '/instances/%s/attachments/dicom/uncompress' % i)
2892 self.assertEqual(0, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/is-compressed' % i)) 2940 DoPost(_REMOTE, '/instances/%s/attachments/dicom/verify-md5' % i)
2893 self.assertEqual(data, DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-data' % i)[1]) 2941 self.assertEqual(0, DoGet(_REMOTE, '/instances/%s/attachments/dicom/is-compressed' % i))
2894 self.assertEqual(size, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-size' % i)) 2942 self.assertEqual(data, DoGetRaw(_REMOTE, '/instances/%s/attachments/dicom/compressed-data' % i)[1])
2895 self.assertEqual(size, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/size' % i)) 2943 self.assertEqual(size, int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-size' % i)))
2896 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/md5' % i)) 2944 self.assertEqual(size, int(DoGet(_REMOTE, '/instances/%s/attachments/dicom/size' % i)))
2897 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/compressed-md5' % i)) 2945 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom/md5' % i))
2898 self.assertEqual(cs, DoGet(_REMOTE, '/statistics')['TotalDiskSize']) 2946 self.assertEqual(md5, DoGet(_REMOTE, '/instances/%s/attachments/dicom/compressed-md5' % i))
2899 self.assertEqual(us, DoGet(_REMOTE, '/statistics')['TotalUncompressedSize']) 2947 self.assertEqual(cs, int(DoGet(_REMOTE, '/statistics')['TotalDiskSize']))
2948 self.assertEqual(us, int(DoGet(_REMOTE, '/statistics')['TotalUncompressedSize']))
2900 2949
2901 2950
2902 def test_ordered_slices(self): 2951 def test_ordered_slices(self):
2903 i = UploadInstance(_REMOTE, 'Multiframe.dcm')['ID'] 2952 i = UploadInstance(_REMOTE, 'Multiframe.dcm')['ID']
2904 s = DoGet(_REMOTE, '/instances/%s' % i)['ParentSeries'] 2953 s = DoGet(_REMOTE, '/instances/%s' % i)['ParentSeries']
3015 t = DoGet(_REMOTE, '/instances/%s/tags' % j) 3064 t = DoGet(_REMOTE, '/instances/%s/tags' % j)
3016 with open(GetDatabasePath('PrivateTagsFull.json'), 'r') as f: 3065 with open(GetDatabasePath('PrivateTagsFull.json'), 'r') as f:
3017 a = json.loads(f.read()) 3066 a = json.loads(f.read())
3018 3067
3019 # Starting with Orthanc 1.9.1, the DICOM-as-JSON 3068 # Starting with Orthanc 1.9.1, the DICOM-as-JSON
3020 # attachments are truncated starting with PixelData 3069 # reports are truncated starting with PixelData
3021 if not '7fe1,0010' in t: 3070 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
3071 self.assertFalse('7fe1,0010' in t)
3072 self.assertFalse('7fe1,1001' in t)
3022 del a['7fe1,0010'] 3073 del a['7fe1,0010']
3023 del a['7fe1,1001'] 3074 del a['7fe1,1001']
3075 else:
3076 self.assertTrue('7fe1,0010' in t)
3077 self.assertTrue('7fe1,1001' in t)
3024 3078
3025 aa = json.dumps(a).replace('2e+022', '2e+22') 3079 aa = json.dumps(a).replace('2e+022', '2e+22')
3026 tt = (json.dumps(t) 3080 tt = (json.dumps(t)
3027 .replace('2e+022', '2e+22') 3081 .replace('2e+022', '2e+22')
3028 # The "IllegalPrivatePixelSequence" tag was introduced in DCMTK 3.6.6 dictionary 3082 # The "IllegalPrivatePixelSequence" tag was introduced in DCMTK 3.6.6 dictionary
3361 3415
3362 instance = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID'] 3416 instance = UploadInstance(_REMOTE, 'DummyCT.dcm')['ID']
3363 first = DoGet(_REMOTE, '/instances/%s/tags' % instance) 3417 first = DoGet(_REMOTE, '/instances/%s/tags' % instance)
3364 3418
3365 self.assertEqual('TWINOW', first['0008,1010']['Value']) 3419 self.assertEqual('TWINOW', first['0008,1010']['Value'])
3366 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance))) 3420
3421 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
3422 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
3423 else:
3424 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
3367 3425
3368 # Cannot delete the "DICOM" attachment 3426 # Cannot delete the "DICOM" attachment
3369 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/instances/%s/attachments/dicom' % instance)) 3427 self.assertRaises(Exception, lambda: DoDelete(_REMOTE, '/instances/%s/attachments/dicom' % instance))
3370 3428
3371 # Can delete the "DICOM as JSON" attachment 3429 # Can delete the "DICOM as JSON" attachment
3379 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/patients/%s/attachments/dicom-as-json' % patient, 'hello')) 3437 self.assertRaises(Exception, lambda: DoPut(_REMOTE, '/patients/%s/attachments/dicom-as-json' % patient, 'hello'))
3380 3438
3381 # Transparently reconstruct the "DICOM as JSON" attachment 3439 # Transparently reconstruct the "DICOM as JSON" attachment
3382 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json' % instance)) 3440 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json' % instance))
3383 second = DoGet(_REMOTE, '/instances/%s/tags' % instance) 3441 second = DoGet(_REMOTE, '/instances/%s/tags' % instance)
3384 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
3385
3386 third = DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/data' % instance)
3387 self.assertEqual(str(first), str(second)) 3442 self.assertEqual(str(first), str(second))
3388 self.assertEqual(str(first), str(third)) 3443
3444 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
3445 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
3446 else:
3447 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % instance)))
3448 third = DoGet(_REMOTE, '/instances/%s/attachments/dicom-as-json/data' % instance)
3449 self.assertEqual(str(first), str(third))
3389 3450
3390 3451
3391 def test_reconstruct_json2(self): 3452 def test_reconstruct_json2(self):
3392 self.assertEqual(0, len(DoGet(_REMOTE, '/patients'))) 3453 self.assertEqual(0, len(DoGet(_REMOTE, '/patients')))
3393 3454
3395 b = UploadInstance(_REMOTE, 'Knee/T2/IM-0001-0001.dcm')['ID'] 3456 b = UploadInstance(_REMOTE, 'Knee/T2/IM-0001-0001.dcm')['ID']
3396 3457
3397 self.assertEqual('BRAINIX', DoGet(_REMOTE, '/instances/%s/tags?simplify' % a)['PatientName']) 3458 self.assertEqual('BRAINIX', DoGet(_REMOTE, '/instances/%s/tags?simplify' % a)['PatientName'])
3398 self.assertEqual('KNEE', DoGet(_REMOTE, '/instances/%s/tags?simplify' % b)['PatientName']) 3459 self.assertEqual('KNEE', DoGet(_REMOTE, '/instances/%s/tags?simplify' % b)['PatientName'])
3399 3460
3400 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % a))) 3461 aa = DoGet(_REMOTE, '/instances/%s/attachments' % a)
3401 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % b))) 3462 bb = DoGet(_REMOTE, '/instances/%s/attachments' % b)
3402 3463
3464 if not IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
3465 self.assertEqual(2, len(aa))
3466 self.assertEqual(aa, bb)
3467 self.assertTrue('dicom' in aa)
3468 self.assertTrue('dicom-as-json' in aa)
3469 elif IsDicomUntilPixelDataStored(_REMOTE):
3470 self.assertEqual(2, len(aa))
3471 self.assertEqual(aa, bb)
3472 self.assertTrue('dicom' in aa)
3473 self.assertTrue('dicom-until-pixel-data' in aa)
3474 else:
3475 self.assertEqual(1, len(aa))
3476 self.assertEqual(aa, bb)
3477 self.assertTrue('dicom' in aa)
3478
3479 # In Orthanc <= 1.9.0, this call deletes "dicom-as-json"
3403 DoPost(_REMOTE, '/tools/invalidate-tags', '', 'text/plain') 3480 DoPost(_REMOTE, '/tools/invalidate-tags', '', 'text/plain')
3404 3481
3405 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % a))) 3482 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1) and IsDicomUntilPixelDataStored(_REMOTE):
3406 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % b))) 3483 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % a)))
3407 3484 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % b)))
3485 else:
3486 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % a)))
3487 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % b)))
3488
3489 # In Orthanc <= 1.9.0, this call reconstructs "dicom-as-json"
3408 self.assertEqual('BRAINIX', DoGet(_REMOTE, '/instances/%s/tags?simplify' % a)['PatientName']) 3490 self.assertEqual('BRAINIX', DoGet(_REMOTE, '/instances/%s/tags?simplify' % a)['PatientName'])
3409 self.assertEqual('KNEE', DoGet(_REMOTE, '/instances/%s/tags?simplify' % b)['PatientName']) 3491 self.assertEqual('KNEE', DoGet(_REMOTE, '/instances/%s/tags?simplify' % b)['PatientName'])
3410 3492
3411 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % a))) 3493 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1) and not IsDicomUntilPixelDataStored(_REMOTE):
3412 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % b))) 3494 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % a)))
3495 self.assertEqual(1, len(DoGet(_REMOTE, '/instances/%s/attachments' % b)))
3496 else:
3497 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % a)))
3498 self.assertEqual(2, len(DoGet(_REMOTE, '/instances/%s/attachments' % b)))
3413 3499
3414 3500
3415 def test_private_tags(self): 3501 def test_private_tags(self):
3416 i = UploadInstance(_REMOTE, 'PrivateMDNTags.dcm')['ID'] 3502 i = UploadInstance(_REMOTE, 'PrivateMDNTags.dcm')['ID']
3417 t = DoGet(_REMOTE, '/instances/%s/tags?simplify' % i) 3503 t = DoGet(_REMOTE, '/instances/%s/tags?simplify' % i)
4475 self.assertEqual(2, s['CountInstances']) 4561 self.assertEqual(2, s['CountInstances'])
4476 self.assertEqual(2, s['CountSeries']) 4562 self.assertEqual(2, s['CountSeries'])
4477 self.assertEqual(1, s['CountStudies']) 4563 self.assertEqual(1, s['CountStudies'])
4478 4564
4479 self.assertEqual(dicomSize, int(s['DicomUncompressedSize'])) 4565 self.assertEqual(dicomSize, int(s['DicomUncompressedSize']))
4480 self.assertLess(dicomSize, int(s['UncompressedSize']))
4481 4566
4482 if isCompressed: 4567 if isCompressed:
4483 self.assertGreater(dicomSize, int(s['DicomDiskSize'])) 4568 self.assertGreater(dicomSize, int(s['DicomDiskSize']))
4484 self.assertGreater(s['UncompressedSize'], s['DiskSize']) 4569 self.assertGreater(s['UncompressedSize'], s['DiskSize'])
4570 self.assertLess(dicomSize, int(s['UncompressedSize']))
4485 else: 4571 else:
4486 self.assertEqual(dicomSize, int(s['DicomDiskSize'])) 4572 self.assertEqual(dicomSize, int(s['DicomDiskSize']))
4487 self.assertEqual(s['UncompressedSize'], s['DiskSize']) 4573 self.assertEqual(s['UncompressedSize'], s['DiskSize'])
4488 4574 if IsOrthancVersionAbove(_REMOTE, 1, 9, 1):
4575 if IsDicomUntilPixelDataStored(_REMOTE):
4576 self.assertLess(dicomSize, int(s['UncompressedSize']))
4577 else:
4578 self.assertEqual(dicomSize, int(s['UncompressedSize']))
4579 else:
4580 # In Orthanc <= 1.9.0, there is the "dicom-as-json"
4581 # attachment in addition to the DICOM file
4582 self.assertLess(dicomSize, int(s['UncompressedSize']))
4583
4489 4584
4490 def test_changes_2(self): 4585 def test_changes_2(self):
4491 # More consistent behavior since Orthanc 1.5.2 4586 # More consistent behavior since Orthanc 1.5.2
4492 # https://groups.google.com/d/msg/orthanc-users/QhzB6vxYeZ0/YxabgqpfBAAJ 4587 # https://groups.google.com/d/msg/orthanc-users/QhzB6vxYeZ0/YxabgqpfBAAJ
4493 4588