Files
colibre/tests/test_entity_grid_datasource.py
Colin Maudry 770b7cbdf8 fix(entity_grid): sortie MATCH unique pour le datasource (dash.set_props)
Le datasource _get_rows des grilles acheteur/titulaire mélangeait une sortie
MATCH (getRowsResponse de la grille pattern-matching) avec deux sorties fixes
(<org>-total / -total-unique). Dash l'interdit : le dev-renderer (mode debug de
run.py) lève « MATCH wildcards must be on the same keys for all Outputs » (4
erreurs : 2 par page). Le callback échoue au dispatch et la grille reste vide.

Correctif : _get_rows n'a plus qu'une sortie MATCH (getRowsResponse) ; les
stores totaux (id fixes) sont alimentés impérativement via dash.set_props.

Test de régression en debug=True (dev-renderer) : sans le correctif la grille ne
charge aucune ligne ; avec, lignes + compteur « N marchés » présents.
2026-07-13 19:40:26 +02:00

51 lines
2.1 KiB
Python

"""Régression : le datasource server-side de la grille entité (_get_rows) doit
répondre sans erreur de callback Dash.
Bug migration AG Grid (#41) : _get_rows mélangeait une sortie MATCH
(getRowsResponse de la grille pattern-matching) avec des sorties fixes
(acheteur-total / -total-unique). Dash l'interdit (« MATCH wildcards must be on
the same keys for all Outputs ») — l'erreur est levée par le dev-renderer en
mode debug (celui de `run.py`), pas par le renderer de production. Le callback
échoue alors au dispatch et la grille ne reçoit aucune ligne.
Ce test tourne donc en `debug=True` (dev-renderer) pour exercer cette
validation, sinon le bug passe inaperçu. Le correctif : une seule sortie MATCH,
les stores totaux alimentés via dash.set_props.
"""
import src.app # noqa: F401 # instancie l'app → register_page()
from src.db import query_marches
def _an_acheteur_id():
return query_marches("TRUE", (), columns=["acheteur_id"])["acheteur_id"][0]
def test_entity_grid_datasource_returns_rows_in_debug(dash_duo):
from src.app import app
ach = _an_acheteur_id()
# debug=True → dev-renderer, qui valide la cohérence MATCH des Outputs.
dash_duo.start_server(
app, debug=True, use_reloader=False, dev_tools_hot_reload=False
)
dash_duo.wait_for_text_to_equal(".logo > h1", "colibre", timeout=6)
dash_duo.wait_for_page(dash_duo.server_url + f"/acheteurs/{ach}")
# La grille charge des lignes → _get_rows a répondu (pas d'erreur de dispatch).
dash_duo.wait_for_element(
"#acheteur-grid-container .ag-center-cols-container .ag-row", timeout=15
)
# nb_rows alimenté via les stores totaux mis à jour par set_props côté serveur.
dash_duo.wait_for_contains_text("#acheteur_nb_rows", "marchés", timeout=8)
assert "0 marchés" not in dash_duo.find_element("#acheteur_nb_rows").text
# Aucune erreur « Mismatched MATCH wildcards » dans la console du dev-renderer.
match_errors = [
entry
for entry in (dash_duo.get_logs() or [])
if "MATCH" in str(entry.get("message", ""))
]
assert not match_errors, f"Erreur dev-renderer MATCH : {match_errors}"