feat(exercice): plan de séance et historique avec résultats d'étapes (ticket #61)
Affiche le plan de séance et l'historique avec les résultats par étape sur workout_execution_screen.dart et history_screen.dart. flutter pub get OK, dart format appliqué (3 fichiers reformatés), analyze propre (mêmes infos préexistantes), 102/102 tests verts, build APK debug validé. Dernier ticket UI du chantier "Exercice à plusieurs étapes" (#54) — il ne reste que la QA finale (#62). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -837,6 +837,72 @@ void main() {
|
||||
expect(find.textContaining('Temps réalisé 00:38.7'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('le plan affiche le résumé de séquence d’une série', (
|
||||
tester,
|
||||
) async {
|
||||
final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12));
|
||||
final repository = _FakeActiveSessionRepository();
|
||||
final session = ActiveWorkoutSession(
|
||||
metadata: _metadata('session-1'),
|
||||
sourceWorkoutTemplateId: 'template-1',
|
||||
status: ActiveWorkoutStatus.running,
|
||||
startedAt: DateTime.utc(2026, 7, 17, 12),
|
||||
lastPersistedAt: DateTime.utc(2026, 7, 17, 12),
|
||||
elapsedActiveMs: 0,
|
||||
currentProgramIndex: 0,
|
||||
currentExerciseIndex: 0,
|
||||
currentSetIndex: 0,
|
||||
resolvedTemplateSnapshotJson: _sessionSnapshot(
|
||||
setsCount: 2,
|
||||
targetReps: 2,
|
||||
exerciseSteps: [
|
||||
_step('step-1', 0, 'Gauche', ExerciseStepType.reps, 4),
|
||||
_step('step-2', 1, 'Droite', ExerciseStepType.reps, 4),
|
||||
],
|
||||
),
|
||||
);
|
||||
repository.session = session;
|
||||
repository.stepResults.add(
|
||||
ActiveExerciseStepResult(
|
||||
metadata: _metadata('step-result-1'),
|
||||
activeWorkoutSessionId: 'session-1',
|
||||
programSnapshotId: 'template-program-1',
|
||||
exerciseSnapshotId: 'exercise-1',
|
||||
programIndex: 0,
|
||||
exerciseIndex: 0,
|
||||
setIndex: 0,
|
||||
passageIndex: 0,
|
||||
stepIndex: 0,
|
||||
stepSnapshotId: 'step-1',
|
||||
stepNameSnapshot: 'Gauche',
|
||||
stepTypeSnapshot: ExerciseStepType.reps,
|
||||
targetValueSnapshot: 4,
|
||||
hasScoreSnapshot: false,
|
||||
status: SetResultStatus.completed,
|
||||
actualReps: 4,
|
||||
),
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: WorkoutExecutionScreen(
|
||||
initialSession: session,
|
||||
activeUseCases: _activeUseCases(repository, clock),
|
||||
stepUseCases: _stepUseCases(repository, clock),
|
||||
stepAudioCuePlayer: _FakeStepAudioCuePlayer(),
|
||||
closeUseCase: _closeUseCase(repository, clock),
|
||||
historyUseCases: _historyUseCases(clock),
|
||||
workoutTemplateUseCases: _workoutTemplateUseCases(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byTooltip('Voir le plan'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Séquence : 1/2 étapes · Passage 1/2'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'modifier une série passée la termine sans changer la position courante',
|
||||
(tester) async {
|
||||
@ -1011,9 +1077,7 @@ void main() {
|
||||
currentSetIndex: 0,
|
||||
resolvedTemplateSnapshotJson: _sessionSnapshot(
|
||||
targetReps: 1,
|
||||
exerciseSteps: [
|
||||
_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 8),
|
||||
],
|
||||
exerciseSteps: [_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 8)],
|
||||
),
|
||||
);
|
||||
repository.session = session;
|
||||
@ -1170,9 +1234,7 @@ void main() {
|
||||
currentSetIndex: 0,
|
||||
resolvedTemplateSnapshotJson: _sessionSnapshot(
|
||||
targetReps: 2,
|
||||
exerciseSteps: [
|
||||
_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 4),
|
||||
],
|
||||
exerciseSteps: [_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 4)],
|
||||
),
|
||||
);
|
||||
repository.session = session;
|
||||
@ -1220,9 +1282,7 @@ void main() {
|
||||
setsCount: 2,
|
||||
restSeconds: 0,
|
||||
targetReps: 2,
|
||||
exerciseSteps: [
|
||||
_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 4),
|
||||
],
|
||||
exerciseSteps: [_step('step-1', 0, 'Pompes', ExerciseStepType.reps, 4)],
|
||||
),
|
||||
);
|
||||
repository.session = session;
|
||||
@ -1667,9 +1727,7 @@ final class _FakeActiveSessionRepository implements ActiveSessionRepository {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveExerciseStepResult(
|
||||
ActiveExerciseStepResult result,
|
||||
) async {
|
||||
Future<void> saveExerciseStepResult(ActiveExerciseStepResult result) async {
|
||||
final index = stepResults.indexWhere(
|
||||
(saved) =>
|
||||
saved.activeWorkoutSessionId == result.activeWorkoutSessionId &&
|
||||
|
||||
Reference in New Issue
Block a user