fix(execution): série qu'on ne pouvait pas terminer (ticket #29)

Corrige le blocage empêchant de terminer une série sur
workout_execution_screen.dart. flutter analyze propre, 42/42 tests
verts, build APK debug validé. Ticket laissé en QA : validation
manuelle sur APK par l'utilisateur avant clôture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 09:12:44 +02:00
parent 116017bda6
commit 1e402a55c6
2 changed files with 151 additions and 42 deletions

View File

@ -218,6 +218,74 @@ void main() {
expect(repository.results.single.actualTimeMs, greaterThan(0));
});
testWidgets(
'terminer la série 2 avec temps répétitions et score manuel avance',
(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: 1,
resolvedTemplateSnapshotJson: _sessionSnapshot(
setsCount: 3,
restSeconds: 0,
targetTimeSeconds: 30,
targetReps: 5,
targetScore: 10,
scoreUnit: 'points',
),
);
repository.session = session;
await tester.pumpWidget(
MaterialApp(
home: WorkoutExecutionScreen(
initialSession: session,
activeUseCases: _activeUseCases(repository, clock),
closeUseCase: _closeUseCase(repository, clock),
historyUseCases: _historyUseCases(clock),
workoutTemplateUseCases: _workoutTemplateUseCases(),
),
),
);
expect(
find.text('Programme 1/1 · Exercice 1/1 · Série 2/3'),
findsOneWidget,
);
expect(find.text('30 s'), findsOneWidget);
for (var i = 0; i < 3; i++) {
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
}
await tester.enterText(
find.widgetWithText(TextField, 'Score (points)'),
'5',
);
await tester.ensureVisible(find.text('Terminer la série'));
await tester.pumpAndSettle();
await tester.tap(find.text('Terminer la série'));
await tester.pumpAndSettle();
expect(repository.results.single.setIndex, 1);
expect(repository.results.single.actualReps, 3);
expect(repository.results.single.actualScore, 5);
expect(repository.session?.currentSetIndex, 2);
expect(
find.text('Programme 1/1 · Exercice 1/1 · Série 3/3'),
findsOneWidget,
);
},
);
testWidgets('la flèche de retour met la séance active en pause', (
tester,
) async {
@ -483,7 +551,15 @@ WorkoutTemplateUseCases _workoutTemplateUseCases() {
);
}
String _sessionSnapshot({int setsCount = 3, int restSeconds = 0}) {
String _sessionSnapshot({
int setsCount = 3,
int restSeconds = 0,
int targetTimeSeconds = 45,
int targetReps = 10,
double targetScore = 80,
String scoreUnit = 'kg',
ScoreInputMode scoreInputMode = ScoreInputMode.manual,
}) {
return jsonEncode({
'name': 'Séance jambes',
'programs': [
@ -499,10 +575,12 @@ String _sessionSnapshot({int setsCount = 3, int restSeconds = 0}) {
'timeEnabled': true,
'repsEnabled': true,
'scoreEnabled': true,
'targetTimeSeconds': 45,
'targetReps': 10,
'targetScore': 80,
'scoreUnitSnapshot': 'kg',
'targetTimeSeconds': targetTimeSeconds,
'targetReps': targetReps,
'targetScore': targetScore,
'scoreInputModeSnapshot': scoreInputMode.name,
'scoreLabelSnapshot': 'Score',
'scoreUnitSnapshot': scoreUnit,
'restSecondsOverride': restSeconds,
},
],