from fastapi.testclient import TestClient from app.api import roadmap_routes from app.main import app from app.schemas.roadmap_schema import RoadmapResponse from app.services.roadmap_service import RoadmapServiceFailure, RoadmapServiceSuccess client = TestClient(app) def test_health_endpoint() -> None: response = client.get("/health") assert response.status_code == 200 assert response.json() == {"status": "healthy"} def test_api_health_endpoint() -> None: response = client.get("/api/health") assert response.status_code == 200 body = response.json() assert body["status"] == "healthy" assert "supabase_enabled" in body def test_generate_endpoint_success_envelope() -> None: class FakeService: async def generate(self, _request): data = RoadmapResponse.model_validate( { "goal": "Machine Learning", "duration_days": 7, "milestones": [{"title": "Kickoff", "start_day": 1, "end_day": 7}], "first_week_plan": { 1: [{"title": "Install Python", "duration_minutes": 60}], 2: [{"title": "Learn syntax", "duration_minutes": 60}], 3: [{"title": "Practice loops", "duration_minutes": 60}], 4: [{"title": "Functions intro", "duration_minutes": 60}], 5: [{"title": "Data types", "duration_minutes": 60}], 6: [{"title": "Simple exercise", "duration_minutes": 60}], 7: [{"title": "Mini project", "duration_minutes": 90}], }, } ) return RoadmapServiceSuccess(data=data) class FakeStore: async def save(self, _request, _roadmap): return True def health(self): return {"supabase_enabled": False} app.dependency_overrides[roadmap_routes.get_service] = lambda: FakeService() app.dependency_overrides[roadmap_routes.get_store] = lambda: FakeStore() response = client.post( "/api/generate", json={ "goal": "Machine Learning", "duration_days": 7, "daily_minutes": 120, "level": "beginner", }, ) app.dependency_overrides.clear() assert response.status_code == 200 body = response.json() assert body["ok"] is True assert "data" in body assert body["data"]["goal"] == "Machine Learning" def test_generate_endpoint_failure_envelope() -> None: class FakeService: async def generate(self, _request): return RoadmapServiceFailure(reason="Gemini request timed out") class FakeStore: async def save(self, _request, _roadmap): return True def health(self): return {"supabase_enabled": False} app.dependency_overrides[roadmap_routes.get_service] = lambda: FakeService() app.dependency_overrides[roadmap_routes.get_store] = lambda: FakeStore() response = client.post( "/api/generate", json={ "goal": "Machine Learning", "duration_days": 7, "daily_minutes": 120, "level": "beginner", }, ) app.dependency_overrides.clear() assert response.status_code == 200 body = response.json() assert body == {"ok": False, "reason": "Gemini request timed out"}