Application Android
# Plan de tests — XamIoT Android
Version app : v1.2
---
## 1. Authentification
### TC-AND-AUTH-01 — Connexion valide
Préconditions : compte existant et activé
Étapes :
1. Ouvrir l'app
2. Saisir email et mot de passe valides
3. Taper "Se connecter"
Résultat attendu : token JWT stocké via TokenManager (SharedPreferences), redirection vers MainActivity
---
### TC-AND-AUTH-02 — Connexion avec mauvais mot de passe
Étapes :
1. Saisir email valide + mot de passe incorrect
2. Taper "Se connecter"
Résultat attendu : message d'erreur affiché, pas de navigation
---
### TC-AND-AUTH-03 — Persistance de session
Étapes :
1. Se connecter
2. Fermer l'app complètement
3. Rouvrir l'app
Résultat attendu : utilisateur toujours connecté, MainActivity affichée directement
---
### TC-AND-AUTH-04 — Déconnexion
Étapes :
1. Menu → Déconnexion
2. Confirmer
Résultat attendu : token supprimé, retour à LoginActivity, données locales effacées
---
### TC-AND-AUTH-05 — Mot de passe oublié
Étapes :
1. Taper "Mot de passe oublié" sur l'écran de login
2. Saisir l'email
3. Valider
Résultat attendu : email de réinitialisation reçu, message de confirmation affiché
---
### TC-AND-AUTH-06 — Création de compte
Étapes :
1. Taper "Créer un compte"
2. Remplir email, mot de passe (+ confirmation), prénom, nom, téléphone avec indicatif pays
3. Valider
Résultat attendu : email de confirmation envoyé, message affiché
---
### TC-AND-AUTH-07 — Permission notifications (Android 13+)
Étapes :
1. Se connecter pour la première fois sur Android 13+
Résultat attendu : dialogue système de permission POST_NOTIFICATIONS affiché
---
### TC-AND-AUTH-08 — Sélecteur de serveur (easter egg)
Étapes :
1. Sur l'écran de login, taper 5 fois sur le logo
2. Changer de serveur
Résultat attendu : serveur persisté en SharedPreferences, appels API sur le bon serveur après redémarrage
---
## 2. Enrôlement BLE
### TC-AND-BLE-01 — Permissions BLE
Préconditions : première utilisation
Étapes :
1. Taper le FAB "+" dans MainActivity
Résultat attendu : dialogue de permission Bluetooth + localisation affiché (BLUETOOTH_SCAN, BLUETOOTH_CONNECT, ACCESS_FINE_LOCATION)
---
### TC-AND-BLE-02 — Scan des capteurs
Préconditions : permissions accordées, Bluetooth activé, capteur SoundSense alimenté
Étapes :
1. Lancer l'enrôlement
Résultat attendu : capteur "SOUND-SENSOR-xxx" apparaît dans le spinner, auto-sélection du premier trouvé
---
### TC-AND-BLE-03 — Enrôlement complet
Étapes :
1. Sélectionner ou laisser l'auto-sélection du capteur
2. Saisir SSID et mot de passe WiFi
3. Valider
4. Attendre le statut WiFi positif
5. Saisir un nom pour le capteur
6. Confirmer
Résultat attendu :
- États BLE : IDLE → SCANNING → CONNECTING → DISCOVERING → READING_INFO → SENDING_WIFI → WAITING_WIFI → SENDING_MQTT → READY_TO_CREATE → SUCCESS
- Credentials MQTT (host, port, user, pass) envoyés via BLE
- Capteur créé sur l'API
- Retour à MainActivity avec le capteur visible
---
### TC-AND-BLE-04 — WiFi incorrect
Étapes :
1. Saisir un SSID/mot de passe WiFi incorrect
Résultat attendu : timeout (15s), état ERROR affiché, option de réessayer disponible (canRetry = true)
---
### TC-AND-BLE-05 — Bluetooth désactivé
Étapes :
1. Désactiver le Bluetooth
2. Tenter d'ajouter un capteur
Résultat attendu : dialogue système pour activer le Bluetooth, ou message explicite
---
### TC-AND-BLE-06 — Déconnexion BLE pendant l'enrôlement
Étapes :
1. Lancer l'enrôlement
2. Éloigner le capteur pendant la phase SENDING_MQTT
Résultat attendu : état ERROR, message affiché, pas de capteur créé en doublon sur l'API
---
### TC-AND-BLE-07 — Auto-sélection désactivée
Étapes :
1. Plusieurs capteurs en range
2. Toucher le spinner pour sélectionner manuellement
Résultat attendu : auto-sélection annulée, utilisateur peut choisir manuellement dans la liste
---
## 3. Données capteur et MQTT
### TC-AND-MQTT-01 — Affichage liste capteurs
Préconditions : au moins un capteur enrôlé et connecté au MQTT
Étapes :
1. Ouvrir MainActivity
Résultat attendu : chaque capteur affiche nom, statut de dernière alerte, temps relatif depuis dernière activité
---
### TC-AND-MQTT-02 — Mise à jour temps relatif
Étapes :
1. Observer la liste pendant quelques secondes
Résultat attendu : les temps relatifs ("il y a 2s", "il y a 1min") se mettent à jour toutes les secondes via le time ticker
---
### TC-AND-MQTT-03 — Rafraîchissement automatique
Étapes :
1. Activer l'auto-refresh via le menu
2. Attendre 10 secondes
Résultat attendu : données rechargées automatiquement, icône menu indique l'état actif
---
### TC-AND-MQTT-04 — Rafraîchissement manuel
Étapes :
1. Menu → Rafraîchir
Résultat attendu : appel API immédiat, liste mise à jour
---
### TC-AND-MQTT-05 — Capteur hors ligne
Étapes :
1. Éteindre un capteur
2. Consulter la liste
Résultat attendu : dernière valeur affichée avec temps relatif exact, pas de crash
---
## 4. Règles d'alerte
### TC-AND-RULES-01 — Création d'une règle depuis un template
Étapes :
1. Ouvrir le détail d'un capteur (DeviceDetailActivity)
2. Taper "Ajouter une règle"
3. Sélectionner un template dans RuleCreateBottomSheet
4. Configurer opérateur, seuil (stepper + saisie), cooldown, label utilisateur
5. Activer et sauvegarder
Résultat attendu : règle créée via POST /esp-rules, visible dans la liste du capteur
---
### TC-AND-RULES-02 — Seuil hors limites
Étapes :
1. Créer une règle
2. Tenter de dépasser field_max via le stepper ou la saisie directe
Résultat attendu : seuil bloqué à field_min / field_max
---
### TC-AND-RULES-03 — Cooldown inférieur au minimum
Étapes :
1. Tenter de saisir un cooldown < cooldown_min_sec
Résultat attendu : cooldown bloqué à cooldown_min_sec
---
### TC-AND-RULES-04 — Activation / désactivation d'une règle
Étapes :
1. Dans la liste des règles, basculer le toggle
Résultat attendu : PATCH /esp-rules/{id} avec enabled mis à jour, UI reflète le changement
---
### TC-AND-RULES-05 — Édition d'une règle existante
Étapes :
1. Taper sur une règle
2. Modifier seuil, cooldown, label
3. Sauvegarder
Résultat attendu : modifications persistées via PATCH sur l'API
---
### TC-AND-RULES-06 — Suppression d'une règle
Étapes :
1. Glisser la règle vers la gauche
2. Confirmer la suppression
Résultat attendu : DELETE /esp-rules/{id}, règle retirée de la liste
---
## 5. Gestion des capteurs
### TC-AND-DEV-01 — Suppression d'un capteur
Étapes :
1. Glisser le capteur vers la gauche dans MainActivity
2. Confirmer la suppression
Résultat attendu : DELETE /esp-devices/{id}, capteur retiré de la liste
---
### TC-AND-DEV-02 — Détail d'un capteur
Étapes :
1. Taper sur un capteur dans la liste
Résultat attendu : DeviceDetailActivity affiche : infos capteur, liste des règles, historique des alertes
---
### TC-AND-DEV-03 — Chargement parallèle des alertes
Préconditions : plusieurs capteurs en liste
Étapes :
1. Ouvrir MainActivity
Résultat attendu : les dernières alertes de chaque capteur sont chargées en parallèle (awaitAll), pas de blocage UI
---
## 6. Notifications push
### TC-AND-NOTIF-01 — Enregistrement token FCM
Étapes :
1. Se connecter à l'app
Résultat attendu : token FCM enregistré via POST /devices (RegisterMobileDeviceRequest)
---
### TC-AND-NOTIF-02 — Réception d'une alerte en foreground
Préconditions : règle active, capteur déclenche le seuil
Étapes :
1. Garder l'app ouverte
Résultat attendu : notification système affichée via NotificationHelper (avec son et vibration), canal créé si Android 8+
---
### TC-AND-NOTIF-03 — Réception d'une alerte en background
Étapes :
1. Mettre l'app en arrière-plan ou fermer l'app
2. Le capteur déclenche une alerte
Résultat attendu : notification reçue dans la barre de statut, tap ouvre l'app
---
### TC-AND-NOTIF-04 — Renouvellement token FCM
Étapes :
1. Simuler un renouvellement de token FCM (onNewToken)
Résultat attendu : nouveau token enregistré localement + envoyé à l'API si utilisateur connecté
---
### TC-AND-NOTIF-05 — Canal de notification (Android 8+)
Étapes :
1. Vérifier dans Paramètres système → Notifications → XamIoT
Résultat attendu : canal d'alerte visible avec son et vibration configurés
---
## 7. Paramètres et configuration
### TC-AND-CFG-01 — Suppression de compte
Étapes :
1. Menu → Supprimer le compte
2. Saisir l'email dans le dialogue de confirmation
3. Confirmer
Résultat attendu : DELETE /me avec corps {"confirm": "DELETE"}, bouton désactivé pendant l'opération, retour à LoginActivity
---
### TC-AND-CFG-02 — Mémorisation credentials WiFi
Étapes :
1. Enrôler un capteur avec un SSID/mot de passe
2. Lancer un second enrôlement
Résultat attendu : SSID et mot de passe pré-remplis via WifiCredentialsStore
---
### TC-AND-CFG-03 — Auto-refresh s'arrête en background
Étapes :
1. Activer l'auto-refresh
2. Mettre l'app en arrière-plan
3. Revenir sur l'app
Résultat attendu : auto-refresh stoppé en background (onStop), redémarré en foreground (onStart)
---
## 8. Tests de robustesse
### TC-AND-ROB-01 — Perte réseau pendant l'utilisation
Étapes :
1. Passer en mode avion pendant que l'app est ouverte
Résultat attendu : erreur réseau affichée via ApiError.toUserMessage(), pas de crash
---
### TC-AND-ROB-02 — Token expiré
Étapes :
1. Laisser le token expirer
2. Effectuer une action API
Résultat attendu : code HTTP 401 détecté, redirection vers LoginActivity
---
### TC-AND-ROB-03 — Rotation écran pendant l'enrôlement
Étapes :
1. Lancer l'enrôlement BLE
2. Faire pivoter le téléphone
Résultat attendu : état BLE préservé via ViewModel (StateFlow), pas de réinitialisation de l'enrôlement
---
### TC-AND-ROB-04 — Permission BLE refusée
Étapes :
1. Refuser les permissions Bluetooth lors du premier lancement
2. Tenter d'ajouter un capteur
Résultat attendu : message explicite, invitation à aller dans les paramètres système
---
### TC-AND-ROB-05 — Chargement simultané (device meta + rules + alerts)
Étapes :
1. Ouvrir DeviceDetailActivity sur un capteur avec plusieurs règles et alertes
Résultat attendu : chargement sans blocage UI, ViewModel gère les états Loading/Success/Error correctement
---


