changeset 53:a5d238852e69

added test_create_free_link
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 22 Oct 2025 12:27:20 +0200
parents f65e4503cd67
children b931dabc2b47
files Resources/IntegrationTests/Run.py Sources/EducationRestApi.cpp
diffstat 2 files changed, 103 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/Resources/IntegrationTests/Run.py	Wed Oct 22 12:05:32 2025 +0200
+++ b/Resources/IntegrationTests/Run.py	Wed Oct 22 12:27:20 2025 +0200
@@ -966,6 +966,108 @@
         CheckNoAccess('/instances/%s/file' % instance)
 
 
+    def test_create_free_link(self):
+        def CheckNoResource(project):
+            lst = requests.get(URL + '/education/api/user-projects', headers = AdministratorHeaders()).json()
+            self.assertEqual(0, len(lst['projects'][project]['resources']))
+
+        def CheckHasResource(project, level, resource):
+            lst = requests.get(URL + '/education/api/user-projects', headers = AdministratorHeaders()).json()
+            resources = lst['projects'][project]['resources']
+            self.assertEqual(1, len(resources))
+            self.assertEqual(level, resources[0]['level'])
+            self.assertEqual(resource, resources[0]['resource-id'])
+            return resources[0]
+
+        def Unlink(project):
+            lst = requests.get(URL + '/education/api/user-projects', headers = AdministratorHeaders()).json()
+            resources = lst['projects'][project]['resources']
+            self.assertEqual(1, len(resources))
+            requests.post(URL + '/education/api/unlink', json.dumps({
+                'resource' : resources[0],
+                'project' : project,
+            }), headers = AdministratorHeaders()).raise_for_status()
+
+            CheckNoResource(project)
+
+        instance = self.create_test_instance_id()
+        tags = requests.get(URL + '/instances/%s/tags?short' % instance, headers = AdministratorHeaders()).json()
+        study = requests.get(URL + '/instances/%s/study' % instance, headers = AdministratorHeaders()).json() ['ID']
+        series = requests.get(URL + '/instances/%s/series' % instance, headers = AdministratorHeaders()).json() ['ID']
+
+        project = requests.post(URL + '/education/api/projects', json.dumps({
+            'name' : 'Hello',
+            'description' : 'World',
+        }), headers = AdministratorHeaders()).json() ['id']
+
+        CheckNoResource(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : study,
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Study', study)
+        self.assertEqual('TEST - MY^STUDY', resource['title'])
+        self.assertEqual([ project ], resource['projects'])
+        self.assertEqual(tags['0020,000d'], resource['study-instance-uid'])
+        self.assertEqual('', resource['series-instance-uid'])
+        self.assertEqual('', resource['sop-instance-uid'])
+        self.assertEqual('../api/preview-study/%s' % study, resource['preview_url'])
+        Unlink(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : series,
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Series', series)
+        self.assertEqual('TEST - MY^STUDY', resource['title'])
+        self.assertEqual([ project ], resource['projects'])
+        self.assertEqual(tags['0020,000d'], resource['study-instance-uid'])
+        self.assertEqual(tags['0020,000e'], resource['series-instance-uid'])
+        self.assertEqual('', resource['sop-instance-uid'])
+        self.assertEqual('../api/preview-series/%s' % series, resource['preview_url'])
+        Unlink(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : instance,
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Instance', instance)
+        self.assertEqual('TEST - MY^STUDY', resource['title'])
+        self.assertEqual([ project ], resource['projects'])
+        self.assertEqual(tags['0020,000d'], resource['study-instance-uid'])
+        self.assertEqual(tags['0020,000e'], resource['series-instance-uid'])
+        self.assertEqual(tags['0008,0018'], resource['sop-instance-uid'])
+        self.assertEqual('../api/preview-instance/%s' % instance, resource['preview_url'])
+        Unlink(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : tags['0020,000d'],
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Study', study)
+        Unlink(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : tags['0020,000e'],
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Series', series)
+        Unlink(project)
+
+        requests.post(URL + '/education/api/link', json.dumps({
+            'data' : tags['0008,0018'],
+            'project' : project,
+        }), headers = AdministratorHeaders()).raise_for_status()
+
+        resource = CheckHasResource(project, 'Instance', instance)
+        Unlink(project)
+
 try:
     print('\nStarting the tests...')
     unittest.main(argv = [ sys.argv[0] ] + args.options)
--- a/Sources/EducationRestApi.cpp	Wed Oct 22 12:05:32 2025 +0200
+++ b/Sources/EducationRestApi.cpp	Wed Oct 22 12:27:20 2025 +0200
@@ -888,7 +888,7 @@
 
     if (!OrthancDatabase::LookupResourceByUserInput(level, resourceId, data))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
+      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadRequest, "Cannot find DICOM corresponding to: " + data);
     }
   }