feat(bibliothèque): badge Exemple, catégories et états vides bibliothèque (ticket #80)

Ajoute le badge "Exemple" (example_badge.dart) affiché sur les
exercices/programmes/séances-modèles seedés, le filtrage par catégorie
dans la bibliothèque d'exercices et les états vides dédiés. Préserve
isExample lors de l'édition d'un programme ou d'une séance-modèle
existants (ProgramUseCases/WorkoutTemplateUseCases).

Validé GO par Main : dart analyze propre, 173 tests (4 échecs
préexistants sans rapport avec ce lot).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 07:39:26 +02:00
parent 24e266c0e9
commit e05405157a
9 changed files with 357 additions and 16 deletions

View File

@ -5,6 +5,101 @@ import 'package:gametime/domain/domain.dart';
import 'package:gametime/presentation/presentation.dart';
void main() {
testWidgets('la liste affiche le badge exemple des programmes seedés', (
tester,
) async {
final programRepository = _FakeProgramRepository()
..programs.add(
Program(
metadata: _metadata('program-1'),
name: 'Fondations basket - 45 min',
defaultRestSeconds: 45,
isExample: true,
),
);
final exerciseRepository = _FakeExerciseRepository();
await tester.pumpWidget(
MaterialApp(
home: ProgramListScreen(
programUseCases: _programUseCases(
programRepository,
exerciseRepository,
),
exerciseUseCases: _exerciseUseCases(exerciseRepository),
),
),
);
await tester.pump();
await tester.pump();
expect(find.text('Fondations basket - 45 min'), findsOneWidget);
expect(find.text('Exemple'), findsOneWidget);
expect(find.byTooltip('Supprimer le programme'), findsOneWidget);
});
testWidgets('la liste programmes vide conserve le message dédié', (
tester,
) async {
final programRepository = _FakeProgramRepository();
final exerciseRepository = _FakeExerciseRepository();
await tester.pumpWidget(
MaterialApp(
home: ProgramListScreen(
programUseCases: _programUseCases(
programRepository,
exerciseRepository,
),
exerciseUseCases: _exerciseUseCases(exerciseRepository),
),
),
);
await tester.pump();
await tester.pump();
expect(find.text('Aucun programme'), findsOneWidget);
expect(
find.text('Assemble quelques exercices pour préparer une séance.'),
findsOneWidget,
);
});
testWidgets('modifier un programme exemple conserve sa provenance', (
tester,
) async {
final programRepository = _FakeProgramRepository()
..programs.add(
Program(
metadata: _metadata('program-1'),
name: 'Fondations basket - 45 min',
defaultRestSeconds: 45,
isExample: true,
),
);
final exerciseRepository = _FakeExerciseRepository();
await tester.pumpWidget(
MaterialApp(
home: ProgramFormScreen(
programUseCases: _programUseCases(
programRepository,
exerciseRepository,
),
exerciseUseCases: _exerciseUseCases(exerciseRepository),
program: programRepository.programs.single,
),
),
);
await tester.enterText(find.widgetWithText(TextFormField, 'Nom'), 'Edité');
await tester.tap(find.text('Enregistrer'));
await tester.pumpAndSettle();
expect(programRepository.programs.single.name, 'Edité');
expect(programRepository.programs.single.isExample, isTrue);
});
testWidgets(
'ajoute un exercice au programme avec sa configuration par défaut',
(tester) async {