Files
colibre/tests/saved_views/test_ui.py
T
Colin Maudry 8efd8db07e feat(tableau): vues sauvegardées en JSON AST, retrait URL riche (#41)
Les vues stockent désormais {filterModel, columnState} en JSON dans
saved_views.query au lieu d'une query string DSL. Le rappel d'une vue
applique filterModel + columnState à la grille AG Grid via un nouveau
callback apply_saved_view, déclenché par pattern-matching sur les items
du menu "Mes vues" (désormais cliquables au lieu de liens href).

Retire restore_view_from_url, sync_url_and_reset_button,
show_confirmation, le bouton "Partager la vue" et le clientside
clean_filters de tableau.py - la migration AG Grid retire le mécanisme
d'URL riche sans rétrocompatibilité.

Le lien "Ouvrir" de compte/vues.py pointe maintenant vers /tableau nu
(limitation connue documentée, le rappel cross-page reste à faire).
2026-07-10 08:35:31 +02:00

61 lines
1.6 KiB
Python

from src.saved_views import ui
class _Row(dict):
"""Imite un sqlite3.Row : accès par clé."""
def _view(view_id, name, query):
return _Row(id=view_id, name=name, query=query)
def test_bar_style_hidden_for_non_subscriber():
assert ui.bar_style(False) == {"display": "none"}
assert ui.bar_style(True) == {}
def test_clean_view_name_strips_and_empties():
assert ui.clean_view_name(" Ma vue ") == "Ma vue"
assert ui.clean_view_name(" ") == ""
assert ui.clean_view_name(None) == ""
def test_prepare_refuses_non_subscriber():
name, err = ui.prepare_view_to_save(False, "Ma vue")
assert name is None
assert err
def test_prepare_refuses_empty_name():
name, err = ui.prepare_view_to_save(True, " ")
assert name is None
assert err
def test_prepare_accepts_valid():
name, err = ui.prepare_view_to_save(True, " Ma vue ")
assert name == "Ma vue"
assert err is None
def test_saved_views_items_build_clickable_entries():
items = ui.saved_views_items(
[_view(1, "Vue A", "filtres=a"), _view(2, "Vue B", "tris=b")]
)
assert len(items) == 2
assert items[0].id == {"type": "saved-view-item", "index": 1}
assert items[0].children == "Vue A"
assert items[1].id == {"type": "saved-view-item", "index": 2}
def test_views_table_empty_state():
out = ui.views_table([])
# un Div non vide (message d'état) sans item de suppression
assert out is not None
def test_views_table_lists_views():
out = ui.views_table([_view(1, "Vue A", "filtres=a")])
text = str(out)
assert "Vue A" in text