import json import app.content as content def test_load_npc_returns_parsed_file(tmp_path, monkeypatch): root = tmp_path / "content" (root / "world" / "npcs").mkdir(parents=True) (root / "world" / "npcs" / "fenn.json").write_text( json.dumps({"id": "fenn", "name": "Fenn", "persona": "clerk", "knowledge": ["a"], "capabilities": {}}) ) monkeypatch.setenv("CONTENT_ROOT", str(root)) npc = content.load_npc("fenn") assert npc["name"] == "Fenn" assert npc["knowledge"] == ["a"] def test_load_npc_unknown_returns_none(tmp_path, monkeypatch): (tmp_path / "content" / "world").mkdir(parents=True) monkeypatch.setenv("CONTENT_ROOT", str(tmp_path / "content")) assert content.load_npc("nobody") is None def test_content_root_env_override(tmp_path, monkeypatch): monkeypatch.setenv("CONTENT_ROOT", str(tmp_path)) assert content._content_root() == tmp_path def test_fenn_resolves_from_repo_content(): # No CONTENT_ROOT env — exercises the walk-up resolver against real content. npc = content.load_npc("fenn") assert npc is not None assert npc["capabilities"]["offerable_quests"] == ["find_the_ledger"] assert npc["knowledge"] # non-empty authored knowledge list def test_npc_prompt_body_is_authored(): from app import prompts body = prompts.system_prompt("npc") assert "MOVE" in body and len(body) > 200