from __future__ import annotations from fastapi.testclient import TestClient from triage import CodeTriageEngine, HashingEmbeddingBackend from triage_catalog import build_examples def test_hashing_backend_returns_normalized_embeddings() -> None: backend = HashingEmbeddingBackend(dimensions=32) embeddings = backend.embed_texts(["def foo():\n return 1", "for x in items:\n pass"]) assert embeddings.shape == (2, 32) for row in embeddings: assert round(float(row.norm().item()), 5) == 1.0 def test_examples_map_to_expected_labels_with_fallback_backend() -> None: examples = build_examples() engine = CodeTriageEngine(backend=HashingEmbeddingBackend()) for example in examples: result = engine.triage(example.code, example.traceback_text, example.context_window) assert result.issue_label == example.label assert 0.0 <= result.reward_score <= 1.0 def test_syntax_example_exposes_parser_signal() -> None: example = next(item for item in build_examples() if item.label == "syntax") engine = CodeTriageEngine(backend=HashingEmbeddingBackend()) result = engine.triage(example.code, example.traceback_text, example.context_window) assert any(signal.name == "syntax_parse" and signal.value == "fails" for signal in result.extracted_signals) assert result.matched_pattern.task_id == example.task_id assert result.repair_plan[0].startswith("Step 1 - Syntax checking and bug fixes") def test_composed_app_preserves_health_route() -> None: from server.app import build_application client = TestClient(build_application()) response = client.get("/health") assert response.status_code == 200 assert response.json()["status"] == "ok"