30 lines
1.4 KiB
Python
30 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from game.schemas import fallback_ai_payload, parse_json_payload, validate_ai_payload
|
|
|
|
|
|
def test_parse_and_validate_ai_payload_success():
|
|
raw = '{"narration":"场景推进","npc_dialogues":[{"npc":"老板","line":"别乱动","tone":"cold"}],"state_updates":{"danger_delta":1,"add_clues":["torn_manifest"],"set_flags":{"found_service_key":true},"npc_changes":{},"inventory_add":{},"inventory_remove":{"p1":["silver_bell"]}},"private_player_updates":[],"choices":["搜查大厅"],"should_end_scene":false,"should_end_game":false,"ending_summary":null}'
|
|
payload, err = parse_json_payload(raw)
|
|
assert err is None
|
|
ok, errors, normalized = validate_ai_payload(payload or {})
|
|
assert ok is True
|
|
assert not errors
|
|
assert normalized["state_updates"]["danger_delta"] == 1
|
|
assert normalized["state_updates"]["inventory_remove"]["p1"] == ["silver_bell"]
|
|
assert normalized["choices"] == ["搜查大厅"]
|
|
|
|
|
|
def test_parse_invalid_json_returns_error():
|
|
payload, err = parse_json_payload("not-json")
|
|
assert payload is None
|
|
assert err == "invalid_json"
|
|
|
|
|
|
def test_validate_invalid_payload_falls_back():
|
|
ok, errors, normalized = validate_ai_payload({"narration": 123, "state_updates": []})
|
|
assert ok is False
|
|
assert "invalid_narration" in errors
|
|
assert normalized["narration"]
|
|
assert isinstance(fallback_ai_payload()["choices"], list)
|