Files
colibre/tests/saved_views/test_ui.py
T
Colin Maudry f0a891b73f fix(tableau): griser/désactiver les boutons vues pour les non-abonnés
La barre des vues sauvegardées restait masquée pour les non-abonnés via un
style inline display:none — inopérant car .d-inline-flex est
display:inline-flex !important, la barre était donc toujours visible.

La barre reste désormais visible pour tous ; « Sauvegarder la vue » et
« Mes vues » sont grisés et désactivés (disabled) pour les non-abonnés. Le
gating serveur de save_view (prepare_view_to_save) reste inchangé.
2026-07-13 19:23:03 +02:00

114 lines
3.4 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, token="abc123"):
return _Row(id=view_id, name=name, query=query, token=token)
def test_controls_disabled_for_non_subscriber():
assert ui.controls_disabled(False) is True
assert ui.controls_disabled(True) is False
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
def test_slugify_accents_spaces_case():
assert ui.slugify("Mes Marchés 2024") == "mes-marches-2024"
def test_slugify_special_chars_collapse_and_trim():
assert ui.slugify(" Éà!! --- test__ok ") == "ea-test-ok"
def test_slugify_never_contains_underscore():
assert "_" not in ui.slugify("a_b c")
def test_slugify_empty():
assert ui.slugify("") == ""
assert ui.slugify(None) == ""
def test_build_view_url_dev_domain(monkeypatch):
# DOMAIN_NAME est résolu à l'import ; on patche l'attribut du module ui.
monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr")
url = ui.build_view_url("Mes Marchés", "abc123")
assert url == "https://test.colibre.fr/tableau?vue=mes-marches_abc123"
def test_build_view_url_empty_slug_omits_prefix(monkeypatch):
monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr")
url = ui.build_view_url("!!!", "abc123")
assert url == "https://test.colibre.fr/tableau?vue=abc123"
def test_token_from_vue_param():
assert ui.token_from_vue_param("mes-marches-2024_abc123") == "abc123"
assert ui.token_from_vue_param("zzz_abc123") == "abc123"
assert ui.token_from_vue_param("abc123") == "abc123"
assert ui.token_from_vue_param("") is None
assert ui.token_from_vue_param(None) is None
def test_view_row_open_uses_short_url(monkeypatch):
monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr")
row = ui._view_row(_view(1, "Mes Marchés", "q", token="tok123"))
text = str(row)
assert "https://test.colibre.fr/tableau?vue=mes-marches_tok123" in text
def test_view_row_has_clipboard_with_url(monkeypatch):
monkeypatch.setattr(ui, "DOMAIN_NAME", "test.colibre.fr")
row = ui._view_row(_view(1, "Mes Marchés", "q", token="tok123"))
text = str(row)
assert "Clipboard" in text
assert "Copier le lien" in text