Mercurial > hg > orthanc-tests
changeset 715:c11496bd7eaa find-refactoring
tools/find: Metadata, ResponseContent
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Mon, 07 Oct 2024 18:20:59 +0200 |
parents | 812ad50c5564 |
children | 998f83ddd4de |
files | Tests/Tests.py |
diffstat | 1 files changed, 192 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/Tests/Tests.py Mon Oct 07 10:54:54 2024 +0200 +++ b/Tests/Tests.py Mon Oct 07 18:20:59 2024 +0200 @@ -11099,9 +11099,196 @@ self.assertEqual(6, len(a)) - def test_extended_filter_metadata(self): + def test_extended_find_filter_metadata(self): + if IsOrthancVersionAbove(_REMOTE, 1, 12, 5) and HasExtendedFind(_REMOTE): # TODO: remove HasExtendedFind once find-refactoring branch has been merged + + # Upload 12 instances + for i in range(3): + UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Knee/T1/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Knee/T2/IM-0001-000%d.dcm' % (i + 1)) + + kneeT2SeriesId = 'bbf7a453-0d34251a-03663b55-46bb31b9-ffd74c59' + kneeT1SeriesId = '6de73705-c4e65c1b-9d9ea1b5-cabcd8e7-f15e4285' + brainixFlairSeriesId = '1e2c125c-411b8e86-3f4fe68e-a7584dd3-c6da78f0' + brainixEpiSeriesId = '2ac1316d-3e432022-62eabff2-c59f5475-9b1ac3f8' + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % kneeT2SeriesId, 'kneeT2') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % kneeT1SeriesId, 'kneeT1') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % brainixFlairSeriesId, 'brainixFlair') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % brainixEpiSeriesId, 'brainixEpi') + + # filter on metadata + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'QueryMetadata' : { + 'my-metadata': '*2*' + } + }) + + self.assertEqual(1, len(a)) + self.assertEqual(kneeT2SeriesId, a[0]) + + def test_extended_find_expand(self): if IsOrthancVersionAbove(_REMOTE, 1, 12, 5) and HasExtendedFind(_REMOTE): # TODO: remove HasExtendedFind once find-refactoring branch has been merged - pass - # TODO: - # filter on metadata value - # ... \ No newline at end of file + UploadInstance(_REMOTE, 'Knee/T2/IM-0001-0001.dcm') + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'Expand': True, + 'RequestedTags': ['StudyDate'] + }) + + # backward compat for Expand = True + self.assertIn('ExpectedNumberOfInstances', a[0]) + self.assertIn('ID', a[0]) + self.assertIn('Instances', a[0]) + self.assertIn('Labels', a[0]) + self.assertIn('LastUpdate', a[0]) + self.assertIn('MainDicomTags', a[0]) + self.assertIn('ParentStudy', a[0]) + self.assertIn('RequestedTags', a[0]) + self.assertIn('Status', a[0]) + self.assertIn('Type', a[0]) + self.assertIn('IsStable', a[0]) + self.assertNotIn('Attachments', a[0]) + self.assertNotIn('Metadata', a[0]) + + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'ResponseContent': ["MainDicomTags"], + 'RequestedTags': ['StudyDate'] + }) + + self.assertIn('ID', a[0]) # the ID is always in the response + self.assertIn('Type', a[0]) # the Type is always in the response + self.assertIn('RequestedTags', a[0]) # the RequestedTags are always in the response as soon as you have requested them + self.assertIn('MainDicomTags', a[0]) + self.assertNotIn('ExpectedNumberOfInstances', a[0]) + self.assertNotIn('Instances', a[0]) + self.assertNotIn('Labels', a[0]) + self.assertNotIn('LastUpdate', a[0]) + self.assertNotIn('ParentStudy', a[0]) + self.assertNotIn('Status', a[0]) + self.assertNotIn('IsStable', a[0]) + self.assertNotIn('Attachments', a[0]) + self.assertNotIn('Metadata', a[0]) + + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'ResponseContent': ["MainDicomTags", "Children", "Parent", "IsStable", "Status", "Labels", "Metadata"], + 'RequestedTags': ['StudyDate'] + }) + + self.assertIn('ID', a[0]) # the ID is always in the response + self.assertIn('Type', a[0]) # the Type is always in the response + self.assertIn('RequestedTags', a[0]) # the RequestedTags are always in the response as soon as you have requested them + self.assertIn('MainDicomTags', a[0]) + self.assertIn('Metadata', a[0]) + self.assertIn('LastUpdate', a[0]['Metadata']) + self.assertIn('Instances', a[0]) + self.assertIn('Labels', a[0]) + self.assertIn('ParentStudy', a[0]) + self.assertIn('Status', a[0]) + self.assertIn('IsStable', a[0]) + self.assertNotIn('Attachments', a[0]) + + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Instances', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'Expand': True, + 'RequestedTags': ['StudyDate'] + }) + + # backward compat for Expand = True at instance level + self.assertIn('ID', a[0]) # the ID is always in the response + self.assertIn('Type', a[0]) # the Type is always in the response + self.assertIn('RequestedTags', a[0]) # the RequestedTags are always in the response as soon as you have requested them + self.assertIn('FileSize', a[0]) + self.assertIn('FileUuid', a[0]) + self.assertIn('IndexInSeries', a[0]) + self.assertIn('ParentSeries', a[0]) + self.assertIn('Labels', a[0]) + self.assertNotIn('Attachments', a[0]) + self.assertNotIn('Metadata', a[0]) + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Instances', + 'Query' : { + 'SeriesDescription' : 'T*' + }, + 'ResponseContent' : ['Attachments'], + 'RequestedTags': ['StudyDate'] + }) + + # backward compat for Expand = True at instance level + self.assertIn('ID', a[0]) # the ID is always in the response + self.assertIn('Type', a[0]) # the Type is always in the response + self.assertIn('RequestedTags', a[0]) # the RequestedTags are always in the response as soon as you have requested them + self.assertIn('Attachments', a[0]) + self.assertIn('Uuid', a[0]['Attachments'][0]) + self.assertIn('UncompressedSize', a[0]['Attachments'][0]) + + + def test_extended_find_full(self): + if IsOrthancVersionAbove(_REMOTE, 1, 12, 5) and HasExtendedFind(_REMOTE): # TODO: remove HasExtendedFind once find-refactoring branch has been merged + + # Upload 12 instances + for i in range(3): + UploadInstance(_REMOTE, 'Brainix/Flair/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Brainix/Epi/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Knee/T1/IM-0001-000%d.dcm' % (i + 1)) + UploadInstance(_REMOTE, 'Knee/T2/IM-0001-000%d.dcm' % (i + 1)) + + kneeT2SeriesId = 'bbf7a453-0d34251a-03663b55-46bb31b9-ffd74c59' + kneeT1SeriesId = '6de73705-c4e65c1b-9d9ea1b5-cabcd8e7-f15e4285' + brainixFlairSeriesId = '1e2c125c-411b8e86-3f4fe68e-a7584dd3-c6da78f0' + brainixEpiSeriesId = '2ac1316d-3e432022-62eabff2-c59f5475-9b1ac3f8' + kneeStudyId = '0a9b3153-2512774b-2d9580de-1fc3dcf6-3bd83918' + kneePatientId = 'ca29faea-b6a0e17f-067743a1-8b778011-a48b2a17' + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % kneeT2SeriesId, 'kneeT2') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % kneeT1SeriesId, 'kneeT1') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % brainixFlairSeriesId, 'brainixFlair') + DoPut(_REMOTE, '/series/%s/metadata/my-metadata' % brainixEpiSeriesId, 'brainixEpi') + + a = DoPost(_REMOTE, '/tools/find', { 'Level' : 'Series', + 'Query' : { + 'PatientName' : '*' + }, + 'RequestedTags': ['StudyDate'], + 'QueryMetadata' : { + 'my-metadata': "*nee*" + }, + 'OrderBy' : [ + { + 'Type': 'DicomTag', + 'Key': 'SeriesDescription', + 'Direction': 'ASC' + }, + { + 'Type': 'Metadata', + 'Key': 'my-metadata', + 'Direction': 'DESC' + } + ], + 'ParentPatient': kneePatientId, + 'ResponseContent' : ['Parent', 'Children', 'MainDicomTags', 'Metadata'] + }) + + self.assertEqual(2, len(a)) + self.assertEqual(kneeT1SeriesId, a[0]['ID']) + self.assertEqual(kneeT2SeriesId, a[1]['ID']) + self.assertEqual(kneeStudyId, a[0]['ParentStudy']) + self.assertEqual(3, len(a[0]['Instances'])) + self.assertEqual('', a[0]['Metadata']['RemoteAET']) \ No newline at end of file