"""FastAPI contract tests for CodeOrganismVM.""" from __future__ import annotations from fastapi.testclient import TestClient from app import RUNTIME_API_KEY, app client = TestClient(app) AUTH_HEADERS = {"x-api-key": RUNTIME_API_KEY} def test_public_metadata_endpoints(): assert client.get("/").status_code == 200 assert client.get("/health").json()["status"] == "healthy" metadata = client.get("/metadata").json() assert metadata["name"] == "autonomous-sre" tasks = client.get("/tasks").json()["tasks"] assert {task["task_id"] for task in tasks} == {"phase_1", "phase_2", "phase_3"} def test_mutating_endpoints_require_api_key(): response = client.post("/reset", json={"task_id": "phase_1"}) assert response.status_code == 401 def test_reset_step_state_loop(): reset_response = client.post("/reset", json={"task_id": "phase_1"}, headers=AUTH_HEADERS) assert reset_response.status_code == 200 obs = reset_response.json() assert obs["vitality_score"] == 100.0 assert obs["file_tree"] assert obs["test_results"] step_response = client.post( "/step", json={"action_type": "emit_signal", "signal_type": "heartbeat"}, headers=AUTH_HEADERS, ) assert step_response.status_code == 200 result = step_response.json() assert "reward" in result assert "reward_breakdown" in result state_response = client.get("/state", headers=AUTH_HEADERS) assert state_response.status_code == 200 assert state_response.json()["current_step"] == 1 def test_mcp_tool_call_maps_to_action(): client.post("/reset", json={"task_id": "phase_1"}, headers=AUTH_HEADERS) response = client.post( "/tools/call", json={"name": "emit_signal", "arguments": {"signal_type": "mcp_ping"}}, headers=AUTH_HEADERS, ) assert response.status_code == 200 assert response.json()["info"]["action_result"]["result"] == "signal_emitted" def test_grader_and_sessions(): create_response = client.post("/sessions/create", headers=AUTH_HEADERS) assert create_response.status_code == 200 session_id = create_response.json()["session_id"] list_response = client.get("/sessions", headers=AUTH_HEADERS) assert session_id in list_response.json()["sessions"] delete_response = client.delete(f"/sessions/{session_id}", headers=AUTH_HEADERS) assert delete_response.status_code == 200 grader_response = client.post( "/grader", json={ "task_id": "phase_1", "actions": [{"action_type": "emit_signal", "signal_type": "test"}], }, headers=AUTH_HEADERS, ) assert grader_response.status_code == 200 assert "score" in grader_response.json()