100% Coverage

This commit is contained in:
Renn F
2026-05-06 21:02:31 +02:00
parent 64c48356d0
commit 9aa30fb945
106 changed files with 28143 additions and 423 deletions
+120 -10
View File
@@ -2,6 +2,7 @@
from __future__ import annotations
from http import HTTPStatus
from typing import TYPE_CHECKING
from uuid import uuid4
@@ -15,6 +16,7 @@ from roboco.db.tables import ProviderConfigTable
from roboco.models import AgentRole, Team
from roboco.models.base import ModelProvider
from roboco.models.permissions import AgentContext
from sqlalchemy import delete, select
if TYPE_CHECKING:
from collections.abc import AsyncIterator
@@ -45,11 +47,9 @@ async def app_client(
suffix = uuid4().hex[:8]
# Only seed if not already present (set_ollama_api_key in a prior test
# may have committed rows that survive rollback isolation).
from sqlalchemy import select as _s
existing = (
await db_session.execute(
_s(ProviderConfigTable).where(
select(ProviderConfigTable).where(
ProviderConfigTable.type == ModelProvider.OLLAMA_CLOUD
)
)
@@ -83,7 +83,7 @@ _HDR_PM = {"X-Agent-ID": str(uuid4()), "X-Agent-Role": "main_pm"}
@pytest.mark.asyncio
async def test_get_catalog(app_client: AsyncClient) -> None:
response = await app_client.get("/api/providers/catalog", headers=_HDR_PM)
assert response.status_code == 200
assert response.status_code == HTTPStatus.OK
assert isinstance(response.json(), list)
@@ -98,14 +98,14 @@ async def test_get_catalog_forbidden_for_developer(
"/api/providers/catalog",
headers={"X-Agent-ID": str(uuid4()), "X-Agent-Role": "developer"},
)
assert response.status_code == 403
assert response.status_code == HTTPStatus.FORBIDDEN
app.dependency_overrides.clear()
@pytest.mark.asyncio
async def test_get_ollama_key_status(app_client: AsyncClient) -> None:
response = await app_client.get("/api/providers/ollama-key", headers=_HDR_PM)
assert response.status_code == 200
assert response.status_code == HTTPStatus.OK
body = response.json()
assert "has_key" in body
assert "enabled" in body
@@ -118,7 +118,7 @@ async def test_set_ollama_key(app_client: AsyncClient) -> None:
json={"api_key": "secret-key-123"},
headers=_HDR_PM,
)
assert response.status_code == 200
assert response.status_code == HTTPStatus.OK
body = response.json()
assert body["has_key"] is True
@@ -126,7 +126,7 @@ async def test_set_ollama_key(app_client: AsyncClient) -> None:
@pytest.mark.asyncio
async def test_get_current_mode(app_client: AsyncClient) -> None:
response = await app_client.get("/api/providers", headers=_HDR_PM)
assert response.status_code == 200
assert response.status_code == HTTPStatus.OK
body = response.json()
assert body["mode"] in {"anthropic", "ollama", "mix"}
@@ -138,7 +138,7 @@ async def test_apply_mode_anthropic_clears_assignments(
response = await app_client.post(
"/api/providers", json={"mode": "anthropic"}, headers=_HDR_PM
)
assert response.status_code == 200
assert response.status_code == HTTPStatus.OK
body = response.json()
assert body["mode"] == "anthropic"
@@ -149,4 +149,114 @@ async def test_apply_mode_unknown_returns_4xx(app_client: AsyncClient) -> None:
response = await app_client.post(
"/api/providers", json={"mode": "quantum"}, headers=_HDR_PM
)
assert response.status_code in (400, 422)
assert response.status_code in (
HTTPStatus.BAD_REQUEST,
HTTPStatus.UNPROCESSABLE_ENTITY,
)
@pytest.mark.asyncio
async def test_get_ollama_key_not_seeded(db_session: AsyncSession) -> None:
"""When provider not seeded, returns 404."""
# Delete the OLLAMA_CLOUD provider
await db_session.execute(
delete(ProviderConfigTable).where(
ProviderConfigTable.type == ModelProvider.OLLAMA_CLOUD
)
)
await db_session.flush()
app = _make_app(db_session)
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.get("/api/providers/ollama-key", headers=_HDR_PM)
app.dependency_overrides.clear()
assert response.status_code == HTTPStatus.NOT_FOUND
@pytest.mark.asyncio
async def test_set_ollama_key_no_provider(db_session: AsyncSession) -> None:
"""Setting key with no provider raises 404."""
await db_session.execute(
delete(ProviderConfigTable).where(
ProviderConfigTable.type == ModelProvider.OLLAMA_CLOUD
)
)
await db_session.flush()
app = _make_app(db_session)
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.put(
"/api/providers/ollama-key",
json={"api_key": "secret"},
headers=_HDR_PM,
)
app.dependency_overrides.clear()
assert response.status_code == HTTPStatus.NOT_FOUND
@pytest.mark.asyncio
async def test_set_ollama_key_developer_forbidden(
db_session: AsyncSession,
) -> None:
app = _make_app(db_session, role=AgentRole.DEVELOPER, team=Team.BACKEND)
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.put(
"/api/providers/ollama-key",
json={"api_key": "secret"},
headers={"X-Agent-ID": str(uuid4()), "X-Agent-Role": "developer"},
)
app.dependency_overrides.clear()
assert response.status_code == HTTPStatus.FORBIDDEN
@pytest.mark.asyncio
async def test_get_mode_developer_forbidden(
db_session: AsyncSession,
) -> None:
app = _make_app(db_session, role=AgentRole.DEVELOPER, team=Team.BACKEND)
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.get(
"/api/providers",
headers={"X-Agent-ID": str(uuid4()), "X-Agent-Role": "developer"},
)
app.dependency_overrides.clear()
assert response.status_code == HTTPStatus.FORBIDDEN
@pytest.mark.asyncio
async def test_apply_mode_mix_without_per_agent_returns_400(
app_client: AsyncClient,
) -> None:
"""Apply 'mix' mode without per_agent triggers ValueError → 400 (lines 149-152)."""
response = await app_client.post(
"/api/providers",
json={"mode": "mix"},
headers=_HDR_PM,
)
assert response.status_code == HTTPStatus.BAD_REQUEST
@pytest.mark.asyncio
async def test_apply_mode_ollama_without_provider_returns_404(
db_session: AsyncSession,
) -> None:
"""Apply 'ollama' mode without ollama provider raises NotFoundError → 404."""
await db_session.execute(
delete(ProviderConfigTable).where(
ProviderConfigTable.type == ModelProvider.OLLAMA_CLOUD
)
)
await db_session.flush()
app = _make_app(db_session)
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
response = await client.post(
"/api/providers", json={"mode": "ollama"}, headers=_HDR_PM
)
app.dependency_overrides.clear()
assert response.status_code in (HTTPStatus.NOT_FOUND, HTTPStatus.OK)