tests.unit.test_core.test_napps_base   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 205
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 117
dl 0
loc 205
rs 10
c 0
b 0
f 0
wmc 24

23 Methods

Rating   Name   Duplication   Size   Complexity  
A TestNapp.test__str__() 0 3 1
A TestNapp.setUp() 0 6 1
A TestNapp.test__repr__() 0 3 1
A TestNapp.test_uri() 0 4 1
A TestNapp.test_id() 0 3 1
A TestNapp.test_match() 0 4 2
A TestNapp.test_create_from_json() 0 16 1
A TestNapp.test_uri__false() 0 4 1
A TestKytosNApp.test_execute_as_loop_and_run() 0 8 1
A TestNapp.test_package_url__none() 0 4 1
A KytosNAppChild.shutdown() 0 2 1
A TestNapp.test_download__none() 0 6 1
A TestKytosNApp.test_napp_id() 0 3 1
A TestNapp.test_create_from_uri() 0 8 1
A TestKytosNApp.test_shutdown_handler() 0 7 1
A TestNapp.test_package_url() 0 3 1
A TestNapp.test_create_from_uri__not() 0 5 1
A KytosNAppChild.execute() 0 2 1
A TestNapp.test_create_from_dict() 0 10 1
A KytosNAppChild.setup() 0 2 1
A TestNapp.test_download() 0 22 1
A TestKytosNApp.setUp() 0 19 1
A TestKytosNApp.test_load_json() 0 17 1
1
"""kytos.core.napps tests."""
2
import unittest
3
from unittest.mock import MagicMock, patch
4
5
from kytos.core.napps import KytosNApp, NApp
6
7
8
class TestNapp(unittest.TestCase):
9
    """NApp tests."""
10
11
    def setUp(self):
12
        """Execute steps before each tests."""
13
        self.napp = NApp(username='kytos', name='napp', version='1.0',
14
                         repository='any')
15
        self.napp.description = 'desc'
16
        self.napp.tags = ['tag1', 'tag2']
17
18
    def test__str__(self):
19
        """Test __str__ method."""
20
        self.assertEqual(str(self.napp), 'kytos/napp')
21
22
    def test__repr__(self):
23
        """Test __repr__ method."""
24
        self.assertEqual(repr(self.napp), f'NApp(kytos/napp)')
25
26
    def test_id(self):
27
        """Test id property."""
28
        self.assertEqual(self.napp.id, 'kytos/napp')
29
30
    @patch('kytos.core.napps.NApp._has_valid_repository', return_value=True)
31
    def test_uri(self, _):
32
        """Test uri property."""
33
        self.assertEqual(self.napp.uri, 'any/kytos/napp-1.0')
34
35
    @patch('kytos.core.napps.NApp._has_valid_repository', return_value=False)
36
    def test_uri__false(self, _):
37
        """Test uri property when repository is invalid."""
38
        self.assertEqual(self.napp.uri, '')
39
40
    def test_package_url(self):
41
        """Test package_url property."""
42
        self.assertEqual(self.napp.package_url, 'any/kytos/napp-1.0.napp')
43
44
    @patch('kytos.core.napps.NApp._has_valid_repository', return_value=False)
45
    def test_package_url__none(self, _):
46
        """Test package_url property when uri does not exist."""
47
        self.assertEqual(self.napp.package_url, '')
48
49
    def test_create_from_uri(self):
50
        """Test create_from_uri method."""
51
        napp = NApp.create_from_uri('file://any/kytos/napp:1.0')
52
53
        self.assertEqual(napp.username, 'kytos')
54
        self.assertEqual(napp.name, 'napp')
55
        self.assertEqual(napp.version, '1.0')
56
        self.assertEqual(napp.repository, 'file://any')
57
58
    def test_create_from_uri__not(self):
59
        """Test create_from_uri method when uri does not match."""
60
        napp = NApp.create_from_uri('')
61
62
        self.assertIsNone(napp)
63
64
    @patch('builtins.open')
65
    def test_create_from_json(self, mock_open):
66
        """Test create_from_json method."""
67
        data_file = MagicMock()
68
        data_file.read.return_value = '{"username": "kytos", \
69
                                        "name": "napp", \
70
                                        "version": "1.0", \
71
                                        "repository": "any"}'
72
73
        mock_open.return_value.__enter__.return_value = data_file
74
        napp = NApp.create_from_json('filename')
75
76
        self.assertEqual(napp.username, 'kytos')
77
        self.assertEqual(napp.name, 'napp')
78
        self.assertEqual(napp.version, '1.0')
79
        self.assertEqual(napp.repository, 'any')
80
81
    def test_create_from_dict(self):
82
        """Test create_from_dict method."""
83
        data = {'username': 'kytos', 'name': 'napp', 'version': '1.0',
84
                'repository': 'any'}
85
        napp = NApp.create_from_dict(data)
86
87
        self.assertEqual(napp.username, 'kytos')
88
        self.assertEqual(napp.name, 'napp')
89
        self.assertEqual(napp.version, '1.0')
90
        self.assertEqual(napp.repository, 'any')
91
92
    def test_match(self):
93
        """Test match method."""
94
        for pattern in ['kytos/napp', 'desc', 'tag1', 'tag2']:
95
            self.assertTrue(self.napp.match(pattern))
96
97
    @patch('os.mkdir')
98
    @patch('tarfile.open')
99
    @patch('builtins.open')
100
    @patch('urllib.request.urlretrieve', return_value=['filename'])
101
    @patch('kytos.core.napps.base.randint', return_value=123)
102
    @patch('kytos.core.napps.base.Path.unlink')
103
    @patch('kytos.core.napps.base.Path.stem', 'stem')
104
    def test_download(self, *args):
105
        """Test download method."""
106
        (_, _, _, mock_open, mock_tarfile_open, mock_mkdir) = args
107
        tar = MagicMock()
108
        repo_file = MagicMock()
109
110
        mock_open.return_value.__enter__.return_value = repo_file
111
        mock_tarfile_open.return_value.__enter__.return_value = tar
112
113
        extracted = self.napp.download()
114
115
        mock_mkdir.assert_called_with('/tmp/kytos-napp-stem-123')
116
        tar.extractall.assert_called_with('/tmp/kytos-napp-stem-123')
117
        repo_file.write.assert_called_with('any\n')
118
        self.assertEqual(str(extracted), '/tmp/kytos-napp-stem-123')
119
120
    @patch('kytos.core.napps.NApp._has_valid_repository', return_value=False)
121
    def test_download__none(self, _):
122
        """Test download method when package_url does not exist."""
123
        extracted = self.napp.download()
124
125
        self.assertIsNone(extracted)
126
127
128
# pylint: disable=no-member
129
class KytosNAppChild(KytosNApp):
130
    """KytosNApp generic class."""
131
132
    def setup(self):
133
        """Setup NApp."""
134
135
    def execute(self):
136
        """Execute NApp."""
137
138
    def shutdown(self):
139
        """End of the NApp."""
140
141
142
# pylint: disable=protected-access
143
class TestKytosNApp(unittest.TestCase):
144
    """KytosNApp tests."""
145
146
    # pylint: disable=arguments-differ
147
    @patch('kytos.core.napps.base.Event')
148
    @patch('builtins.open')
149
    def setUp(self, *args):
150
        """Execute steps before each tests."""
151
        (mock_open, mock_event) = args
152
        self.event = MagicMock()
153
        mock_event.return_value = self.event
154
155
        data_file = MagicMock()
156
        data_file.read.return_value = '{"username": "kytos", \
157
                                        "name": "napp", \
158
                                        "version": "1.0", \
159
                                        "repository": "any"}'
160
161
        mock_open.return_value.__enter__.return_value = data_file
162
163
        self.kytos_napp = KytosNAppChild(MagicMock())
164
        self.kytos_napp.execute = MagicMock()
165
        self.kytos_napp.shutdown = MagicMock()
166
167
    def test_napp_id(self):
168
        """Test napp_id property."""
169
        self.assertEqual(self.kytos_napp.napp_id, 'kytos/napp')
170
171
    @patch('builtins.open')
172
    def test_load_json(self, mock_open):
173
        """Test _load_json method."""
174
        data_file = MagicMock()
175
        data_file.read.return_value = '{"username": "kytos", \
176
                                        "name": "napp", \
177
                                        "version": "1.0", \
178
                                        "repository": "any"}'
179
180
        mock_open.return_value.__enter__.return_value = data_file
181
182
        self.kytos_napp._load_json()
183
184
        self.assertEqual(self.kytos_napp.username, 'kytos')
185
        self.assertEqual(self.kytos_napp.name, 'napp')
186
        self.assertEqual(self.kytos_napp.version, '1.0')
187
        self.assertEqual(self.kytos_napp.repository, 'any')
188
189
    def test_execute_as_loop_and_run(self):
190
        """Test execute_as_loop and run methods."""
191
        self.event.is_set.side_effect = [False, True]
192
        self.kytos_napp.execute_as_loop(1)
193
194
        self.kytos_napp.run()
195
196
        self.assertEqual(self.kytos_napp.execute.call_count, 2)
197
198
    def test_shutdown_handler(self):
199
        """Test _shutdown_handler method."""
200
        self.event.is_set.return_value = False
201
202
        self.kytos_napp._shutdown_handler(MagicMock())
203
204
        self.kytos_napp.shutdown.assert_called_once()
205