| """Tests for the FastAPI server (``examples.api_server``). |
| |
| These tests use FastAPI's TestClient and don't require a running server. |
| Skipped if fastapi is not installed. |
| """ |
|
|
| from __future__ import annotations |
|
|
| import pytest |
|
|
| try: |
| from fastapi.testclient import TestClient |
| HAS_FASTAPI = True |
| except ImportError: |
| HAS_FASTAPI = False |
|
|
| import sys |
| from pathlib import Path |
| sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "examples")) |
|
|
| from palimseste.hf import HFPalimpsesteLM |
| from palimseste.lm import PalimpsesteConfig |
| import numpy as np |
|
|
| pytestmark = pytest.mark.skipif(not HAS_FASTAPI, |
| reason="fastapi not installed") |
|
|
|
|
| @pytest.fixture |
| def app_and_lm(): |
| cfg = PalimpsesteConfig(D=2000, context_window=16, kernel_radius=100, |
| temperature=0.3) |
| lm = HFPalimpsesteLM(config=cfg, rng=np.random.default_rng(0)) |
| text = "bonjour salut je suis palimpseste. qui es-tu je suis un cortex. merci je vous en prie." |
| lm.build_tokenizer(text) |
| lm.train_on_text(text) |
| from api_server import create_app |
| app = create_app(lm) |
| return app, lm |
|
|
|
|
| def test_health(app_and_lm): |
| app, _ = app_and_lm |
| client = TestClient(app) |
| r = client.get("/health") |
| assert r.status_code == 200 |
| data = r.json() |
| assert data["status"] == "ok" |
| assert "D" in data |
| assert "|M|" in data |
|
|
|
|
| def test_stats(app_and_lm): |
| app, _ = app_and_lm |
| client = TestClient(app) |
| r = client.get("/stats") |
| assert r.status_code == 200 |
| data = r.json() |
| assert "D" in data |
| assert "n_traces" in data |
| assert "vocab_size" in data |
| assert "turns" in data |
|
|
|
|
| def test_chat(app_and_lm): |
| app, _ = app_and_lm |
| client = TestClient(app) |
| r = client.post("/chat", json={"message": "bonjour"}) |
| assert r.status_code == 200 |
| data = r.json() |
| assert "response" in data |
| assert "elapsed_ms" in data |
| assert isinstance(data["response"], str) |
|
|
|
|
| def test_teach(app_and_lm): |
| app, lm = app_and_lm |
| client = TestClient(app) |
| n_before = len(lm.mem) |
| r = client.post("/teach", json={"question": "what color is the sky", |
| "answer": "blue"}) |
| assert r.status_code == 200 |
| data = r.json() |
| assert data["success"] is True |
| assert data["tokens_written"] > 0 |
| assert len(lm.mem) > n_before |
|
|
|
|
| def test_root_html(app_and_lm): |
| app, _ = app_and_lm |
| client = TestClient(app) |
| r = client.get("/") |
| assert r.status_code == 200 |
| assert "PALIMPSESTE" in r.text |
|
|