Passed
Push — master ( 079712...03014a )
by Humberto
01:32 queued 11s
created

  A

Complexity

Conditions 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nop 2
dl 0
loc 12
rs 9.95
c 0
b 0
f 0
1
"""kytos.utils.decorators tests."""
2
import unittest
3
from unittest.mock import MagicMock, patch
4
5
from kytos.utils.config import KytosConfig
6
from kytos.utils.decorators import kytos_auth
7
8
9
class TestKytosAuth(unittest.TestCase):
10
    """Test the decorator kytos_auth."""
11
12
    def setUp(self):
13
        """Execute steps before each tests."""
14
        self.kytos_auth = kytos_auth(MagicMock())
15
        self.kytos_auth.__get__(MagicMock(), MagicMock())
16
17
        config = KytosConfig('/tmp/.kytosrc').config
18
        config.set('auth', 'user', 'username')
19
        config.set('auth', 'token', 'hash')
20
        self.kytos_auth.config = config
21
22
    @staticmethod
23
    def _expected_response(status_code):
24
        """Expected response mock."""
25
        response = MagicMock()
26
        response.json.return_value = {"hash": "hash"}
27
        response.status_code = status_code
28
        return response
29
30
    @patch('requests.get')
31
    @patch('configparser.ConfigParser.set')
32
    @patch('configparser.ConfigParser.get', return_value='value')
33
    @patch('configparser.ConfigParser.has_option', return_value=False)
34
    @patch('kytos.utils.decorators.getpass', return_value='password')
35
    @patch('builtins.input', return_value='username')
36
    def test__call__(self, *args):
37
        """Test __call__ method."""
38
        (_, _, _, _, mock_set, mock_requests_get) = args
39
        mock_requests_get.return_value = self._expected_response(201)
40
41
        self.kytos_auth.__call__()
42
43
        mock_set.assert_any_call('auth', 'user', 'username')
44
        mock_set.assert_any_call('auth', 'token', 'hash')
45
46
    @patch('requests.get')
47
    @patch('kytos.utils.config.KytosConfig.save_token')
48
    @patch('builtins.input', return_value='username')
49
    @patch('kytos.utils.decorators.getpass', return_value='password')
50
    def test_authenticate_success_and_fail(self, *args):
51
        """Test authenticate method.
52
53
        This test check the fail and success cases. At the first, the 401
54
        status code will cause a fail and after that the 201 status code will
55
        test the success case. The authenticate has to be called twice, once
56
        the test `test_authenticate_success_and_fail` calls `authenticate`
57
        the first time, and the fail case will cause the second call."""
58
        (_, _, _, mock_requests_get) = args
59
        mock_requests_get.side_effect = [self._expected_response(401),
60
                                         self._expected_response(201)]
61
62
        authenticate = self.kytos_auth.authenticate
63
        self.kytos_auth.authenticate = MagicMock(side_effect=authenticate)
64
65
        self.kytos_auth.authenticate()
66
67
        call_count = self.kytos_auth.authenticate.call_count
68
69
        self.assertEqual(call_count, 2)
70