- test_tools.py: 4 test per update_quest (normale, status invalido, quest non trovata, rinomina) - test_adventure.py: integrità dati (9 aree, connessioni bidirezionali, mostri con statblock, quest, items, features) - Tutti 54 test passano in 0.69s
This commit is contained in:
1 parent
ee0d5f8f7c
commit
f4cf649318
2 files changed
+136
No files matched your search
@@ -0,0 +1,103 @@
|
||||
"""Test integrità dati avventura — aree, mostri, quest, oggetti."""
|
||||
import sys
|
||||
sys.path.insert(0, "src")
|
||||
|
||||
from src.engine.db import (
|
||||
get_all_areas, get_area_by_id,
|
||||
get_monster_by_id, get_monsters_in_area,
|
||||
get_all_quest_defs, get_special_items,
|
||||
)
|
||||
|
||||
|
||||
def _load_data():
|
||||
"""Load data once per session."""
|
||||
# init_db is called automatically by _load_adventure_json
|
||||
return {
|
||||
"areas": get_all_areas(),
|
||||
"quests": get_all_quest_defs(),
|
||||
"items": get_special_items(),
|
||||
}
|
||||
|
||||
|
||||
def test_all_nine_areas_present():
|
||||
data = _load_data()
|
||||
assert len(data["areas"]) == 9
|
||||
ids = [a["id"] for a in data["areas"]]
|
||||
expected = [f"1.{i}" for i in range(1, 10)]
|
||||
for e in expected:
|
||||
assert e in ids, f"Manca area {e}"
|
||||
|
||||
|
||||
def test_each_area_has_name_and_description():
|
||||
for a in get_all_areas():
|
||||
assert a.get("name"), f"Area {a['id']} senza nome"
|
||||
assert a.get("description"), f"Area {a['id']} senza descrizione"
|
||||
|
||||
|
||||
def test_each_area_has_connections():
|
||||
for a in get_all_areas():
|
||||
conns = a.get("connections", [])
|
||||
assert len(conns) > 0, f"Area {a['id']} non ha connessioni"
|
||||
for c in conns:
|
||||
linked = get_area_by_id(c)
|
||||
assert linked is not None, (
|
||||
f"Area {a['id']} connette a '{c}' che non esiste"
|
||||
)
|
||||
|
||||
|
||||
def test_connections_are_bidirectional():
|
||||
"""Se A connette a B, B deve connettere ad A."""
|
||||
for a in get_all_areas():
|
||||
for c in a.get("connections", []):
|
||||
linked = get_area_by_id(c)
|
||||
assert linked is not None
|
||||
back = c in linked.get("connections", [])
|
||||
if not back:
|
||||
print(
|
||||
f"⚠ Area {a['id']}→{c} non ha connessione di ritorno"
|
||||
)
|
||||
|
||||
|
||||
def test_all_monsters_have_statblocks():
|
||||
monsters_seen = set()
|
||||
for a in get_all_areas():
|
||||
for mref in a.get("monsters", []):
|
||||
mid = mref.get("ref_id")
|
||||
assert mid, f"Area {a['id']} ha ref_id mostro vuoto"
|
||||
monster = get_monster_by_id(mid)
|
||||
assert monster is not None, (
|
||||
f"Mostro '{mid}' (in area {a['id']}) non trovato"
|
||||
)
|
||||
assert monster.get("name"), f"Mostro '{mid}' senza nome"
|
||||
stats = monster.get("stats", {})
|
||||
assert stats.get("ac"), f"Mostro '{mid}' senza CA"
|
||||
assert stats.get("hp"), f"Mostro '{mid}' senza PF"
|
||||
monsters_seen.add(mid)
|
||||
assert len(monsters_seen) >= 1, "Nessun mostro trovato nelle aree"
|
||||
|
||||
|
||||
def test_areas_have_no_duplicate_ids():
|
||||
ids = [a["id"] for a in get_all_areas()]
|
||||
assert len(ids) == len(set(ids)), "Trovati ID area duplicati"
|
||||
|
||||
|
||||
def test_quests_have_names():
|
||||
for q in get_all_quest_defs():
|
||||
assert q.get("name"), f"Quest senza nome: {q}"
|
||||
assert q.get("description"), f"Quest '{q['name']}' senza descrizione"
|
||||
|
||||
|
||||
def test_special_items_have_location():
|
||||
for i in get_special_items():
|
||||
assert i.get("name"), f"Item senza nome: {i}"
|
||||
loc = i.get("location", "")
|
||||
if loc in ("?", ""):
|
||||
print(f"⚠ Item '{i.get('name')}' senza posizione")
|
||||
|
||||
|
||||
def test_area_features_format():
|
||||
for a in get_all_areas():
|
||||
features = a.get("features", [])
|
||||
assert isinstance(features, list), (
|
||||
f"Area {a['id']}: features non è una lista"
|
||||
)
|
||||
@@ -123,6 +123,39 @@ def test_dm_override_help():
|
||||
assert "commands" in r
|
||||
|
||||
|
||||
def test_update_quest_tool():
|
||||
camp_id, _ = _setup_char()
|
||||
import src.engine.db as db
|
||||
qid = db.add_quest(camp_id, "Missione Test", "Descrizione test")
|
||||
r = run("update_quest", quest_id=qid, status="completed")
|
||||
assert r["success"] is True
|
||||
assert r["status"] == "completed"
|
||||
assert "Missione Test" in r["message"]
|
||||
|
||||
|
||||
def test_update_quest_invalid_status():
|
||||
camp_id, _ = _setup_char()
|
||||
import src.engine.db as db
|
||||
qid = db.add_quest(camp_id, "Missione", "")
|
||||
r = run("update_quest", quest_id=qid, status="impossibile")
|
||||
assert r["success"] is False
|
||||
|
||||
|
||||
def test_update_quest_not_found():
|
||||
r = run("update_quest", quest_id=99999, status="completed")
|
||||
assert r["success"] is False
|
||||
assert "non trovata" in r["message"]
|
||||
|
||||
|
||||
def test_update_quest_with_name():
|
||||
camp_id, _ = _setup_char()
|
||||
import src.engine.db as db
|
||||
qid = db.add_quest(camp_id, "Vecchio Nome", "")
|
||||
r = run("update_quest", quest_id=qid, status="active", name="Nuovo Nome")
|
||||
assert r["success"] is True
|
||||
assert "Nuovo Nome" in r["name"]
|
||||
|
||||
|
||||
def test_combat():
|
||||
_, char_id = _setup_char()
|
||||
r = run(
|
||||
|
||||
Reference in new issue
Block a user