roadmap-generator / tests /test_v3_api_shape.py
Mo-Medhat's picture
Upload new version
5b1bd9c
Raw History Blame Contribute Delete
3.45 kB
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"}