Files
NimPulse/VERIFICATION.md
T
bruno 28860eaed1 feat(web): pages locales aide / statistiques / réglages (serveur HTTP 127.0.0.1)
Nouveau module webserver.nim : mini-serveur HTTP local (port libre a partir de 38943) qui sert des pages HTML generes en Nim - aide (nouvelle entree de menu tray), statistiques et reglages. La page reglages enregistre via POST (config.json) et l'application recharge la configuration au tick suivant. Menu Aide/Statistiques/Reglages ouvrent le navigateur par defaut, avec repli sur les dialogues natifs si le serveur est indisponible. Refactor config/stats (loadConfigFrom/saveConfigTo, loadStatsFrom/saveStatsTo) pour tester sans toucher aux fichiers reels. 8 suites de tests (60 tests), ajout de test_webserver avec integration HTTP reelle.
2026-08-14 21:50:28 -04:00

92 lines
7.2 KiB
Markdown

# Vérification NimPulse
Table de correspondance entre chaque exigence de la spécification, le contrôle
concret effectué, et le résultat observé.
## Fonctionnalités principales
| # | Exigence | Contrôle concret | Résultat observé |
|---|----------|------------------|------------------|
| 1 | Icône system tray (démarre minimisé, pas de fenêtre intrusive) | `tests/test_tray_integration.nim` : `addTrayIcon` → `Shell_NotifyIcon(NIM_ADD)` retourne `true` | **OK** (API réussit, icône ajoutée) |
| 1a | Menu contextuel (Démarrer/Pause/Arrêter, Profils, Paramètres, Statistiques, Quitter) | Construction du menu dans `tray.nim` (`CreatePopupMenu`/`AppendMenu`/`TrackPopupMenu`) | Compile ; affichage non inspecté visuellement |
| 1b | Icône dynamique selon l'état (travail/pause courte/pause longue/pause) | `tests/test_tray_integration.nim` : `phaseIcon` retourne un `HICON` non nul pour les 5 phases | **OK** (5 icônes GDI générées) |
| 1c | Tooltip temps restant | `updateTrayIcon(NIF_TIP)` appelé dans le test d'intégration | **OK** (NIM_MODIFY sans erreur) |
| 2 | Durées configurables + profils + sauvegarde `%APPDATA%\NimPulse` | `tests/test_timer.nim` (17 tests) + `tests/test_config.nim` (round-trip JSON, accents UTF-8, champs manquants) | 17 + 9 tests **OK** |
| 3 | Rappels santé configurables, rotation sans répétition | `tests/test_notifications.nim` (5 tests) | 5 tests **OK** |
| 4 | Notifications natives (toast / `NIF_INFO`) + son optionnel | `tests/test_tray_integration.nim` : `showToast` (NIF_INFO) sans erreur + `playSound("SystemAsterisk")` retourne `true` | **OK** (API ; rendu toast et son audible non observés) |
| 5 | Statistiques (jour/semaine/total, streak, historique, CSV) | `tests/test_stats.nim` (10 tests) | 10 tests **OK** |
| 6 | Démarrage auto (registre `Run`) | `tests/test_config.nim` « setAutostart toggles the Run key and cleans up » | **OK** |
| 6b | Mode « Ne pas déranger » | champ `doNotDisturb` + branche dans `onWorkCompleted` | Compile ; logique vérifiée par relecture |
| 6c | Raccourci global (Ctrl+Alt+P, configurable) | `tests/test_tray_integration.nim` : `RegisterHotKey`/`UnregisterHotKey` retournent non-zéro | **OK** |
## Fonctionnalités ajoutées (v0.2.0)
| # | Exigence | Contrôle concret | Résultat observé |
|---|----------|------------------|------------------|
| 7 | Mono-instance (mutex nommé) | `config.nim` `acquireSingleInstance` ; `tests/test_config.nim` « acquireSingleInstance detects a second lock » | **OK** (première acquisition → false, seconde → true) |
| 8 | Fix du bug `cycleCount` (reset sur `stop`) | `tests/test_timer.nim` « stop resets cycleCount » | **OK** |
| 9 | Sauter / prolonger une pause | `tests/test_timer.nim` (skipBreak, extendBreak, isBreak) | 4 tests **OK** |
| 10 | Internationalisation (fr/en) | `i18n.nim` : deux bundles `Strings`, détection langue système ; `tests/test_config.nim` « English defaults » | **OK** |
| 11 | Panneau de réglages (wNim) | `dialogs.nim` (wDialog/wFrame + contrôles wNim) | Compile + lancement réel de l'app |
| 12 | Objectif journalier | `stats.nim` `goalReached` ; `tests/test_stats.nim` « goalReached is true only when the goal is exactly met » | **OK** |
| 13 | Hotkey et son configurables | champs `hotkeyModifiers`/`hotkeyVk`/`soundName` ; `tests/test_config.nim` round-trip | **OK** |
| 14 | Mode portable | `configDir()` ; `tests/test_config.nim` « configDir returns exe dir in portable mode » | **OK** (mode portable → exe dir, sinon APPDATA) |
| 15 | Mise à jour (comparaison de versions) | `tests/test_updater.nim` (5 tests) | 5 tests **OK** |
| 16 | Fenêtre flottante (toujours au-dessus, texte agrandi) | `tests/test_floating.nim` (show/update/hide une vraie fenêtre Win32) + `floatingWindow` round-trip | **OK** (fenêtre créée/mise à jour/détruite sans erreur) |
## Fonctionnalité ajoutée (pages web locales)
| # | Exigence | Contrôle concret | Résultat observé |
|---|----------|------------------|------------------|
| 17 | Section Aide expliquant le fonctionnement | menu tray « Aide » (`IdHelpPage`) + page `/help` générée (fr/en) | **OK** (`tests/test_webserver.nim` : page rendue, GET HTTP réel) |
| 18 | Statistiques présentées en page web locale | page `/stats` (jour/semaine/streak/total, 7 jours) servie par le serveur local | **OK** (GET réel via `httpclient` dans le test d'intégration) |
| 19 | Réglages en page web locale avec sauvegarde | page `/settings` (formulaire + rappels santé) ; POST `/settings` écrit `config.json` et pose le drapeau de rechargement | **OK** (POST réel : valeurs relues dans le fichier, page mise à jour) |
| 20 | Serveur local 127.0.0.1, port libre à partir de 38943 | `startWebServer()` dans `tests/test_webserver.nim` | **OK** (port 38943, requêtes GET/POST traitées) |
| 21 | Aucune donnée ne quitte l'ordinateur | serveur lié à `127.0.0.1` uniquement | **OK** (relecture de code) |
| 22 | Repli sur les dialogues natifs si serveur indisponible | branche `gServerPort > 0` dans `nimpulse.nim` | Compile ; logique vérifiée par relecture |
## Contraintes techniques
| Contrainte | Contrôle concret | Résultat observé |
|------------|------------------|------------------|
| Nim ≥ 2.0 | Compilé avec Nim 2.2.10 | OK |
| winim | `nimble install winim` (3.9.4) | OK |
| Binaire unique < 5 Mo | `dir src\nimpulse.exe` | ~594 Ko |
| `nim c -d:release --app:gui` | commande exacte exécutée | compile **SuccessX** |
| Modules (`tray/timer/notifications/config/stats/i18n/dialogs/floating/updater`) | `ls src/` | 10 modules présents (dialogs basé sur wNim) |
| Boucle messages + `SetTimer`/`WM_TIMER` | `GetMessage` loop + `SetTimer`/`WM_TIMER` dans `nimpulse.nim` | Compile + timer décrémenté (testé via `tick`) |
## Livrables
| Livrable | Contrôle | Résultat |
|----------|----------|----------|
| Structure + `nimpulse.nimble` | fichier présent, `requires winim` | OK |
| Code source commenté (tous modules) | en-têtes `##` de module + commentaires | OK |
| README + instructions compilation | `README.md` (compile, config, archi, tests, distribution) | OK |
| Config exemple + profils par défaut | `config.example.json` (3 profils, 5 rappels, nouveaux champs) | OK |
| Script de release (portable) | `release.cmd` exécuté | **OK** (zip créé) |
| Script d'installation | `installer/nimpulse.iss` présent | OK (nécessite Inno Setup pour compiler) |
## Limites connues de la vérification
- Les **codes de retour** des API Win32 (ajout/suppression d'icône tray,
génération d'icônes, notification, hotkey, son via `PlaySound`) sont vérifiés
via `tests/test_tray_integration.nim`. Seul le **rendu visuel** (aspect de
l'icône, contenu exact du toast, menu déroulant, boîtes de dialogue) et le
**son audible** restent non observables dans l'environnement automatisé.
- La **mise à jour automatique** n'est pas testée en conditions réelles
(aucun serveur de version configuré) ; la comparaison de versions est testée
unitairement.
- L'avertissement d'édition de liens `multiple non-default manifests` est
bénin (manifeste injecté par `winim`, documenté dans le README).
## Commande de re-vérification
```bash
run_tests.cmd
```
(ou `nim c -d:release --app:gui src/nimpulse.nim` pour le binaire)
60 tests au total, tous verts (8 suites).