"""Tests for canonical KB claim routes."""
from __future__ import annotations
import asyncio
import json
import sys
from pathlib import Path
import pytest
pytest.importorskip("aiohttp")
from aiohttp import web
from aiohttp.test_utils import make_mocked_request
REPO_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(REPO_ROOT / "diagnostics"))
import kb_claim_routes as routes # noqa: E402
CLAIM_ID = "d0000000-0000-0000-0000-000000000005"
CONNECTED_ID = "e0000000-0000-0000-0000-000000000006"
def _claim_data():
return {
"claim": {
"id": CLAIM_ID,
"type": "strategy_kernel",
"text": "Claims should be falsifiable enough to support review.",
"status": "open",
"confidence": "0.72",
"tags": ["claims", "review"],
"created_at": "2026-07-09T00:00:00Z",
"updated_at": "2026-07-09T00:00:00Z",
},
"evidence": [
{
"role": "grounds",
"weight": "0.8",
"source_type": "telegram",
"url": "https://example.test/source",
"storage_path": None,
"excerpt": "m3taversal asked Leo to split a broad claim into atomic claims.",
}
],
"edges": [
{
"direction": "outgoing",
"edge_type": "supports",
"connected_id": CONNECTED_ID,
"connected_text": "Reviewable claims need supporting evidence and edges.",
"connected_status": "open",
}
],
}
def test_claim_link_html_links_valid_claim_ids() -> None:
html = routes.claim_link_html(CLAIM_ID)
assert f'href="/kb/claims/{CLAIM_ID}"' in html
assert f"{CLAIM_ID}" in html
def test_render_kb_claim_page_shows_body_evidence_and_linked_edges() -> None:
html = routes.render_kb_claim_page(_claim_data())
assert "Claims should be falsifiable enough to support review." in html
assert "m3taversal asked Leo" in html
assert f'href="/kb/claims/{CONNECTED_ID}"' in html
assert "supports" in html
assert "open" in html
def test_api_kb_claim_uses_loader_and_returns_claim_graph() -> None:
app = web.Application()
app[routes.KB_CLAIM_LOADER_KEY] = lambda claim_id: _claim_data() if claim_id == CLAIM_ID else None
req = make_mocked_request(
"GET",
f"/api/kb/claims/{CLAIM_ID}",
app=app,
match_info={"claim_id": CLAIM_ID},
)
response = asyncio.run(routes.handle_api_kb_claim(req))
data = json.loads(response.body.decode())
assert response.status == 200
assert data["claim"]["id"] == CLAIM_ID
assert data["edges"][0]["connected_id"] == CONNECTED_ID