Completed
Pull Request — master (#127)
by Jasper
01:07
created

LoggingTests.test_Can_pass_multiple_new_files()   A

Complexity

Conditions 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 8
rs 9.4285
1
from mock import Mock, patch
2
from datetime import datetime as dt
3
from tests.ditest import DependencyInjectionTestBase
4
5
6
class LoggingTests(DependencyInjectionTestBase):
7
8
    def setUp(self):
9
        super(LoggingTests, self).setUp()
10
        self.repo.knowsByLocation.return_value = True
11
        self.opts = Mock()
12
        self.opts.dryrun = False
13
        img = Mock()
14
        img.provenance = {'acquired':dt.now(),
15
            'subject':'JD', 
16
            'protocol':'X',
17
            'technique':'abc',
18
            'repetition-time':1.0,
19
            'epi-factor':1.0,
20
            'magnetization-transfer-contrast':True,
21
            'diffusion':True,
22
            'echo-time':123,
23
            'flip-angle':892,
24
            'inversion-time':123}
25
        self.repo.byLocation.return_value = img
26
        self.newimg = Mock()
27
        self.provenancesCreated = []
28
29
        def wrapProv(location, transient=False, provenance=False, dependencies=None):
30
            self.provenancesCreated.append(provenance)
31
            return self.newimg
32
        self.dependencies.reconfigureOrGetConfiguration.return_value = self.opts
33
        patcher = patch('niprov.logging.add')
34
        self.add = patcher.start()
35
        self.add.side_effect = wrapProv
36
        self.addCleanup(patcher.stop)
37
38
    def log(self, *args, **kwargs):
39
        from niprov.logging import log
40
        return log(*args, dependencies=self.dependencies, opts=self.opts, 
41
            **kwargs)
42
43
    def test_Returns_img(self):
44
        parents = ['/p/f1']
45
        new = '/p/f2'
46
        trans = 'Something cool'
47
        out = self.log(new, trans, parents)
48
        self.assertEqual(out, self.newimg)
49
50
    def test_Copies_fields_from_known_parent(self):
51
        self.locationFactory.completeString.side_effect = lambda p: p
52
        parent = '/p/f1'
53
        parents = [parent]
54
        parentProv = {'acquired':dt.now(),
55
            'subject':'JD', 
56
            'protocol':'X',
57
            'technique':'abc',
58
            'repetition-time':1.0,
59
            'epi-factor':1.0,
60
            'magnetization-transfer-contrast':True,
61
            'diffusion':True,
62
            'echo-time':123,
63
            'flip-angle':892,
64
            'inversion-time':123}
65
        parentImg = Mock()
66
        parentImg.provenance = parentProv
67
        self.repo.byLocation.side_effect = lambda x: {parent:parentImg}[x]
68
        self.log('new', 'trans', parents)
69
        self.assertEqual(self.provenancesCreated[0]['acquired'], parentProv['acquired'])
70
        self.assertEqual(self.provenancesCreated[0]['subject'], parentProv['subject'])
71
        self.assertEqual(self.provenancesCreated[0]['protocol'], parentProv['protocol'])
72
        self.assertEqual(self.provenancesCreated[0]['technique'], parentProv['technique'])
73
        self.assertEqual(self.provenancesCreated[0]['repetition-time'], parentProv['repetition-time'])
74
        self.assertEqual(self.provenancesCreated[0]['epi-factor'], parentProv['epi-factor'])
75
        self.assertEqual(self.provenancesCreated[0]['magnetization-transfer-contrast'], 
76
            parentProv['magnetization-transfer-contrast'])
77
        self.assertEqual(self.provenancesCreated[0]['diffusion'], parentProv['diffusion'])
78
        self.assertEqual(self.provenancesCreated[0]['echo-time'], parentProv['echo-time'])
79
        self.assertEqual(self.provenancesCreated[0]['flip-angle'], parentProv['flip-angle'])
80
        self.assertEqual(self.provenancesCreated[0]['inversion-time'], parentProv['inversion-time'])
81
82
    def test_Adds_code_or_logtext(self):
83
        self.log('new', 'trans', 'old', code='abc', logtext='def')
84
        self.assertEqual(self.provenancesCreated[0]['code'],'abc')
85
        self.assertEqual(self.provenancesCreated[0]['logtext'],'def')
86
87
    def test_Script_added_to_provenance(self):
88
        parents = ['/p/f1']
89
        new = '/p/f2'
90
        trans = 'Something cool'
91
        script = '/p/test.py'
92
        self.log(new, trans, parents, script=script)
93
        self.assertEqual(self.provenancesCreated[0]['script'], script)
94
95
    def test_Accepts_and_processes_custom_provenance(self):
96
        parents = ['/p/f1']
97
        new = '/p/f2'
98
        trans = 'Something cool'
99
        p = {'akey':'avalue'}
100
        self.log(new, trans, parents, provenance=p)
101
        self.assertEqual(self.provenancesCreated[0]['akey'], 'avalue')
102
103
    def test_Doesnt_complain_if_parent_is_missing_basic_fields(self):
104
        img = Mock()
105
        img.provenance = {'acquired':dt.now()} #missing subject
106
        self.repo.byLocation.return_value = img
107
        provenance = self.log('new', 'trans', ['/p/f1parent'])
108
        self.assertNotIn('subject', self.provenancesCreated[0])
109
110
    def test_Calls_reconfigureOrGetConfiguration_on_dependencies(self):
111
        outOpts = Mock()
112
        outOpts.dryrun = True
113
        self.dependencies.reconfigureOrGetConfiguration.return_value = outOpts
114
        provenance = self.log(['/p/f1'], 'bla', ['/p/f2'], transient=True)
115
        self.dependencies.reconfigureOrGetConfiguration.assert_called_with(
116
            self.opts)
117
118
    def test_Can_pass_multiple_new_files(self):
119
        parents = ['p1','p2']
120
        new = ['/p/f2','/p/f3']
121
        trans = 'Something cool'
122
        self.locationFactory.completeString.side_effect = lambda p: 'l:'+p
123
        self.log(new, trans, parents)
124
        self.assertEqual(self.provenancesCreated[0]['parents'], ['l:p1','l:p2'])
125
        self.assertEqual(self.provenancesCreated[1]['parents'], ['l:p1','l:p2'])
126
127
    def test_Add_parent_if_parent_unknown(self):
128
        self.repo.knowsByLocation.return_value = False
129
        parent = '/p/f1'
130
        parents = [parent]
131
        provenance = self.log('new', 'trans', parents)
132
        self.listener.addUnknownParent.assert_called_with(parent)
133
        self.add.assert_any_call(parent)
134
135
    def test_Finds_parent_provenance_using_completedString(self):
136
        self.locationFactory.completeString.side_effect = lambda p: 'l:'+p
137
        parent = '/p/f1'
138
        parents = [parent]
139
        provenance = self.log('new', 'trans', parents)
140
        self.repo.knowsByLocation.assert_called_with(self.provenancesCreated[0]['parents'][0])
141
        self.repo.byLocation.assert_called_with(self.provenancesCreated[0]['parents'][0])
142
        
143
144