feat(exercice): icône d'exercice (ticket #38)
Étend le modèle Drift (tables.dart, app_database.dart/.g.dart), les entités/use cases/repositories et les écrans bibliothèque d'exercices et programme pour associer une icône à chaque exercice. flutter analyze propre, 72/72 tests verts, build APK debug validé. Dernier ticket du backlog. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -225,6 +225,72 @@ void main() {
|
||||
expect(updated.imageMediaId, 'media-1');
|
||||
});
|
||||
|
||||
test('Exercise icon can be set to an image from the gallery', () async {
|
||||
final repository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
metadata: _metadata('exercise-1'),
|
||||
name: 'Squat',
|
||||
imageMediaIds: const ['media-1', 'media-2'],
|
||||
hasTimeMeasure: false,
|
||||
hasRepsMeasure: true,
|
||||
hasScoreMeasure: false,
|
||||
defaultTargetReps: 10,
|
||||
);
|
||||
final useCase = _exerciseUseCase(repository);
|
||||
|
||||
final updated = await useCase.setIcon(
|
||||
exerciseId: 'exercise-1',
|
||||
mediaAssetId: 'media-2',
|
||||
);
|
||||
|
||||
expect(updated.iconMediaId, 'media-2');
|
||||
expect(repository.saved.single.iconMediaId, 'media-2');
|
||||
});
|
||||
|
||||
test('Exercise icon rejects images outside the gallery', () async {
|
||||
final repository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
metadata: _metadata('exercise-1'),
|
||||
name: 'Squat',
|
||||
imageMediaIds: const ['media-1'],
|
||||
hasTimeMeasure: false,
|
||||
hasRepsMeasure: true,
|
||||
hasScoreMeasure: false,
|
||||
defaultTargetReps: 10,
|
||||
);
|
||||
final useCase = _exerciseUseCase(repository);
|
||||
|
||||
await expectLater(
|
||||
useCase.setIcon(exerciseId: 'exercise-1', mediaAssetId: 'media-2'),
|
||||
throwsA(isA<DomainException>()),
|
||||
);
|
||||
expect(repository.saved, isEmpty);
|
||||
});
|
||||
|
||||
test('Exercise icon is reset when its image is removed', () async {
|
||||
final repository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
metadata: _metadata('exercise-1'),
|
||||
name: 'Squat',
|
||||
imageMediaIds: const ['media-1', 'media-2'],
|
||||
iconMediaId: 'media-2',
|
||||
hasTimeMeasure: false,
|
||||
hasRepsMeasure: true,
|
||||
hasScoreMeasure: false,
|
||||
defaultTargetReps: 10,
|
||||
);
|
||||
final useCase = _exerciseUseCase(repository);
|
||||
|
||||
final updated = await useCase.removeImage(
|
||||
exerciseId: 'exercise-1',
|
||||
mediaAssetId: 'media-2',
|
||||
);
|
||||
|
||||
expect(updated.imageMediaIds, ['media-1']);
|
||||
expect(updated.iconMediaId, isNull);
|
||||
expect(repository.saved.single.iconMediaId, isNull);
|
||||
});
|
||||
|
||||
test('program exercise snapshot keeps the full image gallery', () async {
|
||||
final exerciseRepository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
|
||||
Reference in New Issue
Block a user