feat(ui): affichage du chrono de score dans le plan et l'historique (ticket #28)
Affiche le chrono du score chronométré sur workout_execution_screen.dart (plan de séance) et history_screen.dart (historique). flutter analyze propre, 77/77 tests verts, build APK debug validé. Dernier ticket du backlog — clôture aussi le ticket parent #18 (score chronométré). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -50,6 +50,31 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('le détail affiche le score chrono comme temps réalisé', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: HistoryDetailScreen(
|
||||
history: _history(id: 'history-1', stopwatchScore: true),
|
||||
historyUseCases: _historyUseCases(_FakeWorkoutHistoryRepository()),
|
||||
workoutTemplateUseCases: _workoutTemplateUseCases(),
|
||||
activeUseCases: _activeUseCases(),
|
||||
closeUseCase: _closeUseCase(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
expect(
|
||||
find.text(
|
||||
'Temps 00:45 · 10 répétitions · '
|
||||
'Temps réalisé : 00:38.7 / objectif 00:45',
|
||||
),
|
||||
findsOneWidget,
|
||||
);
|
||||
expect(find.textContaining('Score 38.7'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('la suppression demande une confirmation', (tester) async {
|
||||
final repository = _FakeWorkoutHistoryRepository();
|
||||
|
||||
@ -85,7 +110,11 @@ void main() {
|
||||
});
|
||||
}
|
||||
|
||||
WorkoutHistory _history({required String id, DateTime? startedAt}) {
|
||||
WorkoutHistory _history({
|
||||
required String id,
|
||||
DateTime? startedAt,
|
||||
bool stopwatchScore = false,
|
||||
}) {
|
||||
final start = startedAt ?? DateTime.utc(2026, 7, 17, 10);
|
||||
return WorkoutHistory(
|
||||
metadata: _metadata(id),
|
||||
@ -98,7 +127,9 @@ WorkoutHistory _history({required String id, DateTime? startedAt}) {
|
||||
completed: true,
|
||||
historySnapshotJson: jsonEncode({
|
||||
'sessionId': 'session-1',
|
||||
'resolvedTemplateSnapshotJson': _resolvedSnapshot(),
|
||||
'resolvedTemplateSnapshotJson': _resolvedSnapshot(
|
||||
stopwatchScore: stopwatchScore,
|
||||
),
|
||||
'results': [
|
||||
{
|
||||
'programSnapshotId': 'program-snapshot-1',
|
||||
@ -108,16 +139,21 @@ WorkoutHistory _history({required String id, DateTime? startedAt}) {
|
||||
'setIndex': 0,
|
||||
'actualTimeMs': 45000,
|
||||
'actualReps': 10,
|
||||
'actualScore': 80,
|
||||
if (stopwatchScore) 'actualScoreTimeMs': 38700,
|
||||
if (!stopwatchScore) 'actualScore': 80,
|
||||
'scoreLabelSnapshot': 'Charge',
|
||||
'scoreUnitSnapshot': 'kg',
|
||||
'scoreInputModeSnapshot': stopwatchScore
|
||||
? ScoreInputMode.stopwatch.name
|
||||
: ScoreInputMode.manual.name,
|
||||
if (!stopwatchScore) 'scoreUnitSnapshot': 'kg',
|
||||
if (stopwatchScore) 'targetScoreTimeMsSnapshot': 45000,
|
||||
},
|
||||
],
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
String _resolvedSnapshot() {
|
||||
String _resolvedSnapshot({bool stopwatchScore = false}) {
|
||||
return jsonEncode({
|
||||
'name': 'Séance jambes',
|
||||
'programs': [
|
||||
@ -135,9 +171,13 @@ String _resolvedSnapshot() {
|
||||
'scoreEnabled': true,
|
||||
'targetTimeSeconds': 45,
|
||||
'targetReps': 10,
|
||||
'targetScore': 80,
|
||||
if (stopwatchScore) 'targetScoreTimeMs': 45000,
|
||||
if (!stopwatchScore) 'targetScore': 80,
|
||||
'scoreInputModeSnapshot': stopwatchScore
|
||||
? ScoreInputMode.stopwatch.name
|
||||
: ScoreInputMode.manual.name,
|
||||
'scoreLabelSnapshot': 'Charge',
|
||||
'scoreUnitSnapshot': 'kg',
|
||||
if (!stopwatchScore) 'scoreUnitSnapshot': 'kg',
|
||||
'restSecondsOverride': 0,
|
||||
},
|
||||
],
|
||||
|
||||
@ -673,6 +673,62 @@ void main() {
|
||||
expect(find.text('Plan de séance'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('le plan affiche le score chrono formaté avec objectif', (
|
||||
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: 2,
|
||||
restSeconds: 0,
|
||||
scoreInputMode: ScoreInputMode.stopwatch,
|
||||
targetScoreTimeMs: 45000,
|
||||
),
|
||||
);
|
||||
repository.session = session;
|
||||
repository.results.add(
|
||||
ActiveSetResult(
|
||||
metadata: _metadata('result-1'),
|
||||
activeWorkoutSessionId: 'session-1',
|
||||
programSnapshotId: 'template-program-1',
|
||||
exerciseSnapshotId: 'exercise-1',
|
||||
programIndex: 0,
|
||||
exerciseIndex: 0,
|
||||
setIndex: 0,
|
||||
actualScoreTimeMs: 38700,
|
||||
scoreInputModeSnapshot: ScoreInputMode.stopwatch,
|
||||
),
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: WorkoutExecutionScreen(
|
||||
initialSession: session,
|
||||
activeUseCases: _activeUseCases(repository, clock),
|
||||
closeUseCase: _closeUseCase(repository, clock),
|
||||
historyUseCases: _historyUseCases(clock),
|
||||
workoutTemplateUseCases: _workoutTemplateUseCases(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await tester.tap(find.byTooltip('Voir le plan'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Score chrono 00:38.7 / objectif 00:45'), findsOneWidget);
|
||||
expect(find.textContaining('Temps réalisé 00:38.7'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets(
|
||||
'modifier une série passée la termine sans changer la position courante',
|
||||
(tester) async {
|
||||
@ -836,6 +892,7 @@ String _sessionSnapshot({
|
||||
int targetTimeSeconds = 45,
|
||||
int targetReps = 10,
|
||||
double targetScore = 80,
|
||||
int? targetScoreTimeMs,
|
||||
String scoreUnit = 'kg',
|
||||
ScoreInputMode scoreInputMode = ScoreInputMode.manual,
|
||||
List<String> imageMediaIds = const [],
|
||||
@ -859,6 +916,7 @@ String _sessionSnapshot({
|
||||
'targetTimeSeconds': targetTimeSeconds,
|
||||
'targetReps': targetReps,
|
||||
'targetScore': targetScore,
|
||||
'targetScoreTimeMs': targetScoreTimeMs,
|
||||
'scoreInputModeSnapshot': scoreInputMode.name,
|
||||
'scoreLabelSnapshot': 'Score',
|
||||
'scoreUnitSnapshot': scoreUnit,
|
||||
|
||||
Reference in New Issue
Block a user