feat: améliorations UX roadmap votes #94
- Votes cappés à VOTES_PER_WEEK (pas d'accumulation) pour valoriser les connexions régulières - Solde de votes affiché dans la liste (input inéditable) à la place du bandeau Alert, avec date de prochain rechargement - Compteur de votes par feature affiché comme input inéditable en fin de ligne (avant le bouton "+") - Animation FLIP JS (roadmap_flip.js) : seules les lignes qui changent de position sont animées après un vote - Renommage votes_credited_until → votes_last_credited_at (migration 0005) - Constantes du module utilisées dans les assertions de tests Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,14 @@
|
||||
import pytest
|
||||
|
||||
# Dash minimal pour que register_page() fonctionne dans les tests de pages de ce
|
||||
# répertoire (CONFIG peuplé). Instancié une seule fois, ici, avant tout import de page.
|
||||
from dash import Dash as _Dash
|
||||
|
||||
_Dash(__name__, use_pages=True, pages_folder="", assets_folder="assets")
|
||||
# Importer l'app complète à la collecte : sa découverte use_pages enregistre
|
||||
# chaque page (et ses @callback) exactement une fois, en contexte propre. Un Dash
|
||||
# minimal ad hoc suivi d'imports de pages dans les tests provoque un double
|
||||
# enregistrement des @callback (Dash ré-exécute chaque page via exec_module
|
||||
# pendant la découverte de src.app), d'où "Duplicate callback outputs" qui casse
|
||||
# le rendu de toutes les pages dans la suite Selenium. En important src.app ici,
|
||||
# la découverte tourne en premier et les imports ultérieurs de pages sont mis en
|
||||
# cache. Voir aussi tests/subscriptions/conftest.py.
|
||||
from src.app import app # noqa: F401, E402
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -3,11 +3,6 @@ from dash import dcc, html
|
||||
from src.roadmap import ui
|
||||
|
||||
|
||||
def test_balance_text_singular_plural():
|
||||
assert ui.balance_text(1) == "Il te reste 1 vote."
|
||||
assert ui.balance_text(3) == "Il te reste 3 votes."
|
||||
|
||||
|
||||
def test_vote_items_sorted_by_count_desc():
|
||||
au_vote = [
|
||||
{"number": 1, "title": "A", "html_url": "u1"},
|
||||
@@ -22,8 +17,8 @@ def test_vote_items_sorted_by_count_desc():
|
||||
|
||||
def test_vote_items_buttons_only_when_editable():
|
||||
au_vote = [{"number": 1, "title": "A", "html_url": "u1"}]
|
||||
assert "Voter" in str(ui.vote_items(au_vote, {1: 0}, editable=True))
|
||||
assert "Voter" not in str(ui.vote_items(au_vote, {1: 0}, editable=False))
|
||||
assert "roadmap-vote" in str(ui.vote_items(au_vote, {1: 0}, editable=True))
|
||||
assert "roadmap-vote" not in str(ui.vote_items(au_vote, {1: 0}, editable=False))
|
||||
|
||||
|
||||
def test_changelog_markdown_returns_component():
|
||||
@@ -47,4 +42,5 @@ def test_roadmap_content_renders(monkeypatch):
|
||||
assert isinstance(content, html.Div)
|
||||
assert "En cours X" in s
|
||||
assert "Au vote Y" in s
|
||||
assert "Il te reste 2 votes." in s
|
||||
assert "Votes restants" in s
|
||||
assert "value='2'" in s
|
||||
|
||||
Reference in New Issue
Block a user