- List runs with filtering by experiment, status, and score range plus pagination
- Get run detail with eager-loaded stage results and scores
- Ad-hoc single run creation with Celery/sync dispatch
- Human scoring endpoint (POST /{id}/score)
- Leaderboard endpoint with configurable weighted scoring from experiment scoring_config
- Added AdHocRunCreate, LeaderboardEntry, LeaderboardResponse schemas
- 25 tests in test_runs.py, all passing (503 total tests passing)
226 lines
6 KiB
Python
226 lines
6 KiB
Python
"""Tests for router stubs — verify all routes are mounted and return 501."""
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
@pytest.fixture()
|
|
def client(tmp_path, monkeypatch):
|
|
"""Create a test client with a temporary database."""
|
|
monkeypatch.setenv("DATA_DIR", str(tmp_path))
|
|
monkeypatch.setenv("DATABASE_URL", "")
|
|
monkeypatch.setenv("REDIS_URL", "")
|
|
|
|
# Reload config to pick up test env
|
|
import importlib
|
|
import config as config_mod
|
|
importlib.reload(config_mod)
|
|
|
|
import main as main_mod
|
|
importlib.reload(main_mod)
|
|
|
|
with TestClient(main_mod.app) as c:
|
|
yield c
|
|
|
|
|
|
# ---- Auth router (/api/auth) ----
|
|
|
|
def test_auth_setup(client):
|
|
resp = client.post("/api/auth/setup")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_auth_login(client):
|
|
resp = client.post("/api/auth/login")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_auth_me(client):
|
|
resp = client.get("/api/auth/me")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
# ---- Projects router (/api/projects) ----
|
|
|
|
def test_projects_list(client):
|
|
resp = client.get("/api/projects/")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_projects_create(client):
|
|
resp = client.post("/api/projects/")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_projects_get(client):
|
|
resp = client.get("/api/projects/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_projects_update(client):
|
|
resp = client.put("/api/projects/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_projects_delete(client):
|
|
resp = client.delete("/api/projects/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
# ---- Experiments router (/api/experiments) — now implemented, requires auth ----
|
|
|
|
def test_experiments_list(client):
|
|
resp = client.get("/api/experiments/")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_create(client):
|
|
resp = client.post("/api/experiments/")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_get(client):
|
|
resp = client.get("/api/experiments/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_update(client):
|
|
resp = client.put("/api/experiments/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_delete(client):
|
|
resp = client.delete("/api/experiments/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_sweep(client):
|
|
resp = client.post("/api/experiments/00000000-0000-0000-0000-000000000001/sweep")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_pause(client):
|
|
resp = client.post("/api/experiments/00000000-0000-0000-0000-000000000001/pause")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_resume(client):
|
|
resp = client.post("/api/experiments/00000000-0000-0000-0000-000000000001/resume")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_experiments_stop(client):
|
|
resp = client.post("/api/experiments/00000000-0000-0000-0000-000000000001/stop")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
# ---- Runs router (/api/runs) ----
|
|
|
|
def test_runs_list(client):
|
|
resp = client.get("/api/runs/")
|
|
# Runs router is now fully implemented and requires auth (returns 401 without credentials)
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_runs_get(client):
|
|
resp = client.get("/api/runs/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_runs_create(client):
|
|
resp = client.post("/api/runs/")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_runs_score(client):
|
|
resp = client.post("/api/runs/00000000-0000-0000-0000-000000000001/score")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_runs_leaderboard(client):
|
|
resp = client.get("/api/runs/leaderboard/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
# ---- Endpoints router (/api/endpoints) ----
|
|
# Endpoints router is now fully implemented and requires auth (returns 401 without credentials)
|
|
|
|
def test_endpoints_list(client):
|
|
resp = client.get("/api/endpoints/")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_endpoints_create(client):
|
|
resp = client.post("/api/endpoints/")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_endpoints_update(client):
|
|
resp = client.put("/api/endpoints/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_endpoints_delete(client):
|
|
resp = client.delete("/api/endpoints/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
def test_endpoints_test(client):
|
|
resp = client.post("/api/endpoints/00000000-0000-0000-0000-000000000001/test")
|
|
assert resp.status_code == 401
|
|
|
|
|
|
# ---- Export router (/api/export) ----
|
|
|
|
def test_export_best(client):
|
|
resp = client.get("/api/export/experiments/00000000-0000-0000-0000-000000000001/best")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_export_env(client):
|
|
resp = client.get("/api/export/experiments/00000000-0000-0000-0000-000000000001/env")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_export_yaml(client):
|
|
resp = client.get("/api/export/experiments/00000000-0000-0000-0000-000000000001/yaml")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_export_report(client):
|
|
resp = client.get("/api/export/experiments/00000000-0000-0000-0000-000000000001/report")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
# ---- Webhooks router (/api/webhooks) ----
|
|
|
|
def test_webhooks_list(client):
|
|
resp = client.get("/api/webhooks/")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_webhooks_create(client):
|
|
resp = client.post("/api/webhooks/")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_webhooks_delete(client):
|
|
resp = client.delete("/api/webhooks/00000000-0000-0000-0000-000000000001")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
# ---- Admin router (/api/admin) ----
|
|
|
|
def test_admin_get_settings(client):
|
|
resp = client.get("/api/admin/settings")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_admin_update_settings(client):
|
|
resp = client.put("/api/admin/settings")
|
|
assert resp.status_code == 501
|
|
|
|
|
|
def test_admin_stats(client):
|
|
resp = client.get("/api/admin/stats")
|
|
assert resp.status_code == 501
|