# tests/unit/test_task_manager.py
import sys
sys.path.insert(0, '/home/jang/Projects/ai-researcher')

import pytest
from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, patch

from src.core.task_manager import TaskManager
from src.models.task import Task


@pytest.fixture
def task_manager():
    return TaskManager()


@pytest.fixture
def mock_session():
    """创建mock session"""
    session = AsyncMock()
    session.add = MagicMock()
    session.flush = AsyncMock()
    session.refresh = AsyncMock()
    session.commit = AsyncMock()
    session.get = AsyncMock()
    return session


@pytest.fixture
def mock_session_maker(mock_session):
    """创建mock session maker"""
    maker = MagicMock()
    maker.return_value.__aenter__ = AsyncMock(return_value=mock_session)
    maker.return_value.__aexit__ = AsyncMock(return_value=None)
    return maker


@pytest.mark.asyncio
async def test_create_task(task_manager, mock_session_maker):
    """测试创建任务"""
    with patch('src.core.task_manager.get_session_maker', return_value=mock_session_maker):
        task = await task_manager.create_task(
            query="查询技术部员工",
            complexity_score=0.3,
            user_id="user_1"
        )

        assert task.id is not None
        assert task.status == Task.STATUS_PENDING
        assert task.query == "查询技术部员工"
        assert task.complexity_score == 0.3
        assert task.user_id == "user_1"


@pytest.mark.asyncio
async def test_task_status_transitions(task_manager, mock_session, mock_session_maker):
    """测试任务状态流转"""
    # 创建一个模拟任务
    mock_task = Task(
        id="task_test123",
        status=Task.STATUS_PENDING,
        query="测试查询",
        complexity_score=0.2,
    )

    with patch('src.core.task_manager.get_session_maker', return_value=mock_session_maker):
        # First create task
        task = await task_manager.create_task("测试查询", 0.2)
        assert task.status == Task.STATUS_PENDING

        # Mock the session.get to return our mock_task for subsequent calls
        mock_session.get.side_effect = [mock_task, mock_task, mock_task]

        # Start task
        await task_manager.start_task(mock_task.id)
        assert mock_task.status == Task.STATUS_RUNNING
        assert mock_task.started_at is not None

        # Complete task
        await task_manager.complete_task(mock_task.id)
        assert mock_task.status == Task.STATUS_COMPLETED
        assert mock_task.completed_at is not None
