diff --git a/.ideai/tickets/83/carnet.md b/.ideai/tickets/83/carnet.md index 94b34ff..ddc41a7 100644 --- a/.ideai/tickets/83/carnet.md +++ b/.ideai/tickets/83/carnet.md @@ -827,3 +827,80 @@ Git doit créer la branche #83. Ensuite DevBackend peut prendre B1 -> B2 -> B3 ; - `HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart format --set-exit-if-changed test/presentation/exercise_library_screen_test.dart` : OK. - `HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart analyze lib/presentation/exercise_library_screen.dart lib/presentation/program_screen.dart lib/presentation/workout_template_screen.dart lib/presentation/library_tags.dart test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart` : exit 0 ; 14 infos restantes, toutes sur dépréciations existantes du périmètre, pas d'erreur. - `flutter test --no-pub test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart` : non exécutable dans ce sandbox, échec avant tests sur cache Flutter en lecture seule (`engine.stamp.tmp.32`, `engine.realm`). + +# QA — Validation fonctionnelle #83 + +## Périmètre relu + +- Cadrage complet UX / Architect / DevBackend / DevFrontend lu via `idea_ticket_read("#83", includeCarnet=true)`. +- Fichiers relus : `lib/presentation/library_tags.dart`, `lib/presentation/exercise_library_screen.dart`, `lib/presentation/program_screen.dart`, `lib/presentation/workout_template_screen.dart`, `test/presentation/exercise_library_screen_test.dart`, `test/presentation/program_screen_test.dart`, `test/presentation/workout_template_screen_test.dart`, `test/application/use_cases_test.dart`, `test/infrastructure/drift_repositories_test.dart`. + +## Cohérence UX / implémentation + +- Tags : composant partagé avec badges max 3 + `+N`, filtres `FilterChip`, bottom sheet `Ajouter un tag`, champ `Nom du tag`, suggestions `Tags existants`, bottom sheet `Voir tous les tags` avec `Rechercher un tag`. +- Règles tags : normalisation via domaine (`trim`, espaces collapsés, minuscules), limite 8, limite 24, doublons rejetés, messages UX mappés (`Saisis un tag.`, `Un tag contient 24 caractères maximum.`, `Ce tag est déjà ajouté.`, `Tu peux ajouter jusqu'à 8 tags.`). +- Filtrage : recherche + tags sur programmes/séances, recherche + mesures + tags sur exercices, logique AND via `filterByRequiredTags`, suggestions triées usage décroissant puis alpha via `tagSuggestionsFor`, section `Tags` masquée si aucune suggestion. +- États vides : messages filtrés exacts présents pour exercices/programmes/séances avec action `Effacer les filtres`; messages bibliothèque vide conservés. +- Duplication programme : menu `Actions` avec `Dupliquer` / `Supprimer`, suppression visible retirée, appel `ProgramUseCases.duplicate`, ouverture directe édition copie, snackbar exacte `Programme dupliqué. Ajuste la copie avant de l'utiliser.`, échec `Duplication impossible pour le moment.`. +- Duplication séance : bouton `Lancer` visible conservé, menu `Actions` avec `Dupliquer` / `Supprimer`, appel `WorkoutTemplateUseCases.duplicate`, ouverture directe édition copie, snackbar exacte `Séance dupliquée. Ajuste la copie avant de la lancer.`, échec `Duplication impossible pour le moment.`. +- Pas de duplication d'exercice de bibliothèque ajoutée. Le seul `Dupliquer` trouvé dans `exercise_library_screen.dart` concerne les étapes internes d'un exercice, hors périmètre #83 et préexistant à la logique de composition. + +Écart relevé non bloquant : les boutons de menu utilisent le tooltip `Actions` plutôt que le symbole textuel `...`; l'emplacement et le contenu du menu respectent le cadrage. + +## Couverture de test relue + +- Tests application : normalisation/validation tags, doublons, limite 8, limite 24, filtre AND, suggestions triées, duplication programme profonde avec conflit de nom, tags copiés, `isExample=false`, nouveaux IDs enfants, indépendance source/copie, duplication séance profonde avec remap overrides, conflit de nom, tags copiés, `isExample=false`, `lastStartedAt=null`. +- Tests infra : colonnes `tags_json` + schemaVersion 19, save/load tags normalisés, payload sync avec tags, payload ancien sans tags -> `[]`, persistance duplication programme et séance avec enfants/remap overrides. +- Tests widget : ajout tag exercice sauvegardé normalisé, filtres tags exercices/programmes/séances avec `Effacer les filtres`, duplication programme/séance ouvrant l'édition de copie et snackbar succès. + +Limite de couverture non bloquante : je n'ai pas vu de test widget dédié à la bottom sheet `Voir tous les tags` (>12 suggestions) ni aux messages d'erreur de tags dans la bottom sheet, mais ces règles sont couvertes au niveau domaine/helper et le composant partagé mappe explicitement les messages. + +## Commandes exécutées par QA + +Commande : + +```sh +HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart analyze lib/presentation/library_tags.dart lib/presentation/exercise_library_screen.dart lib/presentation/program_screen.dart lib/presentation/workout_template_screen.dart test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart +``` + +Sortie réelle pertinente : + +```text +Analyzing library_tags.dart, exercise_library_screen.dart, program_screen.dart, workout_template_screen.dart, exercise_library_screen_test.dart, program_screen_test.dart, workout_template_screen_test.dart, use_cases_test.dart, drift_repositories_test.dart... +14 issues found. +``` + +Verdict commande : exit code 0 ; les 14 issues sont des infos de dépréciation existantes sur le périmètre UI. + +Commande : + +```sh +HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/flutter test --no-pub test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart +``` + +Sortie réelle : + +```text +/opt/flutter/bin/internal/update_engine_version.sh: line 71: /opt/flutter/bin/cache/engine.stamp.tmp.24: Read-only file system +/opt/flutter/bin/internal/update_engine_version.sh: line 78: /opt/flutter/bin/cache/engine.realm: Read-only file system +``` + +Verdict commande : non exécutée, blocage environnement Flutter cache read-only avant lancement des tests. + +Commande : + +```sh +HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart test test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart +``` + +Sortie réelle : + +```text +Running build hooks...Running build hooks...Got socket error trying to find package flutter_launcher_icons at https://pub.dev. +``` + +Verdict commande : non exécutée jusqu'au vert, blocage réseau/build hooks. + +## Verdict QA + +**GO QA pour #83**, sous réserve explicite que cette session n'a pas pu relancer `flutter test` à cause du sandbox. La vérification Main sur suite complète reste la preuve automatisée fonctionnelle : `flutter test --no-pub` -> 214 tests, 1 seul échec préexistant FK media sans lien #83. La lecture QA ne trouve pas d'écart bloquant avec le cadrage UX/Architect.