1
|
|
|
#!/usr/bin/python |
2
|
|
|
# -*- coding: UTF-8 -*- |
3
|
|
|
import unittest |
4
|
|
|
from mock import Mock |
5
|
|
|
from datetime import datetime |
6
|
|
|
import json |
7
|
|
|
from tests.ditest import DependencyInjectionTestBase |
8
|
|
|
|
9
|
|
|
|
10
|
|
|
class SerializerTests(DependencyInjectionTestBase): |
11
|
|
|
|
12
|
|
|
def setUp(self): |
13
|
|
|
super(SerializerTests, self).setUp() |
14
|
|
|
self.fileFactory.fromProvenance.side_effect = lambda p: self.imageWithProvenance(p) |
15
|
|
|
|
16
|
|
|
def imageWithProvenance(self, prov): |
17
|
|
|
img = Mock() |
18
|
|
|
img.provenance = prov |
19
|
|
|
if 'location' in prov: |
20
|
|
|
img.location.toString.return_value = prov['location'] |
21
|
|
|
return img |
22
|
|
|
|
23
|
|
|
def test_serialize_makes_args_kwargs_values_strings(self): |
24
|
|
|
from niprov.formatjson import JsonFormat |
25
|
|
|
class CustomType(object): |
26
|
|
|
pass |
27
|
|
|
serializer = JsonFormat(self.dependencies) |
28
|
|
|
record = {} |
29
|
|
|
ct1 = CustomType() |
30
|
|
|
ct2 = CustomType() |
31
|
|
|
record['args'] = [1.23, ct1] |
32
|
|
|
record['kwargs'] = {'one':ct2, 'two':4.56} |
33
|
|
|
out = serializer.serializeSingle(self.imageWithProvenance(record)) |
34
|
|
|
self.assertEqual(json.loads(out)['args'], |
35
|
|
|
[1.23, str(ct1)]) |
36
|
|
|
self.assertEqual(json.loads(out)['kwargs'], |
37
|
|
|
{'one':str(ct2), 'two':4.56}) |
38
|
|
|
|
39
|
|
|
def test_serialize_and_deserialize_dont_balk_if_time_field_absent(self): |
40
|
|
|
from niprov.formatjson import JsonFormat |
41
|
|
|
serializer = JsonFormat(self.dependencies) |
42
|
|
|
record = {} |
43
|
|
|
img1 = self.imageWithProvenance(record) |
44
|
|
|
jsonrecord = serializer.serializeSingle(img1) |
45
|
|
|
out = serializer.deserialize(jsonrecord) |
46
|
|
|
self.assertEqual(img1.provenance, out.provenance) |
47
|
|
|
|
48
|
|
|
def test_swallows_object_ids(self): |
49
|
|
|
from bson.objectid import ObjectId |
50
|
|
|
from niprov.formatjson import JsonFormat |
51
|
|
|
serializer = JsonFormat(self.dependencies) |
52
|
|
|
record = {} |
53
|
|
|
record['_id'] = ObjectId('564168f2fb481f480891263c') |
54
|
|
|
out = serializer.serializeList([self.imageWithProvenance(record)]) |
55
|
|
|
self.assertNotIn('_id', json.loads(out)[0]) |
56
|
|
|
|
57
|
|
|
def test_Deals_with_versions(self): |
58
|
|
|
from niprov.formatjson import JsonFormat |
59
|
|
|
serializer = JsonFormat(self.dependencies) |
60
|
|
|
record = {} |
61
|
|
|
dtnow = datetime.now() |
62
|
|
|
record['_versions'] = [{'acquired':dtnow}, |
63
|
|
|
{'added':dtnow}] |
64
|
|
|
jsonStr = serializer.serializeSingle(self.imageWithProvenance(record)) |
65
|
|
|
out = serializer.deserialize(jsonStr) |
66
|
|
|
self.assertEqual(out.provenance['_versions'][-1]['added'], dtnow) |
67
|
|
|
self.assertEqual(out.provenance['_versions'][-2]['acquired'], dtnow) |
68
|
|
|
|
69
|
|
|
|
70
|
|
|
|