Completed
Push — master ( 6d6a7d...e4617d )
by Jasper
8s
created

MongoRepoTests.test_Query()   A

Complexity

Conditions 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
1
import unittest
2
from mock import Mock, patch, sentinel
3
from datetime import timedelta
4
from tests.ditest import DependencyInjectionTestBase
5
6
7
class MongoRepoTests(DependencyInjectionTestBase):
8
9
    def setUp(self):
10
        super(MongoRepoTests, self).setUp()
11
        self.pictureCache.getBytes.return_value = None
12
        self.db = Mock()
13
        self.db.provenance.find_one.return_value = {}
14
        self.db.provenance.find.return_value = {}
15
16
    def setupRepo(self):
17
        from niprov.mongo import MongoRepository
18
        with patch('niprov.mongo.pymongo') as pymongo:
19
            self.repo = MongoRepository(dependencies=self.dependencies)
20
        self.repo.db = self.db
21
22
    def test_Connection(self):
23
        from niprov.mongo import MongoRepository
24
        with patch('niprov.mongo.pymongo') as pymongo:
25
            repo = MongoRepository(dependencies=self.dependencies)
26
        pymongo.MongoClient.assert_called_with(self.config.database_url)
27
        self.assertEqual(pymongo.MongoClient().get_default_database(), repo.db)
28
29
    def test_knowsByLocation(self):
30
        self.setupRepo()
31
        p = '/p/f1'
32
        self.db.provenance.find_one.return_value = None
33
        self.assertFalse(self.repo.knowsByLocation(p))
34
        self.db.provenance.find_one.assert_called_with({'location':p})
35
        self.db.provenance.find_one.return_value = 1
36
        self.assertTrue(self.repo.knowsByLocation(p))
37
38
    def test_byLocation_returns_img_from_record_with_path(self):
39
        self.setupRepo()
40
        p = '/p/f1'
41
        out = self.repo.byLocation(p)
42
        self.db.provenance.find_one.assert_called_with({'location':p})
43
        self.fileFactory.fromProvenance.assert_called_with(
44
            self.db.provenance.find_one())
45
        self.assertEqual(self.fileFactory.fromProvenance(), out)
46
47
    def test_getSeries(self):
48
        self.setupRepo()
49
        img = Mock()
50
        out = self.repo.getSeries(img)
51
        self.db.provenance.find_one.assert_called_with(
52
            {'seriesuid':img.getSeriesId()})
53
        self.fileFactory.fromProvenance.assert_called_with(
54
            self.db.provenance.find_one())
55
        self.assertEqual(self.fileFactory.fromProvenance(), out)
56
57
    def test_knowsSeries_returns_False_if_no_series_id(self):
58
        self.setupRepo()
59
        img = Mock()
60
        img.getSeriesId.return_value = None
61
        self.assertFalse(self.repo.knowsSeries(img))
62
63
    def test_knowsSeries(self):
64
        self.setupRepo()
65
        img = Mock()
66
        self.assertTrue(self.repo.knowsSeries(img))
67
        self.db.provenance.find_one.return_value = None
68
        self.assertFalse(self.repo.knowsSeries(img))
69
70
    def test_Add(self):
71
        self.setupRepo()
72
        img = Mock()
73
        img.provenance = {'a':1, 'b':2}
74
        self.repo.add(img)
75
        self.db.provenance.insert_one.assert_called_with({'a':1, 'b':2})
76
77
    def test_update(self):
78
        self.setupRepo()
79
        img = Mock()
80
        img.provenance = {'a':1, 'b':2}
81
        self.repo.update(img)
82
        self.db.provenance.update.assert_called_with(
83
            {'location':img.location.toString()}, {'a':1, 'b':2})
84 View Code Duplication
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
85
    def test_all(self):
86
        self.fileFactory.fromProvenance.side_effect = lambda p: 'img_'+p
87
        self.db.provenance.find.return_value = ['p1', 'p2']
88
        self.setupRepo()
89
        out = self.repo.all()
90
        self.db.provenance.find.assert_called_with()
91
        self.fileFactory.fromProvenance.assert_any_call('p1')
92
        self.fileFactory.fromProvenance.assert_any_call('p2')
93
        self.assertEqual(['img_p1', 'img_p2'], out)
94
95
    def test_updateApproval(self):
96
        self.setupRepo()
97
        img = Mock()
98
        p = '/p/f1'
99
        newStatus = 'oh-oh'
100
        self.repo.updateApproval(p, newStatus)
101
        self.db.provenance.update.assert_called_with(
102
            {'location':p}, {'$set': {'approval': newStatus}})
103
104
    def test_latest(self):
105
        self.fileFactory.fromProvenance.side_effect = lambda p: 'img_'+p
106
        self.db.provenance.find.return_value = Mock()
107
        self.db.provenance.find.return_value.sort.return_value.limit.return_value = ['px','py']
108
        self.setupRepo()
109
        out = self.repo.latest()
110
        self.db.provenance.find.assert_called_with()
111
        self.db.provenance.find().sort.assert_called_with('added', -1)
112
        self.db.provenance.find().sort().limit.assert_called_with(20)
113
        self.fileFactory.fromProvenance.assert_any_call('px')
114
        self.fileFactory.fromProvenance.assert_any_call('py')
115
        self.assertEqual(['img_px', 'img_py'], out)
116
117
    def test_statistics(self):
118
        self.db.provenance.aggregate.return_value = [sentinel.stats,]
119
        self.setupRepo()
120
        out = self.repo.statistics()
121
        self.db.provenance.aggregate.assert_called_with(
122
           [{'$group':
123
                 {
124
                   '_id': None,
125
                   'totalsize': { '$sum': '$size' },
126
                   'count': { '$sum': 1 }
127
                 }
128
            }])
129
        self.assertEqual(sentinel.stats, out)
130
131
    def test_statistics_if_no_records(self):
132
        self.db.provenance.aggregate.return_value = []
133
        self.setupRepo()
134
        out = self.repo.statistics()
135
        self.assertEqual({'count':0}, out)
136
137
    def test_byId(self):
138
        self.setupRepo()
139
        ID = 'abc123'
140
        out = self.repo.byId(ID)
141
        self.db.provenance.find_one.assert_called_with({'id':ID})
142
        self.fileFactory.fromProvenance.assert_called_with(
143
            self.db.provenance.find_one())
144
        self.assertEqual(self.fileFactory.fromProvenance(), out)
145
146
    def test_byLocations(self):
147
        self.fileFactory.fromProvenance.side_effect = lambda p: 'img_'+p
148
        self.db.provenance.find.return_value = ['p1', 'p2']
149
        self.setupRepo()
150
        out = self.repo.byLocations(['l1','l2'])
151
        self.db.provenance.find.assert_called_with({'location':{'$in':['l1','l2']}})
152
        self.fileFactory.fromProvenance.assert_any_call('p1')
153
        self.fileFactory.fromProvenance.assert_any_call('p2')
154
        self.assertEqual(['img_p1', 'img_p2'], out)
155
156
    def test_byParents(self):
157
        self.fileFactory.fromProvenance.side_effect = lambda p: 'img_'+p
158
        self.db.provenance.find.return_value = ['p1', 'p2']
159
        self.setupRepo()
160
        out = self.repo.byParents(['x1','x2'])
161
        self.db.provenance.find.assert_called_with({'parents':{'$in':['x1','x2']}})
162
        self.fileFactory.fromProvenance.assert_any_call('p1')
163
        self.fileFactory.fromProvenance.assert_any_call('p2')
164
        self.assertEqual(['img_p1', 'img_p2'], out)
165
166
    def test_Converts_timedelta_to_float_when_serializing(self):
167 View Code Duplication
        self.setupRepo()
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
168
        img = Mock()
169
        img.provenance = {'a':1, 'duration':timedelta(seconds=67.89)}
170
        self.repo.add(img)
171
        self.db.provenance.insert_one.assert_called_with(
172
            {'a':1, 'duration':67.89})
173
174
    def test_Converts_duration_to_timedelta_when_deserializing(self):
175
        self.setupRepo()
176
        self.db.provenance.find_one.return_value = {'a':3, 'duration':89.01}
177 View Code Duplication
        out = self.repo.byLocation('/p/f1')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
178
        self.fileFactory.fromProvenance.assert_called_with(
179
            {'a':3, 'duration':timedelta(seconds=89.01)})
180
181
    def test_Obtains_optional_snapshot_data_from_cache_when_serializing(self):
182
        self.pictureCache.getBytes.return_value = sentinel.snapbytes
183
        with patch('niprov.mongo.bson') as bson:
184
            bson.Binary.return_value = sentinel.snapbson
185
            self.setupRepo()
186
            img = Mock()
187
            img.provenance = {'a':1}
188
            self.repo.add(img)
189
            self.pictureCache.getBytes.assert_called_with(for_=img)
190
            bson.Binary.assert_called_with(sentinel.snapbytes)
191
            self.db.provenance.insert_one.assert_called_with({'a':1, 
192
                '_snapshot-data':sentinel.snapbson})
193
194
    def test_If_no_snapshot_doesnt_add_data_field(self):
195
        self.pictureCache.getBytes.return_value = None
196
        with patch('niprov.mongo.bson') as bson:
197
            self.setupRepo()
198
            img = Mock()
199
            img.provenance = {'a':1}
200
            self.repo.add(img)
201
            assert not bson.Binary.called
202
            self.db.provenance.insert_one.assert_called_with({'a':1})
203
204
    def test_If_snapshotdata_hands_them_to_pictureCache_on_deserializing(self):
205
        img = Mock()
206
        self.fileFactory.fromProvenance.return_value = img
207
        self.setupRepo()
208
        self.db.provenance.find_one.return_value = {'a':3}
209
        out = self.repo.byLocation('/p/f1')
210
        assert not self.pictureCache.keep.called
211
        self.db.provenance.find_one.return_value = {'a':3, 
212
                                                    '_snapshot-data':'y7yUyS'}
213
        out = self.repo.byLocation('/p/f1')
214
        self.pictureCache.keep.assert_called_with('y7yUyS', for_=img)
215
216
    def test_If_no_record_returned_byLocation_byId_getSeries_raise_alarm(self):
217
        self.setupRepo()
218
        self.db.provenance.find_one.return_value = None
219
        out = self.repo.byLocation('nowhere')
220
        self.listener.unknownFile.assert_called_with('nowhere')
221
        out = self.repo.byId('xxxx')
222
        self.listener.unknownFile.assert_called_with('id: xxxx')
223
        img = Mock()
224
        img.getSeriesId.return_value = '123abc'
225
        out = self.repo.getSeries(img)
226
        self.listener.unknownFile.assert_called_with('seriesuid: 123abc')
227
228
    def test_Query(self):
229
        self.db.provenance.find.return_value = ['record1']
230
        self.setupRepo()
231
        q = Mock()
232
        field1 = Mock()
233
        field1.name = 'color'
234
        field1.value = 'red'
235
        q.getFields.return_value = [field1]
236
        out = self.repo.inquire(q)
237
        self.db.provenance.find.assert_called_with({'color':'red'})
238
        self.fileFactory.fromProvenance.assert_called_with('record1')
239
240
241