Skip to content

Latest commit

ย 

History

History
386 lines (299 loc) ยท 14.4 KB

File metadata and controls

386 lines (299 loc) ยท 14.4 KB

๐Ÿงช Guide de Test : Guest Checkout avec signInAnonymously

๐Ÿ“‹ Checklist de Test Complรจte

Phase 1 : Guest Checkout (Sans compte)

Test 1.1 : Navigation basique guest

  • Ouvrir le site en navigation privรฉe (ou vider cookies/localStorage)
  • Vรฉrifier : Pas de login automatique
  • Naviguer vers /explore โ†’ Choisir un truck
  • Ajouter des items au panier
  • Cliquer "Payer"

Rรฉsultat attendu :

  • La page Checkout affiche : "๐Ÿ’ก Vous pouvez payer sans crรฉer de compte..."
  • Pas d'erreur dans la console

Test 1.2 : Crรฉation compte anonyme au checkout

  • Cliquer sur "Payer sur Stripe"
  • Ouvrir DevTools โ†’ Console
  • Vรฉrifier qu'un signInAnonymously() est appelรฉ

Rรฉsultat attendu :

// Dans la console DevTools
[PLANIZZA] Firebase non configurรฉ (mode DEV)...
// OU si Firebase configurรฉ :
auth.currentUser.isAnonymous === true
auth.currentUser.uid !== null  // UID Firebase valide (ex: "abc123xyz")

Test 1.3 : Redirection Stripe

  • Aprรจs crรฉation du compte anonyme, vรฉrifier la redirection Stripe Checkout

Rรฉsultat attendu :

  • Redirection vers https://checkout.stripe.com/...
  • Aucune erreur 401 "Vous devez รชtre connectรฉ pour payer"

Test 1.4 : Paiement test Stripe

  • Sur la page Stripe Checkout, utiliser une carte de test :
    • Numรฉro : 4242 4242 4242 4242
    • Expiration : N'importe quelle date future (ex: 12/34)
    • CVC : N'importe quel 3 chiffres (ex: 123)
  • Cliquer "Payer"

Rรฉsultat attendu :

  • Redirection vers /checkout/success?orderId=xxx&session_id=yyy

Test 1.5 : Page CheckoutSuccess (guest)

  • Vรฉrifier l'affichage initial : "Commande en cours de validation"
  • Attendre 3 secondes โ†’ Le webhook Stripe devrait passer
  • Vรฉrifier l'affichage final : "Paiement validรฉ !"

Rรฉsultat attendu :

  • Bloc de crรฉation de compte visible avec texte :

    "๐ŸŽ‰ Crรฉez un compte pour suivre votre commande !" "Votre paiement est confirmรฉ ! En crรฉant un compte maintenant..."

  • Bouton "Crรฉer mon compte"

Phase 2 : Upgrade du Compte Anonyme

Test 2.1 : Clic sur "Crรฉer mon compte"

  • Cliquer sur "Crรฉer mon compte"
  • Vรฉrifier la redirection vers /register

Rรฉsultat attendu :

  • URL : /register
  • location.state.orderId contient l'ID de la commande
  • Titre : "Sauvegarder votre commande" (au lieu de "Crรฉer un compte")

Test 2.2 : Inscription avec email/password

  • Remplir le formulaire :
    • Email : test+guest@example.com
    • Password : password123
  • Cliquer "S'inscrire"

Rรฉsultat attendu dans DevTools Console :

[PLANIZZA] Compte anonyme upgradรฉ avec succรจs ! abc123xyz

Vรฉrifications Firebase :

  • Ouvrir Firebase Console โ†’ Authentication โ†’ Users
  • Chercher l'UID du user (ex: abc123xyz)
  • Vรฉrifier :
    • Provider : password (plus anonymous)
    • Email : test+guest@example.com
    • UID : IDENTIQUE ร  celui crรฉรฉ au checkout

Test 2.3 : Prรฉservation de l'historique

  • Aprรจs inscription, vรฉrifier la redirection vers /order/{orderId}
  • Vรฉrifier que la commande s'affiche correctement
  • Ouvrir Firebase Console โ†’ Realtime Database โ†’ orders/{orderId}

Rรฉsultat attendu dans RTDB :

{
  "userUid": "abc123xyz",  // โ† Mรชme UID !
  "status": "received",
  "payment": {
    "paymentStatus": "paid"
  },
  // ... reste des donnรฉes
}

โœ… Preuve que l'upgrade a fonctionnรฉ : L'UID n'a pas changรฉ, donc la commande reste liรฉe au mรชme utilisateur.


Phase 3 : Cleanup Auto (48h)

Test 3.1 : Dรฉployer la Cloud Function

cd functions
npm run lint
cd ..
npm run firebase:functions

Rรฉsultat attendu :

โœ”  functions[us-central1-cleanupAnonymousUsers]: Successful create operation.

Test 3.2 : Tester le cleanup manuellement (local)

Option A : Modifier le code temporairement

// Dans functions/index.js, ligne 1720
const RETENTION_MS = 10 * 1000; // 10 secondes (au lieu de 48h)

Puis exรฉcuter :

# Lancer les รฉmulateurs
npm run emulators

# Dans un autre terminal, dรฉclencher manuellement la fonction
firebase functions:shell
> cleanupAnonymousUsers()

Rรฉsultat attendu dans les logs :

[PLANIZZA][cleanupAnonymousUsers] Found 1 anonymous users older than 48h
[PLANIZZA] Keeping anonymous user abc123xyz (has orders)
[PLANIZZA][cleanupAnonymousUsers] Completed: 0 deleted, 1 protected, 0 errors

Test 3.3 : Vรฉrifier qu'un anonyme SANS commande est supprimรฉ

  1. Crรฉer un compte anonyme orphelin :

    // Dans la console DevTools du site
    await firebase.auth().signInAnonymously();
    // Noter l'UID (ex: "orphan123")
    console.log(firebase.auth().currentUser.uid);
  2. Ne PAS crรฉer de commande (juste se dรฉconnecter)

  3. Attendre 48h (ou modifier RETENTION_MS pour test)

  4. Exรฉcuter cleanupAnonymousUsers()

Rรฉsultat attendu :

[PLANIZZA] Deleted anonymous user orphan123
[PLANIZZA][cleanupAnonymousUsers] Completed: 1 deleted, 0 protected, 0 errors

๐Ÿ› Troubleshooting

Erreur : "Vous devez รชtre connectรฉ pour payer"

Cause : signInAnonymously() a รฉchouรฉ ou n'a pas รฉtรฉ appelรฉ.

Debug :

// Dans Checkout.jsx, ajouter un console.log
console.log('User UID:', userUid);
console.log('Auth currentUser:', auth.currentUser);

Solution :

  • Vรฉrifier que auth est bien importรฉ depuis lib/firebase.js
  • Vรฉrifier que Firebase est configurรฉ (.env.local rempli)

Erreur : "auth/credential-already-in-use"

Cause : L'email existe dรฉjร  dans un autre compte Firebase.

Solution :

  1. Supprimer le compte existant dans Firebase Console
  2. OU utiliser un autre email de test

Le compte anonyme n'est pas upgradรฉ

Symptรดmes :

  • Aprรจs inscription, l'UID dans RTDB a changรฉ
  • La commande n'est plus visible pour le nouveau compte

Debug :

// Dans Register.jsx, avant linkWithCredential
console.log('Current user before link:', auth.currentUser.uid, auth.currentUser.isAnonymous);

Solution :

  • Vรฉrifier que useAuth() retourne bien user.isAnonymous === true
  • Vรฉrifier que auth.currentUser n'est pas null

La Cloud Function ne se dรฉclenche pas

Debug :

# Vรฉrifier que la fonction est dรฉployรฉe
firebase functions:list

# Vรฉrifier les logs
firebase functions:log --only cleanupAnonymousUsers

Solution :

  • Vรฉrifier que le schedule est correct (every 24 hours)
  • Pour forcer l'exรฉcution : Firebase Console โ†’ Functions โ†’ cleanupAnonymousUsers โ†’ "Test function"

๐Ÿ“Š Mรฉtriques de Succรจs

Aprรจs 1 semaine de prod, vรฉrifier dans Firebase Analytics :

  1. Taux de conversion Guest โ†’ Compte :

    • Combien de guests crรฉent un compte aprรจs paiement ?
    • Cible : > 30%
  2. Erreurs de paiement :

    • Est-ce que les erreurs 401 "Vous devez รชtre connectรฉ" ont disparu ?
    • Cible : 0 erreur
  3. Comptes anonymes actifs :

    • Combien de comptes anonymes ont > 48h et ont des commandes ?
    • Ces comptes doivent รชtre protรฉgรฉs (pas supprimรฉs)
  4. Cleanup efficace :

    • Combien de comptes anonymes sans commandes sont supprimรฉs par jour ?
    • Cible : Rรฉduction progressive du nombre total d'anonymes

๐ŸŽฏ Checklist de Dรฉploiement

Avant de pousser en production :

  • Tests 1.1 ร  1.5 passent en local
  • Tests 2.1 ร  2.3 passent en local
  • Cloud Function dรฉployรฉe et testรฉe
  • Cleanup orphan testรฉ (au moins 1 suppression rรฉussie)
  • Pas de console.log sensibles (tokens, emails) en prod
  • .env.local ne contient que des clรฉs TEST Stripe
  • README.md mis ร  jour avec la nouvelle doc guest checkout

๐Ÿ“š Documentation Technique

Flow Complet

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 1. Guest arrive sur le site (pas de compte)                    โ”‚
โ”‚    โ†’ auth.currentUser === null                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 2. Guest ajoute items au panier (localStorage)                 โ”‚
โ”‚    โ†’ Aucun compte crรฉรฉ ร  ce stade                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 3. Guest clique "Payer sur Stripe"                             โ”‚
โ”‚    โ†’ Checkout.jsx : signInAnonymously(auth)                    โ”‚
โ”‚    โ†’ Firebase crรฉe un compte anonyme (UID: "abc123")           โ”‚
โ”‚    โ†’ auth.currentUser.isAnonymous === true                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 4. createCheckoutSession (Function)                            โ”‚
โ”‚    โ†’ Reรงoit le token Firebase du compte anonyme                โ”‚
โ”‚    โ†’ Crรฉe orders/{orderId} avec userUid: "abc123"              โ”‚
โ”‚    โ†’ Crรฉe session Stripe                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 5. Paiement Stripe + Webhook                                   โ”‚
โ”‚    โ†’ orders/{orderId}/status = "received"                      โ”‚
โ”‚    โ†’ payment.paymentStatus = "paid"                            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 6. CheckoutSuccess affiche "Crรฉer mon compte"                  โ”‚
โ”‚    โ†’ Guest clique โ†’ Navigate to /register                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 7. Register.jsx dรฉtecte user.isAnonymous === true              โ”‚
โ”‚    โ†’ linkWithCredential(currentUser, emailPasswordCredential)  โ”‚
โ”‚    โ†’ UID reste "abc123" (pas de nouvel UID crรฉรฉ)               โ”‚
โ”‚    โ†’ providerData change : [password] au lieu de []            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 8. Historique prรฉservรฉ                                         โ”‚
โ”‚    โ†’ orders/{orderId}/userUid === "abc123" (inchangรฉ)          โ”‚
โ”‚    โ†’ User peut suivre sa commande                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                             โ”‚
                             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 9. Cleanup aprรจs 48h (si pas upgradรฉ)                          โ”‚
โ”‚    โ†’ cleanupAnonymousUsers() scanne les anonymes               โ”‚
โ”‚    โ†’ Si commande existe โ†’ PROTร‰Gร‰                              โ”‚
โ”‚    โ†’ Si pas de commande โ†’ SUPPRIMร‰                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โœ… Validation Finale

Une fois tous les tests passรฉs, exรฉcuter ce dernier test end-to-end :

# 1. Build production
npm run build

# 2. Dรฉployer
npm run firebase:deploy

# 3. Test sur l'URL de production
# https://planizza-ac827.web.app

# 4. Navigation privรฉe โ†’ Guest checkout complet โ†’ Upgrade compte

# 5. Vรฉrifier Firebase Console :
#    - Auth : 1 user avec email + password provider
#    - RTDB : 1 order avec le bon userUid
#    - Functions logs : cleanupAnonymousUsers scheduled

Si tout passe : Fix #1 validรฉ โœ…


Prochaine รฉtape : Fix #2 (Validation prix serveur)