Guide de Test des Notifications Web Push
Ce guide explique comment tester les notifications web push dans l'application Aperture.
Prérequis
-
Générer les clés VAPID:
npx web-push generate-vapid-keysCela génère deux clés :
Public Key: À utiliser pourVAPID_PUBLIC_KEYPrivate Key: À utiliser pourVAPID_PRIVATE_KEY
-
Configurer les variables d'environnement:
Ajoutez dans votre
.env(backend) :VAPID_PUBLIC_KEY=votre-public-key
VAPID_PRIVATE_KEY=votre-private-key
VAPID_SUBJECT=mailto:contact@aaperture.com -
Vérifier que le service worker est enregistré:
- Le service worker doit être actif dans le navigateur
- Vérifiez dans DevTools → Application → Service Workers
Tests Frontend
1. Vérifier le support des notifications push
Ouvrez la console du navigateur et testez :
// Vérifier le support
if ("serviceWorker" in navigator && "PushManager" in window) {
console.log("✅ Push notifications supported");
} else {
console.log("❌ Push notifications not supported");
}
2. Tester l'abonnement via l'interface
L'application invite automatiquement les utilisateurs à activer les notifications push :
- Ouvrir l'application dans le navigateur (Chrome, Firefox, Edge)
- Se connecter avec un compte utilisateur actif
- Attendre 3 secondes après la connexion
- Une invitation apparaît automatiquement (toast en bas de l'écran) :
- Titre : "Activer les notifications push ?"
- Description : "Recevez des notifications même lorsque l'application est fermée"
- Bouton "Activer" : Cliquez pour s'abonner
- Bouton "Plus tard" : Ignore l'invitation (ne réapparaîtra pas)
- Cliquer sur "Activer" :
- Le navigateur demande la permission
- Autoriser les notifications dans la popup du navigateur
- Message de succès : "Push notifications enabled"
- Vérifier que l'abonnement est créé en base de données
Note : L'invitation n'apparaît qu'une seule fois. Si vous l'avez ignorée, vous pouvez la réactiver en supprimant la clé push-notification-prompt-dismissed du localStorage dans DevTools.
3. Vérifier l'abonnement via l'API
// Dans la console du navigateur (après connexion)
const response = await fetch("/api/push-notifications/subscriptions", {
headers: {
Authorization: `Bearer ${yourJwtToken}`,
},
});
const subscriptions = await response.json();
console.log("Subscriptions:", subscriptions);
4. Tester la réception d'une notification
Option 1 : Via l'interface utilisateur
- Utiliser une fonctionnalité qui déclenche une notification (ex: création de session, action IA)
- La notification devrait apparaître même si l'onglet est fermé
Option 2 : Via l'API directement
// Dans la console du navigateur
const response = await fetch("/api/push-notifications/public-key");
const { publicKey } = await response.json();
console.log("Public Key:", publicKey);
Tests Backend
1. Vérifier que les clés VAPID sont chargées
Au démarrage du backend, vous devriez voir :
✅ VAPID keys configured - push notifications enabled
Si vous voyez :
ℹ️ VAPID keys not configured (optional). Push notifications are disabled...
Les clés ne sont pas configurées et les notifications push sont désactivées.
2. Tester l'envoi d'une notification via le service
Option 1 : Via une action IA (méthode recommandée)
- Ouvrez l'interface de chat avec l'IA
- Demandez à l'IA d'exécuter une action (ex: "Créer une session pour...")
- Une notification push devrait être envoyée automatiquement après l'exécution de l'action
- Vérifiez les logs backend pour voir :
✅ Push notification sent → UserID: xxx | SubscriptionID: yyy
Option 2 : Script de test manuel
Créez un script de test temporaire :
// backend/test-push.ts (script temporaire)
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module.js";
import { PushNotificationsService } from "./notifications/push-notifications.service.js";
async function testPush() {
const app = await NestFactory.createApplicationContext(AppModule);
const pushService = app.get(PushNotificationsService);
// Remplacez par un userId valide (UUID)
const userId = "votre-user-id-uuid";
const result = await pushService.sendNotification(userId, {
title: "Test Notification",
body: "Ceci est un test de notification push",
icon: "/assets/aaperture-logo.png",
data: { url: "/sessions" },
});
console.log(
`✅ Notifications envoyées: ${result.sent}, Échecs: ${result.failed}`
);
await app.close();
}
testPush();
Exécutez :
npx tsx backend/test-push.ts
3. Tester via les endpoints API
Récupérer la clé publique :
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
https://localhost:8080/api/push-notifications/public-key
Lister les abonnements :
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
https://localhost:8080/api/push-notifications/subscriptions
S'abonner (via POST) :
curl -X POST \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"endpoint": "https://fcm.googleapis.com/...",
"keys": {
"auth": "...",
"p256dh": "..."
}
}' \
https://localhost:8080/api/push-notifications/subscribe
Se désabonner :
curl -X DELETE \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"endpoint": "https://fcm.googleapis.com/..."}' \
https://localhost:8080/api/push-notifications/unsubscribe
Tests End-to-End
Scénario complet
-
Configuration initiale :
- ✅ Clés VAPID générées et configurées
- ✅ Service worker enregistré
- ✅ Backend démarre sans erreur
-
Abonnement utilisateur :
- ✅ L'utilisateur clique sur "Activer les notifications"
- ✅ Le navigateur demande la permission
- ✅ L'utilisateur autorise
- ✅ L'abonnement est créé en base de données
- ✅ L'endpoint
/api/push-notifications/subscriptionsretourne l'abonnement
-
Envoi de notification :
- ✅ Une action déclenche une notification (ex: action IA exécutée)
- ✅ La notification apparaît dans le navigateur
- ✅ La notification apparaît même si l'onglet est fermé
- ✅ Cliquer sur la notification ouvre l'application
- ✅ Vérifier les logs backend :
Push notification batch completed → UserID: xxx | Sent: 1 | Failed: 0
-
Désabonnement :
- ✅ L'utilisateur peut se désabonner
- ✅ L'abonnement est supprimé de la base de données
- ✅ Plus de notifications ne sont envoyées
Dépannage
Problème : "VAPID keys not configured"
Solution :
- Vérifiez que
VAPID_PUBLIC_KEYetVAPID_PRIVATE_KEYsont dans votre.env - Redémarrez le backend
- Vérifiez les logs au démarrage
Problème : "Push notifications not supported"
Solution :
- Utilisez un navigateur moderne (Chrome, Firefox, Edge)
- Vérifiez que vous êtes en HTTPS (ou localhost pour le développement)
- Les notifications push ne fonctionnent pas en HTTP (sauf localhost)
Problème : "Permission denied"
Solution :
- Réinitialisez les permissions dans le navigateur :
- Chrome : Settings → Privacy → Site Settings → Notifications
- Firefox : Settings → Privacy → Permissions → Notifications
- Réessayez l'abonnement
Problème : Notification reçue mais ne s'affiche pas
Solution :
- Vérifiez que le service worker est actif
- Vérifiez les logs du service worker dans DevTools → Application → Service Workers
- Vérifiez que
sw-push-handler.jsest bien chargé
Problème : Erreur 410 ou 404 lors de l'envoi
Solution :
- L'abonnement est invalide ou expiré
- Le service supprime automatiquement les abonnements invalides
- L'utilisateur doit se réabonner
Vérification dans la Base de Données
Vérifiez que les abonnements sont bien stockés :
SELECT id, user_id, endpoint, created_at
FROM push_subscriptions
ORDER BY created_at DESC;
Tests Automatisés (Optionnel)
Pour des tests automatisés, vous pouvez créer un test unitaire :
// backend/src/notifications/__tests__/push-notifications.service.spec.ts
import { Test, TestingModule } from "@nestjs/testing";
import { PushNotificationsService } from "../push-notifications.service.js";
describe("PushNotificationsService", () => {
let service: PushNotificationsService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [PushNotificationsService],
}).compile();
service = module.get<PushNotificationsService>(PushNotificationsService);
});
it("should return null public key if VAPID keys not configured", () => {
const publicKey = service.getPublicKey();
expect(publicKey).toBeNull();
});
// Ajoutez d'autres tests selon vos besoins
});
Notes Importantes
- HTTPS requis en production : Les notifications push nécessitent HTTPS (sauf localhost)
- Service Worker requis : Le service worker doit être actif pour recevoir les notifications
- Permissions navigateur : L'utilisateur doit autoriser les notifications
- Abonnements uniques : Chaque navigateur/appareil a un endpoint unique
- Expiration des abonnements : Les abonnements peuvent expirer, il faut gérer la réinscription
Ressources
- Documentation web-push : https://github.com/web-push-libs/web-push
- Service Worker API : https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
- Push API : https://developer.mozilla.org/en-US/docs/Web/API/Push_API