mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
100% Coverage
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user