"""Tests unitaires purs de la couche données (db/) — sans passer par Flask.""" import db def test_slugify_basic(): assert db.slugify("Hello World") == "hello-world" assert db.slugify("Île de Ré !!") == "le-de-r" assert db.slugify("") == "jeu" def test_table_name_for(): assert db.table_name_for("Personnage Principal") == "obj_personnage_principal" def test_create_game_and_meta(tmp_game_slug_cleanup): slug = db.create_game("Mon Jeu De Test") tmp_game_slug_cleanup(slug) meta = db.game_meta(slug) assert meta["name"] == "Mon Jeu De Test" def test_list_games_only_returns_the_given_owners_projects(tmp_game_slug_cleanup): """db.list_games(owner_folder) ne scanne plus jamais projects/ en entier (voir routes/games/index.py — faille corrigée : un admin voyait auparavant les projets de tous les comptes).""" slug = db.create_game("Jeu propriétaire", owner_folder="999999") tmp_game_slug_cleanup(slug) assert slug in [g["slug"] for g in db.list_games("999999")] assert db.list_games("000000") == [] def test_create_game_deduplicates_slug(tmp_game_slug_cleanup): slug1 = db.create_game("Doublon") tmp_game_slug_cleanup(slug1) slug2 = db.create_game("Doublon") tmp_game_slug_cleanup(slug2) assert slug1 != slug2 def test_definition_crud(tmp_game_slug_cleanup): slug = db.create_game("Objets Test") tmp_game_slug_cleanup(slug) definition_id = db.create_definition( slug, "Personnage", [{"name": "nom", "type": "texte", "required": True}, {"name": "pv", "type": "nombre_entier", "required": False}], ) definition = db.get_definition(slug, definition_id) assert definition["name"] == "Personnage" assert {f["name"] for f in definition["fields"]} == {"nom", "pv"} db.insert_row(slug, definition, {"nom": "Aldric", "pv": "100"}) rows = db.list_rows(slug, definition) assert len(rows) == 1 assert rows[0]["nom"] == "Aldric" assert rows[0]["pv"] == 100 row_id = rows[0]["id"] db.update_row(slug, definition, row_id, {"nom": "Aldric le Brave", "pv": "80"}) updated = db.get_row(slug, definition, row_id) assert updated["nom"] == "Aldric le Brave" assert updated["pv"] == 80 field_def = next(f for f in definition["fields"] if f["name"] == "pv") db.update_row_field(slug, definition, row_id, field_def, 42) assert db.get_row(slug, definition, row_id)["pv"] == 42 # update_row_field ne doit toucher qu'à cette seule colonne assert db.get_row(slug, definition, row_id)["nom"] == "Aldric le Brave" db.delete_row(slug, definition, row_id) assert db.list_rows(slug, definition) == [] db.delete_definition(slug, definition_id) assert db.get_definition(slug, definition_id) is None def test_relation_blocks_deletion_reference_check(tmp_game_slug_cleanup): slug = db.create_game("Relations Test") tmp_game_slug_cleanup(slug) lieu_id = db.create_definition(slug, "Lieu", [{"name": "nom", "type": "texte"}]) perso_id = db.create_definition( slug, "Personnage", [{"name": "nom", "type": "texte"}, {"name": "lieu", "type": "relation", "relation_definition_id": lieu_id}], ) refs = db.definitions_referencing(slug, lieu_id) assert any(r["id"] == perso_id for r in refs)