770b7cbdf8
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.
51 lines
2.1 KiB
Python
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}"
|