Completed
Pull Request — master (#112)
by Jasper
01:09
created

test_Copies_fields_from_known_parent()   B

Complexity

Conditions 3

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 31
rs 8.8571
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_Determines_user_and_logs_them(self):
88
        self.dependencies.users.determineUser.return_value = 'paprika'
89
        self.log('new', 'trans', 'old', user='mononoko')
90
        self.dependencies.users.determineUser.assert_called_with('mononoko')
91
        self.assertEqual(self.provenancesCreated[0]['user'],'paprika')
92
93
    def test_Script_added_to_provenance(self):
94
        parents = ['/p/f1']
95
        new = '/p/f2'
96
        trans = 'Something cool'
97
        script = '/p/test.py'
98
        self.log(new, trans, parents, script=script)
99
        self.assertEqual(self.provenancesCreated[0]['script'], script)
100
101
    def test_Accepts_and_processes_custom_provenance(self):
102
        parents = ['/p/f1']
103
        new = '/p/f2'
104
        trans = 'Something cool'
105
        p = {'akey':'avalue'}
106
        self.log(new, trans, parents, provenance=p)
107
        self.assertEqual(self.provenancesCreated[0]['akey'], 'avalue')
108
109
    def test_Doesnt_complain_if_parent_is_missing_basic_fields(self):
110
        img = Mock()
111
        img.provenance = {'acquired':dt.now()} #missing subject
112
        self.repo.byLocation.return_value = img
113
        provenance = self.log('new', 'trans', ['/p/f1parent'])
114
        self.assertNotIn('subject', self.provenancesCreated[0])
115
116
    def test_Calls_reconfigureOrGetConfiguration_on_dependencies(self):
117
        outOpts = Mock()
118
        outOpts.dryrun = True
119
        self.dependencies.reconfigureOrGetConfiguration.return_value = outOpts
120
        provenance = self.log(['/p/f1'], 'bla', ['/p/f2'], transient=True)
121
        self.dependencies.reconfigureOrGetConfiguration.assert_called_with(
122
            self.opts)
123
124
    def test_Can_pass_multiple_new_files(self):
125
        parents = ['p1','p2']
126
        new = ['/p/f2','/p/f3']
127
        trans = 'Something cool'
128
        self.locationFactory.completeString.side_effect = lambda p: 'l:'+p
129
        self.log(new, trans, parents)
130
        self.assertEqual(self.provenancesCreated[0]['parents'], ['l:p1','l:p2'])
131
        self.assertEqual(self.provenancesCreated[1]['parents'], ['l:p1','l:p2'])
132
133
    def test_Add_parent_if_parent_unknown(self):
134
        self.repo.knowsByLocation.return_value = False
135
        parent = '/p/f1'
136
        parents = [parent]
137
        provenance = self.log('new', 'trans', parents)
138
        self.listener.addUnknownParent.assert_called_with(parent)
139
        self.add.assert_any_call(parent)
140
141
    def test_Finds_parent_provenance_using_completedString(self):
142
        self.locationFactory.completeString.side_effect = lambda p: 'l:'+p
143
        parent = '/p/f1'
144
        parents = [parent]
145
        provenance = self.log('new', 'trans', parents)
146
        self.repo.knowsByLocation.assert_called_with(self.provenancesCreated[0]['parents'][0])
147
        self.repo.byLocation.assert_called_with(self.provenancesCreated[0]['parents'][0])
148
        
149
150