Refactor metrics handling and improve logging
- Removed the MetricsManager initialization from `run_helper.py` to avoid duplication, as metrics are now handled in `main.py`. - Updated logging levels in `server_prometheus.py` and `metrics_middleware.py` to use debug instead of info for less critical messages. - Added metrics configuration to `BaseDependencyFactory` for better management of metrics settings. - Deleted the obsolete `metrics_exporter.py` file to streamline the codebase. - Updated various tests to reflect changes in the metrics handling and ensure proper functionality.
This commit is contained in:
@@ -19,7 +19,8 @@ class TestAdminService:
|
||||
self.mock_db = Mock()
|
||||
self.admin_service = AdminService(self.mock_db)
|
||||
|
||||
def test_get_last_users_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_last_users_success(self):
|
||||
"""Тест успешного получения списка последних пользователей"""
|
||||
# Arrange
|
||||
# Формат данных: кортежи (full_name, user_id) как возвращает БД
|
||||
@@ -27,10 +28,10 @@ class TestAdminService:
|
||||
('User One', 1), # (full_name, user_id)
|
||||
('User Two', 2) # (full_name, user_id)
|
||||
]
|
||||
self.mock_db.get_last_users_from_db.return_value = mock_users_data
|
||||
self.mock_db.get_last_users = AsyncMock(return_value=mock_users_data)
|
||||
|
||||
# Act
|
||||
result = self.admin_service.get_last_users()
|
||||
result = await self.admin_service.get_last_users()
|
||||
|
||||
# Assert
|
||||
assert len(result) == 2
|
||||
@@ -41,17 +42,18 @@ class TestAdminService:
|
||||
assert result[1].username == 'Неизвестно' # username не возвращается из БД
|
||||
assert result[1].full_name == 'User Two'
|
||||
|
||||
def test_get_user_by_username_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_user_by_username_success(self):
|
||||
"""Тест успешного получения пользователя по username"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
username = "test_user"
|
||||
full_name = "Test User"
|
||||
self.mock_db.get_user_id_by_username.return_value = user_id
|
||||
self.mock_db.get_full_name_by_id.return_value = full_name
|
||||
self.mock_db.get_user_id_by_username = AsyncMock(return_value=user_id)
|
||||
self.mock_db.get_full_name_by_id = AsyncMock(return_value=full_name)
|
||||
|
||||
# Act
|
||||
result = self.admin_service.get_user_by_username(username)
|
||||
result = await self.admin_service.get_user_by_username(username)
|
||||
|
||||
# Assert
|
||||
assert result is not None
|
||||
@@ -59,27 +61,35 @@ class TestAdminService:
|
||||
assert result.username == username
|
||||
assert result.full_name == full_name
|
||||
|
||||
def test_get_user_by_username_not_found(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_user_by_username_not_found(self):
|
||||
"""Тест получения пользователя по несуществующему username"""
|
||||
# Arrange
|
||||
username = "nonexistent_user"
|
||||
self.mock_db.get_user_id_by_username.return_value = None
|
||||
self.mock_db.get_user_id_by_username = AsyncMock(return_value=None)
|
||||
|
||||
# Act
|
||||
result = self.admin_service.get_user_by_username(username)
|
||||
result = await self.admin_service.get_user_by_username(username)
|
||||
|
||||
# Assert
|
||||
assert result is None
|
||||
|
||||
def test_get_user_by_id_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_user_by_id_success(self):
|
||||
"""Тест успешного получения пользователя по ID"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
user_info = {'username': 'test_user', 'full_name': 'Test User'}
|
||||
self.mock_db.get_user_info_by_id.return_value = user_info
|
||||
from database.models import User as DBUser
|
||||
user_info = DBUser(
|
||||
user_id=user_id,
|
||||
first_name="Test",
|
||||
full_name="Test User",
|
||||
username="test_user"
|
||||
)
|
||||
self.mock_db.get_user_by_id = AsyncMock(return_value=user_info)
|
||||
|
||||
# Act
|
||||
result = self.admin_service.get_user_by_id(user_id)
|
||||
result = await self.admin_service.get_user_by_id(user_id)
|
||||
|
||||
# Assert
|
||||
assert result is not None
|
||||
@@ -87,45 +97,51 @@ class TestAdminService:
|
||||
assert result.username == 'test_user'
|
||||
assert result.full_name == 'Test User'
|
||||
|
||||
def test_get_user_by_id_not_found(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_user_by_id_not_found(self):
|
||||
"""Тест получения пользователя по несуществующему ID"""
|
||||
# Arrange
|
||||
user_id = 999
|
||||
self.mock_db.get_user_info_by_id.return_value = None
|
||||
self.mock_db.get_user_by_id = AsyncMock(return_value=None)
|
||||
|
||||
# Act
|
||||
result = self.admin_service.get_user_by_id(user_id)
|
||||
result = await self.admin_service.get_user_by_id(user_id)
|
||||
|
||||
# Assert
|
||||
assert result is None
|
||||
|
||||
def test_validate_user_input_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_validate_user_input_success(self):
|
||||
"""Тест успешной валидации ID пользователя"""
|
||||
# Act
|
||||
result = self.admin_service.validate_user_input("123")
|
||||
result = await self.admin_service.validate_user_input("123")
|
||||
|
||||
# Assert
|
||||
assert result == 123
|
||||
|
||||
def test_validate_user_input_invalid_number(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_validate_user_input_invalid_number(self):
|
||||
"""Тест валидации некорректного ID"""
|
||||
# Act & Assert
|
||||
with pytest.raises(InvalidInputError, match="ID пользователя должен быть числом"):
|
||||
self.admin_service.validate_user_input("abc")
|
||||
await self.admin_service.validate_user_input("abc")
|
||||
|
||||
def test_validate_user_input_negative_number(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_validate_user_input_negative_number(self):
|
||||
"""Тест валидации отрицательного ID"""
|
||||
# Act & Assert
|
||||
with pytest.raises(InvalidInputError, match="ID пользователя должен быть положительным числом"):
|
||||
self.admin_service.validate_user_input("-1")
|
||||
await self.admin_service.validate_user_input("-1")
|
||||
|
||||
def test_validate_user_input_zero(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_validate_user_input_zero(self):
|
||||
"""Тест валидации нулевого ID"""
|
||||
# Act & Assert
|
||||
with pytest.raises(InvalidInputError, match="ID пользователя должен быть положительным числом"):
|
||||
self.admin_service.validate_user_input("0")
|
||||
await self.admin_service.validate_user_input("0")
|
||||
|
||||
def test_ban_user_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_ban_user_success(self):
|
||||
"""Тест успешной блокировки пользователя"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
@@ -133,17 +149,18 @@ class TestAdminService:
|
||||
reason = "Test ban"
|
||||
ban_days = 7
|
||||
|
||||
self.mock_db.check_user_in_blacklist.return_value = False
|
||||
self.mock_db.set_user_blacklist.return_value = None
|
||||
self.mock_db.check_user_in_blacklist = AsyncMock(return_value=False)
|
||||
self.mock_db.set_user_blacklist = AsyncMock(return_value=None)
|
||||
|
||||
# Act
|
||||
self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
await self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
|
||||
# Assert
|
||||
self.mock_db.check_user_in_blacklist.assert_called_once_with(user_id)
|
||||
self.mock_db.set_user_blacklist.assert_called_once()
|
||||
|
||||
def test_ban_user_already_banned(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_ban_user_already_banned(self):
|
||||
"""Тест попытки заблокировать уже заблокированного пользователя"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
@@ -151,13 +168,14 @@ class TestAdminService:
|
||||
reason = "Test ban"
|
||||
ban_days = 7
|
||||
|
||||
self.mock_db.check_user_in_blacklist.return_value = True
|
||||
self.mock_db.check_user_in_blacklist = AsyncMock(return_value=True)
|
||||
|
||||
# Act & Assert
|
||||
with pytest.raises(UserAlreadyBannedError, match=f"Пользователь {user_id} уже заблокирован"):
|
||||
self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
await self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
|
||||
def test_ban_user_permanent(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_ban_user_permanent(self):
|
||||
"""Тест постоянной блокировки пользователя"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
@@ -165,23 +183,24 @@ class TestAdminService:
|
||||
reason = "Permanent ban"
|
||||
ban_days = None
|
||||
|
||||
self.mock_db.check_user_in_blacklist.return_value = False
|
||||
self.mock_db.set_user_blacklist.return_value = None
|
||||
self.mock_db.check_user_in_blacklist = AsyncMock(return_value=False)
|
||||
self.mock_db.set_user_blacklist = AsyncMock(return_value=None)
|
||||
|
||||
# Act
|
||||
self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
await self.admin_service.ban_user(user_id, username, reason, ban_days)
|
||||
|
||||
# Assert
|
||||
self.mock_db.set_user_blacklist.assert_called_once_with(user_id, username, reason, None)
|
||||
self.mock_db.set_user_blacklist.assert_called_once_with(user_id, None, reason, None)
|
||||
|
||||
def test_unban_user_success(self):
|
||||
@pytest.mark.asyncio
|
||||
async def test_unban_user_success(self):
|
||||
"""Тест успешной разблокировки пользователя"""
|
||||
# Arrange
|
||||
user_id = 123
|
||||
self.mock_db.delete_user_blacklist.return_value = None
|
||||
self.mock_db.delete_user_blacklist = AsyncMock(return_value=None)
|
||||
|
||||
# Act
|
||||
self.admin_service.unban_user(user_id)
|
||||
await self.admin_service.unban_user(user_id)
|
||||
|
||||
# Assert
|
||||
self.mock_db.delete_user_blacklist.assert_called_once_with(user_id)
|
||||
|
||||
Reference in New Issue
Block a user