fix(exercice): suppression d'exercice ne casse plus les programmes (ticket #62)

Corrige ExerciseUseCases.delete() qui cascadait à tort vers les
ProgramExercise référents, violant le pattern snapshot (un exercice
supprimé ne doit jamais affecter les programmes déjà composés). Ajoute
le test de régression associé. Met à jour le texte de confirmation
_confirmDelete dans exercise_library_screen.dart, devenu incohérent
avec ce fix (il affirmait à tort que la suppression retirerait
l'exercice des programmes). Trouvé pendant la QA finale du chantier
"Exercice à plusieurs étapes" (#54). flutter analyze propre (mêmes
infos préexistantes), 103/103 tests verts, build APK debug validé.
Dernier ticket du chantier (#56/#58/#59/#60/#61/#62 tous faits).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 20:56:28 +02:00
parent fa3beb05d4
commit b7ba885b07
4 changed files with 181 additions and 115 deletions

View File

@ -226,7 +226,10 @@ void main() {
await _pumpExerciseForm(tester, exerciseRepository);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
await tester.tap(find.text('Ajouter une étape'));
@ -256,7 +259,10 @@ void main() {
await _pumpExerciseForm(tester, exerciseRepository);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
await tester.tap(find.text('Ajouter une étape'));
@ -300,7 +306,10 @@ void main() {
await _pumpExerciseForm(tester, exerciseRepository);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
await tester.tap(find.text('Ajouter une étape'));
@ -334,7 +343,10 @@ void main() {
await _pumpExerciseForm(tester, exerciseRepository);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
await tester.tap(find.text('Ajouter une étape'));
@ -363,7 +375,10 @@ void main() {
await _pumpExerciseForm(tester, exerciseRepository);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
for (var index = 0; index < 8; index++) {
@ -372,7 +387,10 @@ void main() {
}
expect(find.text('Limite atteinte'), findsOneWidget);
expect(find.text('Un exercice peut contenir jusquà 8 étapes.'), findsOneWidget);
expect(
find.text('Un exercice peut contenir jusquà 8 étapes.'),
findsOneWidget,
);
expect(find.text('Ajouter une étape'), findsNothing);
});
@ -389,7 +407,10 @@ void main() {
'30',
);
await tester.tap(
find.widgetWithText(SwitchListTile, 'Rythmer cet exercice avec des étapes'),
find.widgetWithText(
SwitchListTile,
'Rythmer cet exercice avec des étapes',
),
);
await tester.pump();
await tester.tap(find.text('Ajouter une étape'));
@ -512,7 +533,7 @@ void main() {
expect(find.text('Supprimer Squat ?'), findsOneWidget);
expect(
find.textContaining('Le supprimer le retirera de ces programmes.'),
find.textContaining('Les programmes existants restent inchangés.'),
findsOneWidget,
);