comparison Tests/Tests.py @ 391:227d9a932467

testing revisions in metadata
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 16 Apr 2021 17:13:53 +0200
parents 5c2472f008eb
children 5cbcb4a83b41
comparison
equal deleted inserted replaced
390:5c2472f008eb 391:227d9a932467
1124 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/RemoteAET' % i), '') # None, received by REST API 1124 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/RemoteAET' % i), '') # None, received by REST API
1125 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i), '1.2.840.10008.1.2.4.91') # JPEG2k 1125 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i), '1.2.840.10008.1.2.4.91') # JPEG2k
1126 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/SopClassUid' % i), '1.2.840.10008.5.1.4.1.1.4') 1126 self.assertEqual(DoGet(_REMOTE, '/instances/%s/metadata/SopClassUid' % i), '1.2.840.10008.5.1.4.1.1.4')
1127 1127
1128 # Play with custom metadata 1128 # Play with custom metadata
1129 DoPut(_REMOTE, '/patients/%s/metadata/5555' % p, 'coucou') 1129 (headers, body) = DoPutRaw(_REMOTE, '/patients/%s/metadata/5555' % p, 'coucou')
1130 self.assertEqual('200', headers['status'])
1131 self.assertEqual('', body)
1132 self.assertEqual('"0"', headers['etag'])
1133
1130 m = DoGet(_REMOTE, '/patients/%s/metadata' % p) 1134 m = DoGet(_REMOTE, '/patients/%s/metadata' % p)
1131 self.assertEqual(2, len(m)) 1135 self.assertEqual(2, len(m))
1132 self.assertTrue('LastUpdate' in m) 1136 self.assertTrue('LastUpdate' in m)
1133 self.assertTrue('5555' in m) 1137 self.assertTrue('5555' in m)
1134 self.assertEqual('coucou', DoGet(_REMOTE, '/patients/%s/metadata/5555' % p)) 1138 self.assertEqual('coucou', DoGet(_REMOTE, '/patients/%s/metadata/5555' % p))
1135 DoPut(_REMOTE, '/patients/%s/metadata/5555' % p, 'hello') 1139 DoPut(_REMOTE, '/patients/%s/metadata/5555' % p, 'hello', headers = {
1136 self.assertEqual('hello', DoGet(_REMOTE, '/patients/%s/metadata/5555' % p)) 1140 'If-Match' : headers['etag']
1137 DoDelete(_REMOTE, '/patients/%s/metadata/5555' % p) 1141 })
1142
1143 (headers, body) = DoGetRaw(_REMOTE, '/patients/%s/metadata/5555' % p)
1144 self.assertEqual('200', headers['status'])
1145 self.assertEqual('hello', body)
1146 DoDelete(_REMOTE, '/patients/%s/metadata/5555' % p, headers = {
1147 'If-Match' : headers['etag']
1148 })
1138 m = DoGet(_REMOTE, '/patients/%s/metadata' % p) 1149 m = DoGet(_REMOTE, '/patients/%s/metadata' % p)
1139 self.assertEqual(1, len(m)) 1150 self.assertEqual(1, len(m))
1140 self.assertTrue('LastUpdate' in m) 1151 self.assertTrue('LastUpdate' in m)
1141 1152
1142 1153
4639 4650
4640 # Add, then delete, one user-defined metadata: This triggers 2 4651 # Add, then delete, one user-defined metadata: This triggers 2
4641 # changes of type "UpdatedMetadata" 4652 # changes of type "UpdatedMetadata"
4642 i = DoGet(_REMOTE, '/instances') [0] 4653 i = DoGet(_REMOTE, '/instances') [0]
4643 DoPut(_REMOTE, '/instances/%s/metadata/4000' % i, 'hello', 'text/plain') 4654 DoPut(_REMOTE, '/instances/%s/metadata/4000' % i, 'hello', 'text/plain')
4644 self.assertEqual('hello', DoGet(_REMOTE, '/instances/%s/metadata/4000' % i)) 4655
4656 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/4000' % i)
4657 self.assertEqual('200', headers['status'])
4658 self.assertEqual('hello', body)
4645 4659
4646 c = DoGet(_REMOTE, '/changes?last') 4660 c = DoGet(_REMOTE, '/changes?last')
4647 self.assertEqual(1, len(c['Changes'])) 4661 self.assertEqual(1, len(c['Changes']))
4648 self.assertTrue(c['Done']) 4662 self.assertTrue(c['Done'])
4649 self.assertEqual(seq + 5, c['Last']) 4663 self.assertEqual(seq + 5, c['Last'])
4650 self.assertEqual('UpdatedMetadata', c['Changes'][0]['ChangeType']) 4664 self.assertEqual('UpdatedMetadata', c['Changes'][0]['ChangeType'])
4651 4665
4652 DoDelete(_REMOTE, '/instances/%s/metadata/4000' % i) 4666 DoDelete(_REMOTE, '/instances/%s/metadata/4000' % i, headers = {
4667 'If-Match' : headers['etag']
4668 })
4653 c = DoGet(_REMOTE, '/changes?last') 4669 c = DoGet(_REMOTE, '/changes?last')
4654 self.assertEqual(1, len(c['Changes'])) 4670 self.assertEqual(1, len(c['Changes']))
4655 self.assertTrue(c['Done']) 4671 self.assertTrue(c['Done'])
4656 self.assertEqual(seq + 6, c['Last']) 4672 self.assertEqual(seq + 6, c['Last'])
4657 self.assertEqual('UpdatedMetadata', c['Changes'][0]['ChangeType']) 4673 self.assertEqual('UpdatedMetadata', c['Changes'][0]['ChangeType'])
6554 self.assertEqual(tags['0020,000e'], series['MainDicomTags']['SeriesInstanceUID']) 6570 self.assertEqual(tags['0020,000e'], series['MainDicomTags']['SeriesInstanceUID'])
6555 6571
6556 instance = DoGet(_REMOTE, '/instances/%s' % a) 6572 instance = DoGet(_REMOTE, '/instances/%s' % a)
6557 self.assertEqual(tags['0008,0018'], instance['MainDicomTags']['SOPInstanceUID']) 6573 self.assertEqual(tags['0008,0018'], instance['MainDicomTags']['SOPInstanceUID'])
6558 6574
6575
6576 def test_revisions(self):
6577 # This test fails on Orthanc <= 1.9.1 (support for revisions
6578 # was introduced in 1.9.2), or if configuration option
6579 # "CheckRevisions" is "False". Conventions for HTTP headers
6580 # related to revisions mimic CouchDB:
6581 # https://docs.couchdb.org/en/stable/api/document/common.html
6582 i = UploadInstance(_REMOTE, 'DummyCT.dcm') ['ID']
6583
6584 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i)
6585 self.assertEqual('200', headers['status'])
6586 self.assertEqual('"0"', headers['etag'])
6587 self.assertEqual('1.2.840.10008.1.2.4.70', body)
6588
6589 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i, headers = {
6590 'If-None-Match' : '"0"'
6591 })
6592 self.assertEqual('304', headers['status']) # Not modified
6593 self.assertEqual('"0"', headers['etag'])
6594 self.assertEqual('', body) # Body must be empty on 304 status
6595
6596 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i, headers = {
6597 'If-None-Match' : '"1"'
6598 })
6599 self.assertEqual('200', headers['status'])
6600 self.assertEqual('"0"', headers['etag'])
6601 self.assertEqual('1.2.840.10008.1.2.4.70', body)
6602
6603 (headers, body) = DoDeleteRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i)
6604 self.assertEqual('403', headers['status']) # Forbidden (system metadata)
6605
6606 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i, 'hello')
6607 self.assertEqual('403', headers['status']) # Forbidden (system metadata)
6608
6609 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello')
6610 self.assertEqual('200', headers['status'])
6611 self.assertEqual('"0"', headers['etag'])
6612
6613 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/1024' % i)
6614 self.assertEqual('200', headers['status'])
6615 self.assertEqual('"0"', headers['etag'])
6616 self.assertEqual('hello', body)
6617
6618 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6619 'If-None-Match' : '"0"'
6620 })
6621 self.assertEqual('304', headers['status'])
6622 self.assertEqual('"0"', headers['etag'])
6623 self.assertEqual('', body)
6624
6625 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6626 'If-None-Match' : '"1"'
6627 })
6628 self.assertEqual('200', headers['status'])
6629 self.assertEqual('"0"', headers['etag'])
6630 self.assertEqual('hello', body)
6631 self.assertEqual('hello', DoGet(_REMOTE, '/instances/%s/metadata/1024' % i))
6632
6633 (headers, body) = DoDeleteRaw(_REMOTE, '/instances/%s/metadata/1024' % i)
6634 self.assertEqual('409', headers['status']) # No revision given, but "CheckRevisions" is True
6635
6636 (headers, body) = DoDeleteRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6637 'If-Match' : '45'
6638 })
6639 self.assertEqual('409', headers['status']) # Conflict, as bad revision
6640
6641 (headers, body) = DoDeleteRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6642 'If-Match' : '0'
6643 })
6644 self.assertEqual('200', headers['status'])
6645
6646 (headers, body) = DoDeleteRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6647 'If-Match' : '0'
6648 })
6649 self.assertEqual('404', headers['status'])
6650
6651 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/1024' % i)
6652 self.assertEqual('404', headers['status'])
6653
6654 self.assertRaises(Exception, lambda: DoGet(_REMOTE, '/instances/%s/metadata/1024' % i))
6655
6656 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello')
6657 self.assertEqual('200', headers['status'])
6658 self.assertEqual('"0"', headers['etag'])
6659
6660 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello')
6661 self.assertEqual('409', headers['status'])
6662
6663 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/TransferSyntax' % i, headers = {
6664 'If-None-Match' : '"0"'
6665 })
6666 self.assertEqual('304', headers['status']) # Not modified
6667 self.assertEqual('"0"', headers['etag'])
6668 self.assertEqual('', body) # Body must be empty on 304 status
6669
6670 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello', headers = {
6671 'If-Match' : '0'
6672 })
6673 self.assertEqual('200', headers['status'])
6674 self.assertEqual('"1"', headers['etag'])
6675 self.assertEqual('', body)
6676
6677 (headers, body) = DoGetRaw(_REMOTE, '/instances/%s/metadata/1024' % i, headers = {
6678 'If-None-Match' : headers['etag']
6679 })
6680
6681 if headers['status'] == '200':
6682 print("Your database backend doesn't store revisions")
6683 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello2', headers = {
6684 'If-Match' : '1'
6685 })
6686 self.assertEqual('409', headers['status'])
6687
6688 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello2', headers = {
6689 'If-Match' : '0'
6690 })
6691 self.assertEqual('200', headers['status'])
6692 self.assertEqual('"1"', headers['etag'])
6693 self.assertEqual('', body)
6694
6695 elif headers['status'] == '304': # Revisions are supported
6696 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello2', headers = {
6697 'If-Match' : '0'
6698 })
6699 self.assertEqual('409', headers['status'])
6700
6701 (headers, body) = DoPutRaw(_REMOTE, '/instances/%s/metadata/1024' % i, 'hello2', headers = {
6702 'If-Match' : '1'
6703 })
6704 self.assertEqual('200', headers['status'])
6705 self.assertEqual('"2"', headers['etag'])
6706 self.assertEqual('', body)
6707
6708 else:
6709 raise Exception('Internal error')
6710
6711 self.assertEqual('hello2', DoGet(_REMOTE, '/instances/%s/metadata/1024' % i))
6712