tests.unit.commands.test_napps_api   A
last analyzed

Complexity

Total Complexity 28

Size/Duplication

Total Lines 349
Duplicated Lines 7.74 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 235
dl 27
loc 349
ccs 232
cts 232
cp 1
rs 10
c 0
b 0
f 0
wmc 28

26 Methods

Rating   Name   Duplication   Size   Complexity  
A TestNAppsAPI.test_install_napps() 0 12 1
A TestNAppsAPI.test_install_napp() 0 9 1
A TestNAppsAPI.test_delete() 0 12 1
A TestNAppsAPI.test_uninstall() 0 13 1
A TestNAppsAPI.test_reload__any() 0 11 1
A TestNAppsAPI.test_reload__error() 0 14 1
A TestNAppsAPI.test_disable_napp() 0 9 1
A TestNAppsAPI.test_enable_napp__success() 0 8 1
A TestNAppsAPI.test_enable__all() 0 15 1
A TestNAppsAPI.test_install() 0 13 1
A TestNAppsAPI.test_enable__any() 0 13 1
A TestNAppsAPI.test_install_napp_error_404() 13 13 2
A TestNAppsAPI.test_reload__all() 0 10 1
A TestNAppsAPI.test_search() 0 12 1
A TestNAppsAPI.test_install_napp_error_400() 14 14 2
A TestNAppsAPI.test_enable_napp__error() 0 8 1
A TestNAppsAPI.test_disable__any() 0 12 1
A TestNAppsAPI.test_create() 0 6 1
A TestNAppsAPI.setUp() 0 3 1
A TestNAppsAPI.test_prepare() 0 9 1
A TestNAppsAPI.test_upload() 0 6 1
A TestNAppsAPI.test_delete__error() 0 19 1
A TestNAppsAPI.test_list() 0 18 1
A TestNAppsAPI.test_enable_napps() 0 13 1
A TestNAppsAPI.test_disable__all() 0 14 1
A TestNAppsAPI.test_print_napps() 0 22 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
"""kytos.cli.commands.napps.api.NAppsAPI tests."""
2 1
import unittest
3 1
from unittest.mock import MagicMock, call, patch
4 1
from urllib.error import HTTPError
5
6 1
import requests
7
8 1
from kytos.cli.commands.napps.api import NAppsAPI
9 1
from kytos.utils.exceptions import KytosException
10
11
12
# pylint: disable=too-many-public-methods
13 1
class TestNAppsAPI(unittest.TestCase):
14
    """Test the class NAppsAPI."""
15
16 1
    def setUp(self):
17
        """Execute steps before each tests."""
18 1
        self.napps_api = NAppsAPI()
19
20 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
21 1
    def test_disable__all(self, mock_napps_manager):
22
        """Test disable method to all napps."""
23 1
        napp = ('user', 'napp', 'version')
24
25 1
        mgr = MagicMock()
26 1
        mgr.get_enabled.return_value = [napp]
27 1
        mock_napps_manager.return_value = mgr
28
29 1
        args = {'all': True}
30 1
        self.napps_api.disable(args)
31
32 1
        mgr.set_napp.assert_called_with(*napp)
33 1
        mgr.disable.assert_called()
34
35 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
36 1
    def test_disable__any(self, mock_napps_manager):
37
        """Test disable method to any napp."""
38 1
        mgr = MagicMock()
39 1
        mock_napps_manager.return_value = mgr
40
41 1
        napp = ('user', 'napp', 'version')
42 1
        args = {'all': False, '<napp>': [napp]}
43 1
        self.napps_api.disable(args)
44
45 1
        mgr.set_napp.assert_called_with(*napp)
46 1
        mgr.disable.assert_called()
47
48 1
    def test_disable_napp(self):
49
        """Test disable_napp method."""
50 1
        mgr = MagicMock()
51 1
        mgr.is_enabled.side_effect = [True, False]
52
53 1
        self.napps_api.disable_napp(mgr)
54 1
        self.napps_api.disable_napp(mgr)
55
56 1
        mgr.disable.assert_called_once()
57
58 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
59 1
    def test_enable__all(self, mock_napps_manager):
60
        """Test enable method to all napps."""
61 1
        napp = ('user', 'napp', 'version')
62
63 1
        mgr = MagicMock()
64 1
        mgr.is_enabled.return_value = False
65 1
        mgr.get_disabled.return_value = [napp]
66 1
        mock_napps_manager.return_value = mgr
67
68 1
        args = {'all': True}
69 1
        self.napps_api.enable(args)
70
71 1
        mgr.set_napp.assert_called_with(*napp)
72 1
        mgr.enable.assert_called()
73
74 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
75 1
    def test_enable__any(self, mock_napps_manager):
76
        """Test enable method to any napp."""
77 1
        mgr = MagicMock()
78 1
        mgr.is_enabled.return_value = False
79 1
        mock_napps_manager.return_value = mgr
80
81 1
        napp = ('user', 'napp', 'version')
82 1
        args = {'all': False, '<napp>': [napp]}
83 1
        self.napps_api.enable(args)
84
85 1
        mgr.set_napp.assert_called_with(*napp)
86 1
        mgr.enable.assert_called()
87
88 1
    def test_enable_napp__success(self):
89
        """Test enable_napp method to success case."""
90 1
        mgr = MagicMock()
91 1
        mgr.is_enabled.return_value = False
92
93 1
        self.napps_api.enable_napp(mgr)
94
95 1
        mgr.enable.assert_called()
96
97 1
    def test_enable_napp__error(self):
98
        """Test enable_napp method to error case."""
99 1
        mgr = MagicMock()
100 1
        mgr.is_enabled.return_value = True
101
102 1
        self.napps_api.enable_napp(mgr)
103
104 1
        mgr.enable.assert_not_called()
105
106 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
107 1
    @patch('kytos.cli.commands.napps.api.NAppsAPI.enable_napp')
108 1
    def test_enable_napps(self, *args):
109
        """Test enable_napps method."""
110 1
        (mock_enable_napp, mock_napps_manager) = args
111 1
        mgr = MagicMock()
112 1
        mock_napps_manager.return_value = mgr
113
114 1
        napp = ('user', 'napp', 'version')
115 1
        self.napps_api.enable_napps([napp])
116
117 1
        mgr.set_napp.assert_called_with(*napp)
118 1
        mock_enable_napp.assert_called_with(mgr)
119
120 1
    @patch('kytos.cli.commands.napps.api.NAppsManager.create_napp')
121 1
    def test_create(self, mock_create_napp):
122
        """Test create method."""
123 1
        self.napps_api.create({})
124
125 1
        mock_create_napp.assert_called()
126
127 1
    @patch('kytos.cli.commands.napps.api.NAppsManager.upload')
128 1
    def test_upload(self, mock_upload):
129
        """Test upload method."""
130 1
        self.napps_api.upload({})
131
132 1
        mock_upload.assert_called()
133
134 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
135 1
    def test_uninstall(self, mock_napps_manager):
136
        """Test uninstall method."""
137 1
        mgr = MagicMock()
138 1
        mgr.is_installed.return_value = True
139 1
        mock_napps_manager.return_value = mgr
140
141 1
        napp = ('user', 'napp', 'version')
142 1
        args = {'<napp>': [napp]}
143 1
        self.napps_api.uninstall(args)
144
145 1
        mgr.set_napp.assert_called_with(*napp)
146 1
        mgr.remote_uninstall.assert_called()
147
148 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
149 1
    def test_install(self, mock_napps_manager):
150
        """Test install method."""
151 1
        mgr = MagicMock()
152 1
        mgr.is_installed.return_value = False
153 1
        mock_napps_manager.return_value = mgr
154
155 1
        napp = ('user', 'napp', 'version')
156 1
        args = {'<napp>': [napp]}
157 1
        self.napps_api.install(args)
158
159 1
        mgr.set_napp.assert_called_with(*napp)
160 1
        mgr.remote_install.assert_called()
161
162 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
163 1
    def test_install_napps(self, mock_napps_manager):
164
        """Test prepare method."""
165 1
        mgr = MagicMock()
166 1
        mgr.is_installed.return_value = False
167 1
        mock_napps_manager.return_value = mgr
168
169 1
        napp = ('user', 'napp', 'version')
170 1
        self.napps_api.install_napps([napp])
171
172 1
        mgr.set_napp.assert_called_with(*napp)
173 1
        mgr.remote_install.assert_called()
174
175 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
176 1
    def test_install_napp(self, mock_napps_manager):
177
        """Test install_napp method."""
178 1
        mgr = MagicMock()
179 1
        mock_napps_manager.return_value = mgr
180
181 1
        self.napps_api.install_napp(mgr)
182
183 1
        mgr.remote_install.assert_called()
184
185 1 View Code Duplication
    @patch('kytos.utils.napps.NAppsManager')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
186 1
    def test_install_napp_error_404(self, mgr):
187
        """Test install_napp method."""
188 1
        mgr = MagicMock()
189
190 1
        url = 'napps.kytos.io'
191 1
        msg = 'The NApp were not found at server.'
192 1
        code = 404
193 1
        hdrs = 'The HTTP response headers'
194 1
        filep = None
195 1
        mgr.remote_install.side_effect = HTTPError(url, code, msg, hdrs, filep)
196 1
        with self.assertRaises(KytosException):
197 1
            self.napps_api.install_napp(mgr)
198
199 1 View Code Duplication
    @patch('kytos.utils.napps.NAppsManager')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
200 1
    def test_install_napp_error_400(self, mgr):
201
        """Test install_napp method."""
202 1
        mgr = MagicMock()
203
204 1
        url = 'napps.kytos.io'
205 1
        msg = 'The NApp were not found at server.'
206 1
        code = 400
207 1
        hdrs = 'The HTTP response headers'
208 1
        filep = None
209 1
        mgr.remote_install.side_effect = HTTPError(url, code, msg, hdrs, filep)
210
211 1
        with self.assertRaises(KytosException):
212 1
            self.napps_api.install_napp(mgr)
213
214 1
    @patch('kytos.cli.commands.napps.api.NAppsManager.search')
215 1
    @patch('kytos.cli.commands.napps.api.NAppsAPI._print_napps')
216 1
    def test_search(self, *args):
217
        """Test search method."""
218 1
        (mock_print, mock_search) = args
219 1
        mock_search.return_value = [{'username': 'kytos', 'name': 'mef_eline',
220
                                     'description': '', 'tags': ['A', 'B']}]
221
222 1
        args = {'<pattern>': '^[a-z]+'}
223 1
        self.napps_api.search(args)
224
225 1
        mock_print.assert_called_with({(('kytos', 'mef_eline'), '')})
226
227 1
    @patch('os.popen')
228 1
    @patch('builtins.print')
229 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
230 1
    def test_print_napps(self, *args):
231
        """Test _print_napps method."""
232 1
        (mock_napps_manager, mock_print, mock_popen) = args
233 1
        napps = [('kytos', 'mef_eline')]
234
235 1
        mock_test = MagicMock()
236 1
        mock_test.read.return_value = '1000 1000'
237 1
        mock_popen.return_value = mock_test
238
239 1
        mgr = MagicMock()
240 1
        mgr.get_enabled.return_value = napps
241 1
        mgr.get_installed.return_value = napps
242 1
        mock_napps_manager.return_value = mgr
243
244
        # pylint: disable=protected-access
245 1
        self.napps_api._print_napps({(('kytos', 'mef_eline'), 'desc')})
246
        # pylint: enable=protected-access
247
248 1
        mock_print.assert_has_calls([call(' [ie]  | kytos/mef_eline | desc')])
249
250 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
251 1
    @patch('kytos.cli.commands.napps.api.NAppsAPI.print_napps')
252 1
    def test_list(self, *args):
253
        """Test list method."""
254 1
        (mock_print, mock_napps_manager) = args
255 1
        napps = [('kytos', 'mef_eline')]
256
257 1
        mgr = MagicMock()
258 1
        mgr.get_version.return_value = '123'
259 1
        mgr.get_description.return_value = 'desc'
260 1
        mgr.get_enabled.return_value = napps
261 1
        mgr.get_installed.return_value = napps
262 1
        mock_napps_manager.return_value = mgr
263
264 1
        self.napps_api.list({})
265
266 1
        expected = [('[ie]', 'kytos/mef_eline:123', 'desc')]
267 1
        mock_print.assert_called_with(expected)
268
269 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
270 1
    def test_delete(self, mock_napps_manager):
271
        """Test delete method."""
272 1
        mgr = MagicMock()
273 1
        mock_napps_manager.return_value = mgr
274
275 1
        napp = ('user', 'napp', 'version')
276 1
        args = {'<napp>': [napp]}
277 1
        self.napps_api.delete(args)
278
279 1
        mgr.set_napp.assert_called_with(*napp)
280 1
        mgr.delete.assert_called()
281
282 1
    @patch('kytos.cli.commands.napps.api.LOG')
283 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
284 1
    def test_delete__error(self, *args):
285
        """Test delete method to error case."""
286 1
        (mock_napps_manager, mock_logger) = args
287 1
        response_1 = MagicMock(status_code=405, content='{"error": "info"}')
288 1
        response_2 = MagicMock(status_code=500, content='{"error": "info"}')
289 1
        mgr = MagicMock()
290 1
        mgr.delete.side_effect = [requests.HTTPError(response=response_1),
291
                                  requests.HTTPError(response=response_2)]
292 1
        mock_napps_manager.return_value = mgr
293
294 1
        napp = ('user', 'napp', 'version')
295 1
        args = {'<napp>': [napp]}
296
297 1
        self.napps_api.delete(args)
298 1
        self.napps_api.delete(args)
299
300 1
        self.assertEqual(mock_logger.error.call_count, 2)
301
302 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
303 1
    def test_prepare(self, mock_napps_manager):
304
        """Test prepare method."""
305 1
        mgr = MagicMock()
306 1
        mock_napps_manager.return_value = mgr
307
308 1
        self.napps_api.prepare(None)
309
310 1
        mgr.prepare.assert_called()
311
312 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
313 1
    def test_reload__all(self, mock_napps_manager):
314
        """Test reload method to all napps."""
315 1
        mgr = MagicMock()
316 1
        mock_napps_manager.return_value = mgr
317
318 1
        args = {'all': True}
319 1
        self.napps_api.reload(args)
320
321 1
        mgr.reload.assert_called()
322
323 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
324 1
    def test_reload__any(self, mock_napps_manager):
325
        """Test reload method to any napp."""
326 1
        mgr = MagicMock()
327 1
        mock_napps_manager.return_value = mgr
328
329 1
        napps = ['A', 'B', 'C']
330 1
        args = {'all': False, '<napp>': napps}
331 1
        self.napps_api.reload(args)
332
333 1
        mgr.reload.assert_called_with(napps)
334
335 1
    @patch('kytos.cli.commands.napps.api.LOG')
336 1
    @patch('kytos.cli.commands.napps.api.NAppsManager')
337 1
    def test_reload__error(self, *args):
338
        """Test reload method to error case."""
339 1
        (mock_napps_manager, mock_logger) = args
340 1
        response = MagicMock(status_code=500, content='{"error": "info"}')
341 1
        mgr = MagicMock()
342 1
        mgr.reload.side_effect = requests.HTTPError(response=response)
343 1
        mock_napps_manager.return_value = mgr
344
345 1
        args = {'all': True}
346 1
        self.napps_api.reload(args)
347
348
        self.assertEqual(mock_logger.error.call_count, 1)
349