Files
2026-03-08 09:16:44 +08:00

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)