Le rôle "admin" contournait entièrement l'isolation par projet (core/auth_guard.py) : il pouvait ouvrir/modifier/supprimer le jeu de n'importe quel autre compte en connaissant son slug, et la page d'accueil listait sans filtrage tous les projets de tous les comptes. - La propriété d'un projet se vérifie désormais sur le segment "propriétaire" du slug (id du compte), pour tous les rôles y compris admin — un slug "à plat" (sans compte associé) reste réservé à l'admin, comportement historique conservé pour ce cas précis. - routes/games/index.py ne liste plus que les projets du compte connecté. - Le dossier propriétaire d'un projet est maintenant l'id numérique du compte, plus jamais son email slugifié (visible en clair dans chaque URL auparavant) — script de migration fourni et déjà exécuté sur les données existantes. - Changer d'email ne renomme plus aucun dossier (n'en dépend plus). - Deux nouveaux tests de régression, fixtures corrigées en conséquence. - README réécrit pour refléter l'état actuel du produit (jeu 2D uniquement, plus de traces de l'ancien éditeur "document").
88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
"""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)
|