File size: 2,668 Bytes
df0a911
 
bf214ef
16e974b
bf214ef
 
16e974b
bf214ef
 
 
 
 
df0a911
 
 
 
 
 
bf214ef
d223ca5
a79668c
 
 
d223ca5
 
 
c5211bf
 
bf214ef
 
c5211bf
d223ca5
a79668c
 
 
d223ca5
 
 
c5211bf
 
 
 
 
bf214ef
 
7d55b27
bf214ef
df0a911
c5211bf
 
 
 
bf214ef
 
 
 
c5211bf
df0a911
c5211bf
 
 
bf214ef
df0a911
bf214ef
 
 
 
 
 
 
 
 
 
 
c5211bf
bf214ef
 
 
42c1adb
 
bf214ef
 
 
42c1adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 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