Spaces:
Sleeping
Sleeping
| import importlib | |
| import pytest | |
| from fastapi.testclient import TestClient | |
| def fresh_client(): | |
| """Reload server module to get a clean env state.""" | |
| import src.server as server_module | |
| importlib.reload(server_module) | |
| return TestClient(server_module.app) | |
| def test_health(): | |
| client = fresh_client() | |
| r = client.get("/health") | |
| assert r.status_code == 200 | |
| assert r.json()["status"] == "ok" | |
| def test_reset_returns_observation(): | |
| client = fresh_client() | |
| r = client.post("/reset", json={"seed": 42}) | |
| assert r.status_code == 200 | |
| data = r.json() | |
| assert data["current_round"] == 0 | |
| assert data["total_rounds"] == 8 | |
| assert data["my_engineer_name"] == "trained" | |
| assert "my_service" in data | |
| assert "peer_progress" in data | |
| assert data["done"] is False | |
| def test_step_returns_correct_shape(): | |
| client = fresh_client() | |
| client.post("/reset", json={"seed": 0}) | |
| r = client.post("/step", json={"commitment": "DEPLOY_PROD_B", "channel_msg": "going B"}) | |
| assert r.status_code == 200 | |
| data = r.json() | |
| assert "observation" in data | |
| assert "reward" in data | |
| assert "done" in data | |
| assert "info" in data | |
| assert data["reward"] == 0.0 # intermediate round — always 0 | |
| def test_step_before_reset_returns_400(): | |
| client = fresh_client() | |
| r = client.post("/step", json={"commitment": "MONITOR", "channel_msg": ""}) | |
| assert r.status_code == 400 | |
| def test_state_returns_full_state(): | |
| client = fresh_client() | |
| client.post("/reset", json={"seed": 1}) | |
| r = client.get("/state") | |
| assert r.status_code == 200 | |
| data = r.json() | |
| assert "services" in data | |
| assert "trained" in data["services"] | |
| assert "history" in data | |
| def test_full_episode_ends_with_done_true(): | |
| client = fresh_client() | |
| client.post("/reset", json={"seed": 10}) | |
| done = False | |
| for _ in range(10): | |
| r = client.post("/step", json={"commitment": "DEPLOY_PROD_B", "channel_msg": ""}) | |
| data = r.json() | |
| if data["done"]: | |
| done = True | |
| assert data["reward"] in (0.0, 1.0) | |
| break | |
| assert done | |