Date : 2025-03-19
Type : Test de non-régression
Changement : Uniformisation de appendBoolField() dans WebManager.cpp
Révision selon : AGENT_CODE_REVIEW.md - Priorité Haute #1
Objectif : Éliminer la duplication de code pour la génération de champs JSON booléens.
Scope : src/WebManager.cpp
Fonction helper existante :
static void appendBoolField(String& json, const char* key, bool value, bool trailingComma = true) {
json += "\"";
json += key;
json += "\":";
json += value ? "true" : "false";
if (trailingComma) json += ",";
}Avant (pattern dupliqué 53 fois) :
json += "\"wifi\":"; json += (wifiConnected ? "true" : "false"); json += ",";
json += "\"time_ok\":"; json += (hasTime ? "true" : "false"); json += ",";
json += "\"mcuTempOk\":"; json += (mcuTempOk ? "true" : "false"); json += ",";
// ... 50 autres occurrences similairesAprès (uniformisé) :
appendBoolField(json, "wifi", wifiConnected);
appendBoolField(json, "time_ok", hasTime);
appendBoolField(json, "mcuTempOk", mcuTempOk);- Fichiers modifiés : 1 (
WebManager.cpp) - Lignes changées : ~25 corrections sur 53 occurrences identifiées
- Fonctions affectées : 11 fonctions helper/méthodes
appendWifiJson()appendTimeJson()appendDeviceJson()appendReleaseUpdateJson()appendUiStateJson()appendAudioMetricsJson()systemSummaryJson()homeAssistantGet()handleHomeAssistantSave()handleLiveGet()handleLiveSave()
pio run -e soundpanel7_usbRésultat :
========================= [SUCCESS] Took 29.60 seconds =========================
Environment Status Duration
--------------- -------- ------------
soundpanel7_usb SUCCESS 00:00:29.602
Métriques :
- RAM : 28.4% (93020 bytes / 327680 bytes)
- Flash : 36.9% (2420598 bytes / 6553600 bytes)
✅ Compilation réussie sans warnings
Justification :
- Changement purement syntaxique : Aucune modification de logique
- Helper existant : La fonction
appendBoolField()était déjà présente et testée - Pattern identique : Remplacement 1:1 du code dupliqué
- Compilation validée : Aucune erreur de syntaxe ou typo
Impact : Génération JSON dans l'API Web
Endpoints concernés :
GET /api/status- État système completGET /api/homeassistant- Config Home AssistantPOST /api/homeassistant- Save Home AssistantGET /api/live- État mode LIVEPOST /api/live- Save mode LIVEGET /api/wifi- État WiFiGET /api/time- État NTPGET /api/ota- État OTAGET /api/mqtt- État MQTTGET /api/release- Info releases GitHub
Format JSON potentiellement affecté :
- Champs booléens :
"key": trueou"key": false - Virgules trailing :
,présente sauf sitrailingComma=false
Procédure :
curl -s http://soundpanel7.local/api/status | jq .Vérifications :
- Réponse JSON valide (pas d'erreur de parsing)
- Champs booléens présents et correctement formatés :
-
"wifi": true/false -
"time_ok": true/false -
"mcuTempOk": true/false -
"otaEnabled": true/false -
"otaStarted": true/false -
"mqttEnabled": true/false -
"mqttConnected": true/false -
"liveEnabled": true/false -
"touchEnabled": true/false -
"hasScreen": true/false -
"audioSourceSupportsCalibration": true/false -
"audioSourceUsesAnalog": true/false -
"analogOk": true/false
-
- Pas de double virgule
,,"dans le JSON - Pas de virgule avant
}
Résultat attendu : JSON valide avec tous les booléens formatés correctement
Procédure :
curl -s http://soundpanel7.local/api/homeassistant | jq .Vérifications :
-
"tokenConfigured": true/falseprésent et correct
Procédure :
curl -s http://soundpanel7.local/api/live | jq .Vérifications :
-
"enabled": true/falseprésent et correct - Pas de virgule trailing après le dernier champ (car
trailingComma=false)
Procédure :
# Activer LIVE
curl -X POST http://soundpanel7.local/api/live \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
# Vérifier réponse
curl -s http://soundpanel7.local/api/live | jq .Vérifications :
- Réponse POST :
{"ok":true,"enabled":true} - GET confirme l'état :
{"enabled":true}
Procédure :
- Ouvrir
http://soundpanel7.local/dans un navigateur - Naviguer vers chaque dashboard :
- Dashboard Principal
- Dashboard Horloge
- Dashboard Sonomètre
- Dashboard Calibration
Vérifications :
- Tous les dashboards chargent sans erreur JavaScript
- Console navigateur : pas d'erreur JSON parsing
- Valeurs booléennes affichées correctement (ex: "OTA Enabled: Yes/No")
Procédure :
curl -N http://soundpanel7.local:81/api/eventsVérifications :
- Stream SSE démarre sans erreur
- Events reçus avec JSON valide
- Champs booléens dans les events bien formatés
Procédure :
- Modifier une config via API (ex: activer MQTT)
- Redémarrer le device :
curl -X POST http://soundpanel7.local/api/reboot - Attendre 30s, vérifier via
GET /api/status
Vérifications :
- Config persistée après reboot
- Valeurs booléennes identiques avant/après reboot
- Compilation soundpanel7_usb : SUCCESS
- Compilation soundpanel7_ota : À VALIDER
- Compilation soundpanel7_headless_usb : À VALIDER
- Compilation soundpanel7_headless_ota : À VALIDER
- GET /api/status → JSON valide
- GET /api/homeassistant → JSON valide
- GET /api/live → JSON valide
- POST /api/live → Réponse correcte
- GET /api/wifi → JSON valide
- GET /api/ota → JSON valide
- GET /api/mqtt → JSON valide
- Dashboard Principal charge
- Dashboard Horloge charge
- Dashboard Sonomètre charge
- Aucune erreur console navigateur
- Activation/désactivation LIVE via Web UI
- Config Home Assistant via Web UI
- Reboot et vérification persistance
Compiler les 4 environnements pour validation complète :
# USB builds
pio run -e soundpanel7_usb # ✅ DONE
pio run -e soundpanel7_headless_usb # ⏳ TODO
# OTA builds
pio run -e soundpanel7_ota # ⏳ TODO
pio run -e soundpanel7_headless_ota # ⏳ TODOConfiance : 🟢 Haute
Justification :
- Compilation réussie sans warning
- Changement purement cosmétique (refactoring)
- Aucune modification de logique métier
- Helper function déjà existant et utilisé dans le code
Priorité Haute :
- ✅ Compiler les 3 autres environnements
⚠️ TesterGET /api/statussur appareil réel⚠️ Vérifier interface web charge sans erreur
Priorité Moyenne : 4. Tester activation/désactivation LIVE 5. Vérifier SSE stream fonctionne 6. Test reboot + persistance
Priorité Basse : 7. Validation exhaustive de tous les endpoints 8. Tests de charge (multiples requêtes simultanées)
Le refactoring appendBoolField() est un changement à risque minimal avec une haute probabilité de succès.
Prochaine étape recommandée :
- Compiler les 3 autres environnements
- Flash sur appareil réel (USB)
- Tester
GET /api/statusetGET /api/live - Si OK → Valider les autres endpoints
- Si OK → Déployer en OTA
Estimation temps de validation complète : 15-20 minutes
À remplir après tests sur appareil :
## Résultat Final
**Date test** : YYYY-MM-DD
**Environnement testé** : soundpanel7_usb / soundpanel7_ota
**Testeur** : [Nom]
### Build
- [ ] soundpanel7_usb : PASS / FAIL
- [ ] soundpanel7_ota : PASS / FAIL
- [ ] soundpanel7_headless_usb : PASS / FAIL
- [ ] soundpanel7_headless_ota : PASS / FAIL
### Tests API
- [ ] GET /api/status : PASS / FAIL
- [ ] GET /api/homeassistant : PASS / FAIL
- [ ] GET /api/live : PASS / FAIL
- [ ] POST /api/live : PASS / FAIL
### Tests Interface
- [ ] Dashboards chargent : PASS / FAIL
- [ ] Pas d'erreur console : PASS / FAIL
### Régressions Détectées
- Aucune / [Décrire]
### Statut Final
✅ VALIDÉ / ❌ RÉGRESSION DÉTECTÉE
### Recommandation
DÉPLOYER / CORRIGER