Spaces:
Sleeping
Sleeping
File size: 2,679 Bytes
8244647 3582e50 8244647 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import json
import pytest
from pydantic import ValidationError
from server.environment import NationEnvironment
from server.models import ParliamentaryAction, ParliamentaryObservation
def make_debate_action(agent_id: str = "Social") -> ParliamentaryAction:
return ParliamentaryAction(agent_id=agent_id, type="DEBATE", message="")
def assert_state_contract(state: ParliamentaryObservation) -> None:
dumped_state = state.model_dump()
assert isinstance(state, ParliamentaryObservation)
assert "treasury" in dumped_state
assert "population" in dumped_state
assert "productivity" in dumped_state
assert "event_ledger" in dumped_state
def assert_state_is_serializable(state: ParliamentaryObservation) -> None:
serialized = state.model_dump_json()
assert json.loads(serialized) == state.model_dump(mode="json")
def test_reset_returns_state_and_info_dict():
env = NationEnvironment(seed=123)
state, info = env.reset()
assert_state_contract(state)
assert_state_is_serializable(state)
assert info == {}
def test_step_returns_openenv_tuple_and_info_contract():
env = NationEnvironment(seed=123)
env.reset()
state, reward, terminated, truncated, info = env.step(make_debate_action())
assert_state_contract(state)
assert_state_is_serializable(state)
assert isinstance(reward, float)
assert isinstance(terminated, bool)
assert isinstance(truncated, bool)
assert isinstance(info, dict)
def test_invalid_action_amount_type_fails_validation():
with pytest.raises(ValidationError):
ParliamentaryAction(
agent_id="Social",
type="PROPOSE_BUDGET",
department="Social",
amount="not_a_number",
justification="test",
)
def test_one_random_valid_action_does_not_crash():
env = NationEnvironment(seed=123)
env.reset()
action = ParliamentaryAction(
agent_id="Social",
type="PROPOSE_BUDGET",
department="Social",
amount=10.0,
justification="test",
)
state, reward, terminated, truncated, info = env.step(action)
assert_state_contract(state)
assert isinstance(reward, float)
assert isinstance(terminated, bool)
assert isinstance(truncated, bool)
assert isinstance(info, dict)
def test_repeated_stepping_does_not_crash():
env = NationEnvironment(seed=123)
env.reset()
for _ in range(20):
state, _, terminated, truncated, info = env.step(make_debate_action())
assert_state_contract(state)
assert truncated is False
assert isinstance(info, dict)
if terminated:
break
|