Files
AICyclingCoach/backend/tests/services/test_plan_evolution.py

59 lines
1.9 KiB
Python

import pytest
from unittest.mock import AsyncMock, MagicMock
from backend.app.services.plan_evolution import PlanEvolutionService
from backend.app.models.plan import Plan
from backend.app.models.analysis import Analysis
from datetime import datetime
@pytest.mark.asyncio
async def test_evolve_plan_with_valid_analysis():
"""Test plan evolution with approved analysis and suggestions"""
mock_db = AsyncMock()
mock_plan = Plan(
id=1,
version=1,
jsonb_plan={"weeks": []},
parent_plan_id=None
)
mock_analysis = Analysis(
approved=True,
suggestions=["More recovery"],
jsonb_feedback={"suggestions": ["More recovery"]}
)
service = PlanEvolutionService(mock_db)
service.ai_service.evolve_plan = AsyncMock(return_value={"weeks": [{"recovery": True}]})
result = await service.evolve_plan_from_analysis(mock_analysis, mock_plan)
assert result.version == 2
assert result.parent_plan_id == 1
mock_db.add.assert_called_once()
mock_db.commit.assert_called_once()
@pytest.mark.asyncio
async def test_evolution_skipped_for_unapproved_analysis():
"""Test plan evolution is skipped for unapproved analysis"""
mock_db = AsyncMock()
mock_analysis = Analysis(approved=False)
service = PlanEvolutionService(mock_db)
result = await service.evolve_plan_from_analysis(mock_analysis, MagicMock())
assert result is None
@pytest.mark.asyncio
async def test_evolution_history_retrieval():
"""Test getting plan evolution history"""
mock_db = AsyncMock()
mock_result = AsyncMock()
mock_result.scalars.return_value.all.return_value = [
Plan(version=1), Plan(version=2)
]
mock_db.execute.return_value = mock_result
service = PlanEvolutionService(mock_db)
history = await service.get_plan_evolution_history(1)
history_result = await history
assert len(history_result) == 2
assert history_result[0].version == 1