Adaptation de l'effet de TOUS_ABONNES

This commit is contained in:
Colin Maudry
2026-07-14 12:53:01 +02:00
parent ad293acd88
commit 70ca65e962
11 changed files with 145 additions and 39 deletions
+15
View File
@@ -16,6 +16,21 @@ def test_verify_email_valid_token_logs_in_and_redirects_to_mes_infos(
assert sess.get("_user_id") == str(uid)
def test_verify_email_tous_abonnes_redirects_to_abonnement(
client, users_db_path, monkeypatch
):
monkeypatch.setattr("src.utils.TOUS_ABONNES", True)
db.init_schema()
uid = db.create_user("t@b.c", "hash")
token = tokens.create_verification_token(uid)
resp = client.get(f"/auth/verify-email?token={token}")
assert resp.status_code == 302
loc = resp.headers["Location"]
assert loc.endswith("/compte/abonnement")
assert "mes-infos" not in loc
def test_verify_email_invalid_token(client):
resp = client.get("/auth/verify-email?token=invalide")
assert "error=invalid_token" in resp.headers["Location"]
@@ -6,6 +6,39 @@ def test_reabo_button_links_to_abonnement_page():
assert "/a-propos/abonnement" in text
def test_free_access_view_message():
from src.pages.compte import abonnement as compte_abonnement
text = str(compte_abonnement._free_access_view())
assert "temporairement accès à toutes les fonctionnalités" in text
assert "Pensez à copier les liens vers vos vues" in text
def test_no_sub_view_uses_free_access_when_tous_abonnes():
from src.pages.compte import abonnement as compte_abonnement
text = str(compte_abonnement._no_sub_view(True, None))
assert "temporairement accès" in text
assert "Abonnez-vous" not in text
def test_no_sub_view_uses_reabo_when_flag_off():
from src.pages.compte import abonnement as compte_abonnement
text = str(compte_abonnement._no_sub_view(False, None))
assert "Abonnez-vous" in text
assert "temporairement accès" not in text
def test_no_sub_view_shows_expired_alert_when_flag_off():
from src.pages.compte import abonnement as compte_abonnement
row = {"status": "expired", "current_period_end": None}
text = str(compte_abonnement._no_sub_view(False, row))
assert "expiré" in text
assert "Abonnez-vous" in text
def test_active_view_shows_cancel(monkeypatch):
from src.pages.compte import abonnement as compte_abonnement
@@ -7,6 +7,18 @@ def _plan_env(monkeypatch):
monkeypatch.setenv("FRISBII_PLAN_SOUTIEN", "plan_soutien")
def test_layout_redirects_to_abonnement_when_tous_abonnes(monkeypatch):
monkeypatch.setattr("src.utils.TOUS_ABONNES", True)
from src.pages.compte import abonnement_mes_infos as m
text = str(m.layout())
# redirection du flag vers /compte/abonnement (href exact), pas le guard de
# connexion ni un renvoi vers la page carte bancaire mes-infos
assert "href='/compte/abonnement'" in text
assert "Mes informations de facturation" not in text
assert "connexion" not in text
def test_selectable_cards_render_both_plans():
from src.pages.compte import abonnement_mes_infos as m
+13 -2
View File
@@ -44,12 +44,23 @@ def test_subscribe_button_active_sub_manages():
assert "href='/compte/abonnement'" in text
def test_subscribe_button_disabled_when_tous_abonnes():
def test_subscribe_button_tous_abonnes_visitor_free_signup():
from src.app import app # noqa: F401
from src.pages.a_propos import abonnement as page
text = str(page._subscribe_button(False, False, True))
assert "disabled" in text
assert "Je m'abonne gratuitement" in text
assert "href='/inscription'" in text
assert "disabled" not in text
def test_subscribe_button_tous_abonnes_authenticated_goes_to_compte():
from src.app import app # noqa: F401
from src.pages.a_propos import abonnement as page
text = str(page._subscribe_button(True, False, True))
assert "href='/compte/abonnement'" in text
assert "disabled" not in text
def test_cgu_terms_trimmed_of_features_section():
-25
View File
@@ -1,25 +0,0 @@
from dash.testing.composite import DashComposite
def _rgb_tuple(css_color: str) -> tuple[int, int, int]:
"""Parse 'rgb(r, g, b)' ou 'rgba(r, g, b, a)' en (r, g, b)."""
inner = css_color[css_color.index("(") + 1 : css_color.index(")")]
parts = [p.strip() for p in inner.split(",")]
return (int(parts[0]), int(parts[1]), int(parts[2]))
def test_btn_primary_is_terracotta(dash_duo: DashComposite):
"""Garde de non-régression : le bouton primaire de l'accueil conserve son
dégradé terracotta et son texte blanc après l'override de la charte."""
from src.app import app
dash_duo.start_server(app)
dash_duo.wait_for_element("a.btn.btn-primary, button.btn.btn-primary", timeout=10)
btn = dash_duo.find_element("a.btn.btn-primary, button.btn.btn-primary")
# Le dégradé terracotta est posé via background-image ; le texte est blanc.
bg_image = btn.value_of_css_property("background-image")
color = btn.value_of_css_property("color")
assert "gradient" in bg_image # dégradé terracotta appliqué
assert _rgb_tuple(color) == (255, 255, 255) # texte blanc
+9
View File
@@ -25,3 +25,12 @@ def test_inscription_linkedin_targets_mes_infos():
assert "/auth/linkedin?next=/compte/abonnement/mes-infos" in str(
inscription.layout()
)
def test_inscription_linkedin_targets_abonnement_when_tous_abonnes(monkeypatch):
monkeypatch.setattr("src.utils.TOUS_ABONNES", True)
# Import app first to initialize Dash
from src.app import app # noqa: F401
from src.pages import inscription
assert "/auth/linkedin?next=/compte/abonnement'" in str(inscription.layout())