from fastapi.testclient import TestClient from server.app import app def test_health_endpoint(): client = TestClient(app) response = client.get("/health") assert response.status_code == 200 body = response.json() assert body.get("status") in {"ok", "healthy"} def test_reset_and_step_smoke_wrapped_payload(): client = TestClient(app) reset_resp = client.post("/reset", json={"task": "easy", "seed": 42}) assert reset_resp.status_code == 200 reset_body = reset_resp.json() assert "observation" in reset_body step_resp = client.post( "/step", json={"action": {"renewable_ratio": 0.6, "fossil_ratio": 0.3, "battery_action": 0.0}}, ) assert step_resp.status_code == 200 step_body = step_resp.json() assert "observation" in step_body assert "reward" in step_body assert "done" in step_body def test_step_accepts_unwrapped_action_payload(): client = TestClient(app) client.post("/reset", json={"task": "medium", "seed": 7}) step_resp = client.post( "/step", json={"renewable_ratio": 0.55, "fossil_ratio": 0.35, "battery_action": 0.0}, ) assert step_resp.status_code == 200 assert "observation" in step_resp.json() def test_step_invalid_payload_returns_422_not_500(): client = TestClient(app) client.post("/reset", json={"task": "easy", "seed": 11}) bad_resp = client.post( "/step", json={"renewable_ratio": 1.5, "fossil_ratio": 1.5, "battery_action": 2.0}, ) assert bad_resp.status_code == 422 def test_step_stress_multiple_interactions(): client = TestClient(app) client.post("/reset", json={"task": "hard", "seed": 21}) for _ in range(20): resp = client.post( "/step", json={"renewable_ratio": 0.6, "fossil_ratio": 0.3, "battery_action": 0.0}, ) assert resp.status_code == 200