From f4cf64931882f487a024587611f43ddf92ac4f7c Mon Sep 17 00:00:00 2001 From: truetype Date: Wed, 1 Jul 2026 09:41:35 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20test:=20aggiunti=20test=20update=5F?= =?UTF-8?q?quest=20+=20integrit=C3=A0=20avventura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- tests/test_adventure.py | 103 ++++++++++++++++++++++++++++++++++++++++ tests/test_tools.py | 33 +++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 tests/test_adventure.py diff --git a/tests/test_adventure.py b/tests/test_adventure.py new file mode 100644 index 0000000..d867f46 --- /dev/null +++ b/tests/test_adventure.py @@ -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" + ) diff --git a/tests/test_tools.py b/tests/test_tools.py index 16a4b30..8af02e7 100644 --- a/tests/test_tools.py +++ b/tests/test_tools.py @@ -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(