# tests/test_api_routes.py from unittest.mock import AsyncMock, MagicMock, patch from fastapi.testclient import TestClient from app.api.limiter import limiter from app.api.main import app limiter.enabled = False client = TestClient(app) VALID_URL = "https://github.com/owner/repo" def _mock_settings(api_key: str = "") -> MagicMock: s = MagicMock() s.api_key = api_key return s def test_analyze_rejects_missing_api_key(): with ( patch( "app.api.dependencies.get_settings", return_value=_mock_settings("secret") ), patch("app.api.routes.clone_repository", return_value="/tmp/fake"), patch("app.api.routes.delete_repository"), ): response = client.post("/api/v1/analyze", json={"github_url": VALID_URL}) assert response.status_code == 401 def test_analyze_rejects_wrong_api_key(): with ( patch( "app.api.dependencies.get_settings", return_value=_mock_settings("secret") ), patch("app.api.routes.clone_repository", return_value="/tmp/fake"), patch("app.api.routes.delete_repository"), ): response = client.post( "/api/v1/analyze", json={"github_url": VALID_URL}, headers={"X-API-Key": "wrong"}, ) assert response.status_code == 401 def test_analyze_rejects_invalid_github_url(): with patch("app.api.dependencies.get_settings", return_value=_mock_settings()): response = client.post( "/api/v1/analyze", json={"github_url": "https://gitlab.com/owner/repo"}, ) assert response.status_code == 422 def test_quick_analyze_health_path(): from app.models.repository import RepositoryMetadata mock_metadata = RepositoryMetadata( url=VALID_URL, name="repo", local_path="/tmp/fake" ) with ( patch("app.api.dependencies.get_settings", return_value=_mock_settings()), patch("app.api.routes.clone_repository", return_value="/tmp/fake"), patch("app.api.routes.delete_repository"), patch( "app.api.routes.repo_analysis_agent.run", new=AsyncMock(return_value=mock_metadata), ), ): response = client.post( "/api/v1/quick-analyze", json={"github_url": VALID_URL}, ) assert response.status_code == 200 def test_metrics_endpoint_returns_dict(): with patch("app.api.dependencies.get_settings", return_value=_mock_settings("")): response = client.get("/api/v1/metrics") assert response.status_code == 200 data = response.json() assert "uptime_seconds" in data assert "agents" in data