TestUserController.setup_method()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 1
dl 0
loc 7
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
"""Test kytos.core.auth.UserController"""
2
3 1
from datetime import datetime
4 1
from unittest.mock import MagicMock
5
6 1
import pytest
7 1
from pydantic import ValidationError
8 1
from pymongo.errors import DuplicateKeyError
9
10 1
from kytos.core.auth import UserController
11 1
from kytos.core.user import UserDoc
12
13
14 1
class TestUserController:
15
    """Test UserController"""
16
17 1
    def setup_method(self) -> None:
18
        """Execute steps before each steps."""
19 1
        self.user = UserController(MagicMock())
20 1
        self.user_data = {
21
            "username": "authtempuser",
22
            "email": "[email protected]",
23
            "password": "Password1234",
24
        }
25
26 1
    def test_boostrap_indexes(self):
27
        """Test bootstrap_indexes"""
28 1
        self.user.bootstrap_indexes()
29 1
        expected_db = [
30
            ('users', [('username', 1)])
31
        ]
32 1
        mock = self.user.mongo.bootstrap_index
33 1
        assert mock.call_count == len(expected_db)
34 1
        indexes = [(v[0][0], v[0][1]) for v in mock.call_args_list]
35 1
        assert expected_db == indexes
36
37 1
    def test_create_user(self):
38
        """Test create_user"""
39 1
        self.user.create_user(self.user_data)
40 1
        assert self.user.db.users.insert_one.call_count == 1
41 1
        arg1 = self.user.db.users.insert_one.call_args[0]
42 1
        assert arg1[0]['username'] == "authtempuser"
43 1
        assert arg1[0]["email"] == "[email protected]"
44 1
        assert arg1[0]["password"] is not None
45 1
        assert isinstance(arg1[0]["inserted_at"], datetime)
46 1
        assert isinstance(arg1[0]["updated_at"], datetime)
47 1
        assert arg1[0]["deleted_at"] is None
48 1
        assert arg1[0]["hash"]["salt"] is not None
49 1
        assert arg1[0]["hash"]["n"] == 8192
50 1
        assert arg1[0]["hash"]["r"] == 8
51 1
        assert arg1[0]["hash"]["p"] == 1
52
53 1
    def test_create_user_key_duplicate(self):
54
        """Test create_user with DuplicateKeyError"""
55 1
        self.user.db.users.insert_one.side_effect = DuplicateKeyError(0)
56 1
        with pytest.raises(DuplicateKeyError):
57 1
            self.user.create_user(self.user_data)
58
59 1
    def test_create_user_validation_error(self):
60
        """Test create_user with ValidationError"""
61 1
        wrong_pwd = {
62
            'username': "mock_user",
63
            'email': "[email protected]",
64
            'password': 'wrong_pwd'
65
        }
66 1
        with pytest.raises(ValidationError):
67 1
            self.user.create_user(wrong_pwd)
68
69 1
    def test_delete_user(self):
70
        """Test delete_user"""
71 1
        self.user.delete_user('name')
72 1
        assert self.user.db.users.find_one_and_update.call_count == 1
73 1
        arg1, arg2 = self.user.db.users.find_one_and_update.call_args[0]
74 1
        assert arg1 == {"username": "name"}
75 1
        assert list(arg2.keys()) == ["$set"]
76 1
        assert list(arg2["$set"].keys()) == ["state", "deleted_at"]
77
78 1
    def test_update_user(self):
79
        """Test update_user"""
80 1
        data = {'password': 'Mock_password1'}
81 1
        self.user.update_user('name', data)
82 1
        assert self.user.db.users.find_one_and_update.call_count == 1
83 1
        arg1, arg2 = self.user.db.users.find_one_and_update.call_args[0]
84 1
        assert arg1 == {"username": 'name'}
85 1
        assert isinstance(arg2, dict)
86 1
        assert arg2["$set"]["hash"] is not None
87
88 1
    def test_update_user_error(self):
89
        """Test update_user error handling"""
90 1
        data = {'password': 'password'}
91 1
        with pytest.raises(ValidationError):
92 1
            self.user.update_user('name', data)
93
94 1
    def test_update_user_duplicate(self):
95
        """Test update_user with DuplicateKeyError"""
96 1
        db_base = self.user.db
97 1
        db_base.users.find_one_and_update.side_effect = DuplicateKeyError(0)
98 1
        with pytest.raises(DuplicateKeyError):
99 1
            self.user.update_user({}, {"username": "mock"})
100
101 1
    def test_get_user(self):
102
        """Test get_user"""
103 1
        self.user.db.users.aggregate.return_value = [self.user_data]
104 1
        result = self.user.get_user('name')
105 1
        assert self.user.db.users.aggregate.call_count == 1
106 1
        arg = self.user.db.users.aggregate.call_args[0]
107 1
        expected_arg = [
108
            {"$match": {"username": "name"}},
109
            {"$project": UserDoc.projection()},
110
            {"$limit": 1}
111
        ]
112 1
        assert arg[0] == expected_arg
113 1
        assert result == self.user_data
114
115 1
    def test_get_user_empty(self):
116
        """Test get_user with empty return"""
117 1
        self.user.db.users.aggregate.return_value = []
118 1
        user = self.user.get_user('name')
119 1
        assert not user
120
121 1
    def test_get_user_nopw(self):
122
        """Test get_user_nopw"""
123 1
        self.user.db.users.aggregate.return_value = [self.user_data]
124 1
        result = self.user.get_user_nopw('name')
125 1
        assert self.user.db.users.aggregate.call_count == 1
126 1
        arg = self.user.db.users.aggregate.call_args[0]
127 1
        expected_arg = [
128
            {"$match": {"username": "name"}},
129
            {"$project": UserDoc.projection_nopw()},
130
            {"$limit": 1}
131
        ]
132 1
        assert arg[0] == expected_arg
133 1
        assert result == self.user_data
134
135 1
    def test_get_user_nopw_empty(self):
136
        """Test get_user_nopw with empty return"""
137 1
        self.user.db.users.aggregate.return_value = []
138 1
        user = self.user.get_user_nopw('name')
139 1
        assert not user
140
141 1
    def test_get_users(self):
142
        """Test get_users"""
143 1
        assert 'users' in self.user.get_users()
144 1
        assert self.user.db.users.aggregate.call_count == 1
145 1
        arg = self.user.db.users.aggregate.call_args[0]
146 1
        expected_arg = [{"$project": UserDoc.projection_nopw()}]
147
        assert arg[0] == expected_arg
148