This commit is contained in:
@@ -5,17 +5,11 @@ from sqlalchemy import create_engine
|
|||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
from sqlalchemy.pool import StaticPool
|
from sqlalchemy.pool import StaticPool
|
||||||
import time
|
import time
|
||||||
import uuid
|
|
||||||
from starlette.testclient import TestClient
|
|
||||||
import requests
|
import requests
|
||||||
import subprocess
|
import subprocess
|
||||||
import signal
|
from typing import Optional
|
||||||
import asyncio
|
|
||||||
from typing import Optional, Generator, AsyncGenerator
|
|
||||||
from contextlib import asynccontextmanager
|
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from storage.redis import redis
|
|
||||||
from orm.base import BaseModel as Base
|
from orm.base import BaseModel as Base
|
||||||
|
|
||||||
|
|
||||||
@@ -589,32 +583,38 @@ def redis_client():
|
|||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def mock_redis_if_unavailable():
|
def mock_redis_if_unavailable():
|
||||||
"""Автоматически мокает Redis если он недоступен"""
|
"""Автоматически мокает 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:
|
try:
|
||||||
import redis
|
import fakeredis.aioredis
|
||||||
# Пробуем подключиться к Redis
|
# Используем fakeredis для тестов
|
||||||
r = redis.Redis(host='localhost', port=6379, socket_connect_timeout=1)
|
with patch('storage.redis.redis') as mock_redis:
|
||||||
r.ping()
|
# Создаем fakeredis сервер
|
||||||
# Redis доступен, не мокаем
|
fake_redis = fakeredis.aioredis.FakeRedis()
|
||||||
yield
|
|
||||||
except Exception:
|
# Создаем mock для execute метода, который эмулирует поведение RedisService.execute
|
||||||
# Redis недоступен, мокаем
|
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:
|
with patch('storage.redis.redis') as mock_redis:
|
||||||
# Создаем базовый mock для Redis методов
|
# Создаем базовый mock для Redis методов
|
||||||
|
mock_redis.execute.return_value = None
|
||||||
mock_redis.get.return_value = None
|
mock_redis.get.return_value = None
|
||||||
mock_redis.set.return_value = True
|
mock_redis.set.return_value = True
|
||||||
mock_redis.delete.return_value = True
|
mock_redis.delete.return_value = True
|
||||||
@@ -623,3 +623,11 @@ def mock_redis_if_unavailable():
|
|||||||
mock_redis.is_connected = False
|
mock_redis.is_connected = False
|
||||||
|
|
||||||
yield
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def ensure_rbac_initialized():
|
||||||
|
"""Обеспечивает инициализацию RBAC системы для каждого теста"""
|
||||||
|
import rbac
|
||||||
|
rbac.initialize_rbac()
|
||||||
|
yield
|
||||||
|
|||||||
Reference in New Issue
Block a user