|
1
|
|
|
#!/usr/bin/python |
|
2
|
|
|
# -*- coding: UTF-8 -*- |
|
3
|
|
|
import unittest |
|
4
|
|
|
from mock import Mock |
|
5
|
|
|
from datetime import datetime, timedelta |
|
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
|
|
|
{'duration':timedelta(seconds=23.45)}] |
|
64
|
|
|
jsonStr = serializer.serializeSingle(self.imageWithProvenance(record)) |
|
65
|
|
|
out = serializer.deserialize(jsonStr) |
|
66
|
|
|
self.assertEqual(out.provenance['versions'][-1]['duration'], |
|
67
|
|
|
timedelta(seconds=23.45)) |
|
68
|
|
|
self.assertEqual(out.provenance['versions'][-2]['acquired'], dtnow) |
|
69
|
|
|
|
|
70
|
|
|
|
|
71
|
|
|
|