diff --git a/src/pages/compte/roadmap.py b/src/pages/compte/roadmap.py index e028b24..8d3ca1b 100644 --- a/src/pages/compte/roadmap.py +++ b/src/pages/compte/roadmap.py @@ -22,10 +22,15 @@ def layout(**_): return guard balance = subs_db.credit_pending(current_user.id) next_recharge = subs_db.next_recharge_at(current_user.id) + sub = subs_db.get_current(current_user.id) return account_shell( "roadmap", roadmap_ui.roadmap_content( - editable=True, balance=balance, next_recharge=next_recharge + editable=True, + balance=balance, + next_recharge=next_recharge, + sub_status=sub["status"] if sub else None, + trial_ends_at=sub["current_period_end"] if sub else None, ), ) diff --git a/src/roadmap/ui.py b/src/roadmap/ui.py index 551f626..e0cb4a8 100644 --- a/src/roadmap/ui.py +++ b/src/roadmap/ui.py @@ -106,8 +106,26 @@ def _en_cours_items(en_cours: list[dict]) -> list: ] +def _trial_hint(sub_status: str | None, trial_ends_at: str | None): + if sub_status != "trial" or not trial_ends_at: + return None + try: + end_date = datetime.fromisoformat(trial_ends_at).strftime("%d/%m/%Y") + except (ValueError, TypeError): + return None + return dbc.Alert( + f"Vous pourrez voter à la fin de votre période d'essai, le {end_date}.", + color="info", + className="mb-3", + ) + + def roadmap_content( - editable: bool, balance: int | None = None, next_recharge: datetime | None = None + editable: bool, + balance: int | None = None, + next_recharge: datetime | None = None, + sub_status: str | None = None, + trial_ends_at: str | None = None, ) -> html.Div: try: issues = github.fetch_roadmap_issues() @@ -126,6 +144,9 @@ def roadmap_content( "Les abonné·es votent pour les fonctionnalités à développer en priorité." ) ) + trial_hint = _trial_hint(sub_status, trial_ends_at) if editable else None + if trial_hint is not None: + body.append(trial_hint) body.append( html.Div( dbc.ListGroup( diff --git a/tests/roadmap/test_ui.py b/tests/roadmap/test_ui.py index c7a4d23..45d595e 100644 --- a/tests/roadmap/test_ui.py +++ b/tests/roadmap/test_ui.py @@ -44,3 +44,35 @@ def test_roadmap_content_renders(monkeypatch): assert "Au vote Y" in s assert "Votes restants" in s assert "value='2'" in s + + +def test_roadmap_content_shows_trial_hint(monkeypatch): + monkeypatch.setattr( + ui.github, + "fetch_roadmap_issues", + lambda: {"en_cours": [], "au_vote": []}, + ) + monkeypatch.setattr(ui.roadmap_db, "vote_counts", lambda: {}) + content = ui.roadmap_content( + editable=True, + balance=0, + sub_status="trial", + trial_ends_at="2026-07-20T10:00:00+00:00", + ) + assert "20/07/2026" in str(content) + + +def test_roadmap_content_no_trial_hint_when_active(monkeypatch): + monkeypatch.setattr( + ui.github, + "fetch_roadmap_issues", + lambda: {"en_cours": [], "au_vote": []}, + ) + monkeypatch.setattr(ui.roadmap_db, "vote_counts", lambda: {}) + content = ui.roadmap_content( + editable=True, + balance=3, + sub_status="active", + trial_ends_at=None, + ) + assert "période d'essai" not in str(content)