source: qesdi/graphplotter/trunk/graphplotter/tests/unit/test_data_reader.py @ 6313

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/graphplotter/trunk/graphplotter/tests/unit/test_data_reader.py@6313
Revision 6313, 5.1 KB checked in by pnorton, 10 years ago (diff)

First attempt at getting the buildplot action to work.

Line 
1'''
2Created on 14 Jan 2010
3
4@author: pnorton
5'''
6
7from graphplotter.lib.data_reader import DataReader
8from mock import patch, Mock
9
10class TestDataReader(object):
11   
12    def setUp(self):
13       
14        self.file = '/path/to/data/file.nc'
15        self.variable = 'variable'
16        self.axis = 'axisA'
17        self.selection = {'axisB':'apple', 'axisC':'orange', 'axisD':40}
18        self.axisLookup = {'axisB':'axisB_var', 'axisC':'axisC_var'}
19       
20        self.reader  = DataReader(self.file, self.axisLookup)
21   
22   
23    def _buildMockVariable(self):
24        mockVariable = Mock()
25       
26        # create a list of mock axis like object to return from the getAxisList method
27        mockAxisList = []
28        for id in  ['axisA', 'axisB', 'axisC', 'axisD']:
29            mockAxis = Mock()
30            mockAxis.id = id
31            mockAxisList.append(mockAxis)
32                 
33        mockVariable.getAxisList.return_value = mockAxisList
34       
35        # set the code so that getAxis returns some data
36        mockVariable.getAxis.return_value = [1,2,3,4,5]
37       
38        return mockVariable
39   
40    def _setMockFHSideEffect(self, mockFH, mockVariable):
41       
42        def fhCalled(name):
43            if name == self.variable:
44                return mockVariable
45            elif name == 'axisB_var':
46                return ['apple', 'pear','bannana']
47            elif name == 'axisC_var':
48                return ['red','orange','yellow']
49           
50        mockFH.side_effect = fhCalled       
51   
52    @patch('graphplotter.lib.data_reader.cdms', spec=True)
53    def test_001_readsTheXYDataCorrectly(self, mockCDMS):
54       
55        mockFH = mockCDMS.open.return_value
56       
57        mockVariable = self._buildMockVariable()
58       
59        self._setMockFHSideEffect(mockFH, mockVariable)
60               
61        xdata, ydata = self.reader.getData(self.variable, self.axis, self.selection)
62   
63        #opens the file
64        assert mockCDMS.open.called
65        assert mockCDMS.open.call_args == ( (self.file,), {})
66       
67        # getAxisIndex called with the right axis
68        assert mockVariable.getAxisIndex.called
69        assert mockVariable.getAxisIndex.call_args == ( (self.axis,), {})
70       
71        #getAxis called with the index
72        assert mockVariable.getAxis.called
73        assert mockVariable.getAxis.call_args == ( (mockVariable.getAxisIndex.return_value,) , {})
74       
75        #builds the selection keywords
76        assert xdata == mockVariable.getAxis.return_value
77        assert ydata == mockVariable.return_value
78   
79    @patch('graphplotter.lib.data_reader.cdms', spec=True)
80    def test_002_selectsDataCorrectly(self, mockCDMS):
81       
82        # checks that the correct selection arguments are passed into
83        # the variable to retrieve the desired ydata
84       
85        mockFH = mockCDMS.open.return_value
86       
87        mockVariable = self._buildMockVariable()
88       
89        self._setMockFHSideEffect(mockFH, mockVariable)
90       
91        xdata, ydata = self.reader.getData(self.variable, self.axis, self.selection)
92       
93        assert xdata == mockVariable.getAxis.return_value
94        assert ydata == mockVariable.return_value
95       
96        assert mockVariable.call_args == ((), {'axisB': 0, 'axisC': 1, 'axisD':40, 'squeeze':1})
97       
98    @patch('graphplotter.lib.data_reader.cdms', spec=True)
99    def test_003_getsVariableNames(self, mockCDMS):
100               
101        mockFH = mockCDMS.open.return_value
102       
103        assert mockFH.listvariables.return_value == self.reader.getVariableNames()
104       
105    @patch('graphplotter.lib.data_reader.cdms', spec=True)
106    def test_004_getsAxisNamesForVariable(self, mockCDMS):
107               
108        mockFH = mockCDMS.open.return_value
109       
110        mockFH().getAxisIds.return_value = ['axisA','axisB','axisC','axisD']
111       
112        assert mockFH().getAxisIds.return_value == self.reader.getAxisNames('variable1')
113       
114        assert mockFH.called
115        assert mockFH.call_args == (('variable1',), {})
116     
117    @patch('graphplotter.lib.data_reader.cdms', spec=True)
118    def test_006_getAxisValues(self, mockCDMS):
119       
120        mockFH = mockCDMS.open.return_value
121       
122        mockVar = Mock()
123        mockVar.getAxis.return_value = [1,2,3,4,5]
124       
125        def fhOpenVar(name):
126            if name == 'var1':
127                return mockVar
128            elif name == 'axisB_var':
129                return ['one','two','three']
130            else:
131                raise Exception("Unknown variable %s" % (name,))
132           
133        mockFH.side_effect = fhOpenVar
134       
135        # test for an axis with a lookup variable
136        bValues = self.reader.getAxisValues('var1','axisB', )
137        assert bValues == ['one','two','three']
138       
139        # test for an axis without a lookup variable
140        dValues = self.reader.getAxisValues('var1','axisD', )
141        assert dValues == [1,2,3,4,5] 
142
143        assert mockVar.getAxisIndex.called
144        assert mockVar.getAxisIndex.call_args == (('axisD',), {})
145       
146        assert mockVar.getAxis.called
147        assert mockVar.getAxis.call_args == ((mockVar.getAxisIndex.return_value,), {})
148       
149   
Note: See TracBrowser for help on using the repository browser.