"""
Pytest configuration and fixtures for agent-core tests
"""

import pytest
import asyncio
import sys
from pathlib import Path

# Add agent-core to path
sys.path.insert(0, str(Path(__file__).parent.parent))


@pytest.fixture(scope="session")
def event_loop():
    """Create an instance of the default event loop for each test case."""
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()


@pytest.fixture
def mock_redis():
    """Mock Redis client for testing"""
    from unittest.mock import AsyncMock, MagicMock

    redis = AsyncMock()
    redis.get = AsyncMock(return_value=None)
    redis.set = AsyncMock(return_value=True)
    redis.setex = AsyncMock(return_value=True)
    redis.delete = AsyncMock(return_value=True)
    redis.keys = AsyncMock(return_value=[])
    redis.publish = AsyncMock(return_value=1)
    redis.pubsub = MagicMock()

    return redis


@pytest.fixture
def mock_db_pool():
    """Mock PostgreSQL pool for testing"""
    from unittest.mock import AsyncMock, MagicMock
    from contextlib import asynccontextmanager

    pool = AsyncMock()

    @asynccontextmanager
    async def acquire():
        conn = AsyncMock()
        conn.fetch = AsyncMock(return_value=[])
        conn.fetchrow = AsyncMock(return_value=None)
        conn.execute = AsyncMock(return_value="UPDATE 0")
        yield conn

    pool.acquire = acquire

    return pool
