diff --git a/tests/conftest.py b/tests/conftest.py index e1b31cbd..962debfe 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,17 +5,11 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import StaticPool import time -import uuid -from starlette.testclient import TestClient import requests import subprocess -import signal -import asyncio -from typing import Optional, Generator, AsyncGenerator -from contextlib import asynccontextmanager +from typing import Optional from unittest.mock import patch -from storage.redis import redis from orm.base import BaseModel as Base @@ -589,32 +583,38 @@ def redis_client(): @pytest.fixture(autouse=True) def mock_redis_if_unavailable(): """Автоматически мокает Redis если он недоступен""" - # В CI окружении всегда мокаем Redis - if os.getenv('CI') or os.getenv('GITHUB_ACTIONS'): - with patch('storage.redis.redis') as mock_redis: - # Создаем базовый mock для Redis методов - mock_redis.get.return_value = None - mock_redis.set.return_value = True - mock_redis.delete.return_value = True - mock_redis.exists.return_value = False - mock_redis.ping.return_value = True - mock_redis.is_connected = False - - yield - return - - # В локальной среде пробуем подключиться к Redis try: - import redis - # Пробуем подключиться к Redis - r = redis.Redis(host='localhost', port=6379, socket_connect_timeout=1) - r.ping() - # Redis доступен, не мокаем - yield - except Exception: - # Redis недоступен, мокаем + import fakeredis.aioredis + # Используем fakeredis для тестов + with patch('storage.redis.redis') as mock_redis: + # Создаем fakeredis сервер + fake_redis = fakeredis.aioredis.FakeRedis() + + # Создаем mock для execute метода, который эмулирует поведение RedisService.execute + async def mock_execute(command: str, *args): + cmd_method = getattr(fake_redis, command.lower(), None) + if cmd_method is not None: + if hasattr(cmd_method, '__call__'): + return await cmd_method(*args) + else: + return cmd_method + return None + + # Патчим методы Redis + mock_redis.execute = mock_execute + mock_redis.get = fake_redis.get + mock_redis.set = fake_redis.set + mock_redis.delete = fake_redis.delete + mock_redis.exists = fake_redis.exists + mock_redis.ping = fake_redis.ping + mock_redis.is_connected = True + + yield + except ImportError: + # fakeredis не установлен, используем базовый mock with patch('storage.redis.redis') as mock_redis: # Создаем базовый mock для Redis методов + mock_redis.execute.return_value = None mock_redis.get.return_value = None mock_redis.set.return_value = True mock_redis.delete.return_value = True @@ -623,3 +623,11 @@ def mock_redis_if_unavailable(): mock_redis.is_connected = False yield + + +@pytest.fixture(autouse=True) +def ensure_rbac_initialized(): + """Обеспечивает инициализацию RBAC системы для каждого теста""" + import rbac + rbac.initialize_rbac() + yield