76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
"""Integration tests: HTTP API surface (no database required)."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from app.config import get_settings
|
|
|
|
|
|
def test_health_reports_ok(client) -> None:
|
|
r = client.get("/api/health")
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert body["status"] == "ok"
|
|
assert body["db"] in {"up", "down"}
|
|
assert body["version"]
|
|
|
|
|
|
def test_suggestions_returns_list(client) -> None:
|
|
r = client.get("/api/suggestions")
|
|
assert r.status_code == 200
|
|
suggestions = r.json()["suggestions"]
|
|
assert isinstance(suggestions, list)
|
|
assert len(suggestions) >= 3
|
|
assert all(isinstance(s, str) and s.strip() for s in suggestions)
|
|
|
|
|
|
def test_suggestions_honors_bor_suggestions_env_override(monkeypatch) -> None:
|
|
"""GET /api/suggestions reflects the BOR_SUGGESTIONS JSON env override."""
|
|
from fastapi.testclient import TestClient
|
|
|
|
from app.main import create_app
|
|
|
|
override = [
|
|
"How do I back up with Borg?",
|
|
"How is my K3S cluster set up?",
|
|
"How do I deploy a service?",
|
|
"What proxy fronts reeseapps.com?",
|
|
]
|
|
get_settings.cache_clear()
|
|
try:
|
|
monkeypatch.setenv("BOR_SUGGESTIONS", json.dumps(override))
|
|
fresh_client = TestClient(create_app())
|
|
finally:
|
|
get_settings.cache_clear()
|
|
|
|
r = fresh_client.get("/api/suggestions")
|
|
assert r.status_code == 200
|
|
assert r.json() == {"suggestions": override}
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("path", "marker"),
|
|
[("/", "Brain of Reese"), ("/sources.html", "Knowledge base")],
|
|
)
|
|
def test_html_pages_served_locally_no_cdn(client, path: str, marker: str) -> None:
|
|
"""No-CDN check (PLAN §7.3, re-verified on BOTH pages in phase 07):
|
|
each page is served by FastAPI and references only same-origin assets
|
|
(no https:// script/link tags)."""
|
|
r = client.get(path)
|
|
assert r.status_code == 200
|
|
assert marker in r.text
|
|
assert 'src="https://' not in r.text
|
|
assert 'href="https://' not in r.text
|
|
|
|
|
|
def test_styles_and_js_served(client) -> None:
|
|
assert client.get("/assets/styles.css").status_code == 200
|
|
assert client.get("/assets/app.js").status_code == 200
|
|
|
|
|
|
def test_chat_requires_message(client) -> None:
|
|
r = client.post("/api/chat", json={"message": ""})
|
|
assert r.status_code == 422
|