fix(abonnement): garde active→pending, datetime parse, resolve_handle vide (#90)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DRGb8NAMwaTZxUszSbaj4N
This commit is contained in:
@@ -29,11 +29,15 @@ def test_subscribe_redirects_to_hosted_url(logged_in_client, monkeypatch):
|
||||
|
||||
def test_subscribe_disables_trial_after_first_use(logged_in_client, monkeypatch):
|
||||
client, uid = logged_in_client
|
||||
# L'utilisateur a déjà consommé un essai par le passé.
|
||||
# L'utilisateur a déjà consommé un essai par le passé (abonnement maintenant expiré).
|
||||
db.create_pending(uid, "decpinfo-%d" % uid, "simple")
|
||||
db.update_from_webhook(
|
||||
"decpinfo-%d" % uid, "sub_42", "trial", "2099-01-01T00:00:00+00:00"
|
||||
)
|
||||
# L'essai est terminé : abonnement expiré, trial_used reste à 1.
|
||||
db.update_from_webhook(
|
||||
"decpinfo-%d" % uid, "sub_42", "expired", "2020-01-01T00:00:00+00:00"
|
||||
)
|
||||
captured = {}
|
||||
monkeypatch.setattr(
|
||||
frisbii_client, "get_or_create_customer", lambda h, e: {"handle": h}
|
||||
@@ -124,3 +128,36 @@ def test_webhook_updates_subscription(sub_app, monkeypatch):
|
||||
row = db.get_by_user(uid)
|
||||
assert row["status"] == "active"
|
||||
assert row["frisbii_subscription_handle"] == "sub_42"
|
||||
|
||||
|
||||
def test_subscribe_skips_if_already_active(logged_in_client, monkeypatch):
|
||||
"""Fix 1 : un abonné actif ne doit pas voir son statut remis à 'pending'."""
|
||||
client, uid = logged_in_client
|
||||
db.create_pending(uid, "decpinfo-%d" % uid, "simple")
|
||||
db.update_from_webhook(
|
||||
"decpinfo-%d" % uid, "sub_42", "active", "2099-01-01T00:00:00+00:00"
|
||||
)
|
||||
called = []
|
||||
monkeypatch.setattr(
|
||||
frisbii_client, "get_or_create_customer", lambda h, e: called.append(h)
|
||||
)
|
||||
resp = client.post("/subscriptions/subscribe", data={"plan": "simple"})
|
||||
# Doit rediriger vers la page abonnement, sans appeler Frisbii.
|
||||
assert resp.status_code == 302
|
||||
assert "compte/abonnement" in resp.headers["Location"]
|
||||
assert called == [], "Frisbii ne doit pas être appelé pour un abonné actif"
|
||||
# Le statut DB ne doit pas avoir été écrasé.
|
||||
assert db.get_by_user(uid)["status"] == "active"
|
||||
|
||||
|
||||
def test_subscribe_skips_if_trial_active(logged_in_client, monkeypatch):
|
||||
"""Fix 1 : un abonné en période d'essai est protégé de la même façon."""
|
||||
client, uid = logged_in_client
|
||||
db.create_pending(uid, "decpinfo-%d" % uid, "simple")
|
||||
db.update_from_webhook(
|
||||
"decpinfo-%d" % uid, "sub_42", "trial", "2099-01-01T00:00:00+00:00"
|
||||
)
|
||||
resp = client.post("/subscriptions/subscribe", data={"plan": "simple"})
|
||||
assert resp.status_code == 302
|
||||
assert "compte/abonnement" in resp.headers["Location"]
|
||||
assert db.get_by_user(uid)["status"] == "trial"
|
||||
|
||||
Reference in New Issue
Block a user