Checklist — Tests Stripe (DEV/TEST) — Yinshi
Objectif : exécuter une batterie de tests reproductibles (mode test Stripe) pour valider :
- le checkout et la création d'abonnement
- les scénarios d'échec de paiement (carte refusée, 3DS, fonds insuffisants, etc.)
- les renouvellements / impayés / annulations
- l'expiration et la perte d'accès premium
- la cohérence des écritures Firestore (extension Stripe + Cloud Functions du repo)
Projet Firebase DEV/TEST : yin-shi-dev
PWA de test : https://yinshi-test.yinshi.app/
Stripe : mode Test
Pré-requis (avant de tester)
- [x] PWA pointe bien sur DEV/TEST
-
Validation : dans les logs init Firebase (ou via
projectId) on doit voiryin-shi-dev. -
[x] Extension Stripe installée sur DEV/TEST (
invertase/firestore-stripe-payments) -
Validation : dans la console Firebase
yin-shi-dev→ Functions, voir des fonctionsext-firestore-stripe-payments-*. -
[x] Cloud Functions "métier" du repo déployées sur DEV/TEST
-
Validation : dans la console Firebase
yin-shi-dev→ Functions, voir :syncStripeToAppUsersyncStripeToAppUserOnCreate
-
[x] Cache PWA neutralisé (éviter les faux négatifs)
- Validation : hard refresh + purge cache/service worker si nécessaire.
Où regarder (observabilité)
Côté Firestore (DEV/TEST)
- [ ]
customers/{uid}/checkout_sessions/{sessionId} -
Indicateurs utiles : présence du champ
url, statut mis à jour après paiement. -
[ ]
customers/{uid}/subscriptions/{subscriptionId} -
Indicateurs utiles :
status,current_period_end,cancel_at_period_end, etc. -
[ ]
app_users/{uid} - Indicateurs utiles :
app_user_role(attendu :Paidaprès abonnement actif)app_user_currentPeriodEndapp_user_updatedAt
Côté Cloud Functions (DEV/TEST)
- [ ] Logs Functions (console Firebase → Functions → Logs)
- Chercher :
updated to role(mise à jour du rôle utilisateur).
Côté Stripe Dashboard (mode test)
- [ ] Customer
- [ ] Payments
- [ ] Subscriptions
- [ ] Events (utile pour diagnostiquer un scénario)
Rappels : comment utiliser Stripe Dashboard (mode test)
Passer en mode test
- [ ] Dans Stripe Dashboard, activer le toggle Test mode.
Retrouver un utilisateur / un paiement
- [ ] Customers : chercher par email (si disponible), sinon filtrer par date.
- [ ] Payments : filtrer par date, cliquer sur le paiement pour voir les détails.
- [ ] Subscriptions : vérifier le statut, les dates de période et l'historique.
Simuler des scénarios (moyens)
- [ ] Via cartes de test : utiliser des numéros de carte Stripe test adaptés au scénario.
- [ ] Via action sur subscription : annuler / reprendre / modifier (selon écrans disponibles).
- [ ] Via events : consulter les événements générés (utile pour confirmer ce que Stripe a émis).
Note : les cartes test exactes peuvent évoluer ; se référer à la documentation officielle Stripe "Test cards" si besoin.
A) Tests Checkout & création d'abonnement
A1 — Checkout réussi (référence)
- [ ] Préparation : créer un utilisateur neuf (ou supprimer l'ancien utilisateur DEV/TEST).
- [ ] Dans la PWA : déclencher un checkout.
- [ ] Payer avec une carte test "succès".
Vérifications Firestore
- [ ]
customers/{uid}/checkout_sessions/{id}existe et est mis à jour. - [ ]
customers/{uid}/subscriptions/{id}.status == "active". - [ ]
app_users/{uid}.app_user_role == "Paid".
Vérifications logs
- [ ] Logs Functions : une entrée montrant la mise à jour du rôle.
A2 — Retour success_url / cancel_url
- [ ] Vérifier que le retour Stripe redirige vers
https://yinshi-test.yinshi.app/. - [ ] Vérifier que l'utilisateur reste connecté et que la PWA se met à jour (pas de cache).
B) Tests Échecs de paiement (carte refusée / auth)
B1 — Carte refusée (paiement échoue)
- [ ] Dans la PWA : lancer le checkout.
- [ ] Utiliser une carte test "declined".
Attendu
- [ ] La PWA affiche une erreur claire ou un état d'échec.
- [ ] Firestore : la subscription peut être absente ou
statusnon actif (selon Stripe/extension). - [ ]
app_users/{uid}.app_user_rolene doit pas devenirPaid.
B2 — Fonds insuffisants
- [ ] Checkout → carte test "insufficient_funds".
Attendu
- [ ] Pas de passage à
Paid. - [ ] Stripe Dashboard → Payment doit être en échec.
B3 — 3D Secure requis (authentication)
- [ ] Checkout → carte test nécessitant 3DS.
- [ ] Terminer le challenge.
Attendu
- [ ] Si le challenge est validé : mêmes validations que A1.
B4 — 3DS échoué / abandonné
- [ ] Checkout → carte test 3DS.
- [ ] Échouer ou abandonner le challenge.
Attendu
- [ ] Pas de passage à
Paid.
C) Tests cycle de vie de l'abonnement
C1 — Annulation en fin de période (cancel_at_period_end)
- [ ] Provoquer une annulation (via PWA si écran disponible, sinon via Stripe Dashboard → Subscription → Cancel).
Vérifications
- [ ]
customers/{uid}/subscriptions/{id}reflète l'annulation planifiée. - [ ] Tant que la période n'est pas terminée : l'utilisateur peut rester
Paid.
C2 — Annulation immédiate
- [ ] Dans Stripe Dashboard : annuler immédiatement.
Vérifications
- [ ] L'abonnement passe à un statut non actif.
- [ ] Après propagation :
app_users/{uid}.app_user_roledoit finir enExpired(ou nonPaid) selon la logique métier.
C3 — Renouvellement (cycle normal)
- [ ] (Si possible) attendre/forcer un renouvellement test.
Vérifications
- [ ] Stripe : facture payée.
- [ ] Firestore :
current_period_endmis à jour. - [ ]
app_users/{uid}restePaid.
D) Tests impayés (dunning) / paiement en retard
D1 — Renouvellement échoué puis récupéré
- [ ] Simuler un échec au renouvellement (carte qui échoue), puis corriger le moyen de paiement.
Vérifications
- [ ] Stripe : invoice en échec puis payée.
- [ ] Firestore :
subscriptionsreflète l'état. - [ ]
app_users/{uid}.app_user_role: vérifier si un downgrade temporaire est attendu ou non.
D2 — Impayé persistant (unpaid)
- [ ] Laisser l'échec persister.
Vérifications
- [ ] Stripe : subscription devient
unpaid/past_dueselon config. - [ ] Firestore :
statusreflète cet état. - [ ]
app_users/{uid}.app_user_role: vérifier la transition attendue (souventExpiredaprès fin de période).
E) Tests d'expiration / perte d'accès premium
E1 — Expiration après fin de période
- [ ] Provoquer un
current_period_enddans le passé (via attente ou scénario Stripe approprié).
Vérifications
- [ ]
app_users/{uid}.app_user_roledevientExpired. - [ ] La PWA bloque les features premium si elles sont réservées.
Note : si un cron/planificateur est requis pour mettre à jour des expirations, vérifier la présence de la fonction planifiée et son exécution.
F) Tests portail client (Customer Portal)
F1 — Accès portail
- [ ] Depuis la PWA, ouvrir le portail (si écran disponible).
Vérifications
- [ ] Stripe ouvre le portail.
- [ ] On peut voir l'abonnement.
F2 — Changement moyen de paiement
- [ ] Dans le portail : changer la carte.
Vérifications
- [ ] Stripe enregistre la carte.
- [ ] Les paiements suivants utilisent le nouveau moyen.
G) Tests remboursements / litiges (si applicable au scope)
G1 — Remboursement (refund)
- [ ] Dans Stripe Dashboard : Payment → Refund.
Vérifications
- [ ] Stripe : refund visible.
- [ ] Définir l'impact métier attendu sur le rôle (souvent : pas d'impact immédiat si période en cours, ou annulation selon politique).
H) Tests robustesse (régression / anti-faux négatifs)
H1 — Re-test après purge cache PWA
- [ ] Purger cache / désinscrire SW, recharger.
- [ ] Vérifier que les écritures Firestore et le rôle sont cohérents.
H2 — Re-test sur navigateur privé / autre navigateur
- [ ] Tester le même scénario sur un navigateur vierge.
Critères d'acceptation (DoD)
- [ ] Les scénarios A (succès), B (échecs) et C/D/E (lifecycle) ont un résultat cohérent.
- [ ] Chaque test a une trace vérifiable (Stripe Dashboard + Firestore + logs Functions).
- [ ] Le passage
Paidest confirmé après checkout réussi. - [ ] La perte d'accès (annulation/expiration) est cohérente avec la logique métier.
Notes / résultats (à remplir)
- Date :
- Version PWA test :
- UID(s) testés :
- Observations :
- Anomalies :