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:
@ -75,6 +75,33 @@ void main() {
|
||||
expect(find.textContaining('Score 38.7'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('le détail affiche les résultats d’étapes par passage', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: HistoryDetailScreen(
|
||||
history: _history(id: 'history-1', withStepResults: true),
|
||||
historyUseCases: _historyUseCases(_FakeWorkoutHistoryRepository()),
|
||||
workoutTemplateUseCases: _workoutTemplateUseCases(),
|
||||
activeUseCases: _activeUseCases(),
|
||||
closeUseCase: _closeUseCase(),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
expect(find.text('Étapes réalisées'), findsOneWidget);
|
||||
expect(find.text('Passage 1'), findsOneWidget);
|
||||
expect(
|
||||
find.text(
|
||||
'Étape 1 · Dribble gauche · Temps 00:10 · Réussites : 4 paniers',
|
||||
),
|
||||
findsOneWidget,
|
||||
);
|
||||
expect(find.text('Étape 2 · Dribble droite'), findsOneWidget);
|
||||
expect(find.text('Passée'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('la suppression demande une confirmation', (tester) async {
|
||||
final repository = _FakeWorkoutHistoryRepository();
|
||||
|
||||
@ -114,6 +141,7 @@ WorkoutHistory _history({
|
||||
required String id,
|
||||
DateTime? startedAt,
|
||||
bool stopwatchScore = false,
|
||||
bool withStepResults = false,
|
||||
}) {
|
||||
final start = startedAt ?? DateTime.utc(2026, 7, 17, 10);
|
||||
return WorkoutHistory(
|
||||
@ -129,6 +157,7 @@ WorkoutHistory _history({
|
||||
'sessionId': 'session-1',
|
||||
'resolvedTemplateSnapshotJson': _resolvedSnapshot(
|
||||
stopwatchScore: stopwatchScore,
|
||||
withSteps: withStepResults,
|
||||
),
|
||||
'results': [
|
||||
{
|
||||
@ -150,10 +179,57 @@ WorkoutHistory _history({
|
||||
},
|
||||
],
|
||||
}),
|
||||
stepResults: withStepResults
|
||||
? [
|
||||
WorkoutHistoryStepResult(
|
||||
metadata: _metadata('step-result-1'),
|
||||
workoutHistoryId: id,
|
||||
programSnapshotId: 'program-snapshot-1',
|
||||
exerciseSnapshotId: 'exercise-snapshot-1',
|
||||
programIndex: 0,
|
||||
exerciseIndex: 0,
|
||||
setIndex: 0,
|
||||
passageIndex: 0,
|
||||
stepIndex: 0,
|
||||
stepSnapshotId: 'step-1',
|
||||
stepNameSnapshot: 'Dribble gauche',
|
||||
stepTypeSnapshot: ExerciseStepType.time,
|
||||
targetValueSnapshot: 10,
|
||||
hasScoreSnapshot: true,
|
||||
scoreInputModeSnapshot: ScoreInputMode.manual,
|
||||
scoreLabelSnapshot: 'Réussites',
|
||||
scoreUnitSnapshot: 'paniers',
|
||||
targetScoreSnapshot: 3,
|
||||
status: SetResultStatus.completed,
|
||||
actualTimeMs: 10000,
|
||||
actualScore: 4,
|
||||
),
|
||||
WorkoutHistoryStepResult(
|
||||
metadata: _metadata('step-result-2'),
|
||||
workoutHistoryId: id,
|
||||
programSnapshotId: 'program-snapshot-1',
|
||||
exerciseSnapshotId: 'exercise-snapshot-1',
|
||||
programIndex: 0,
|
||||
exerciseIndex: 0,
|
||||
setIndex: 0,
|
||||
passageIndex: 0,
|
||||
stepIndex: 1,
|
||||
stepSnapshotId: 'step-2',
|
||||
stepNameSnapshot: 'Dribble droite',
|
||||
stepTypeSnapshot: ExerciseStepType.reps,
|
||||
targetValueSnapshot: 8,
|
||||
hasScoreSnapshot: false,
|
||||
status: SetResultStatus.skipped,
|
||||
),
|
||||
]
|
||||
: const [],
|
||||
);
|
||||
}
|
||||
|
||||
String _resolvedSnapshot({bool stopwatchScore = false}) {
|
||||
String _resolvedSnapshot({
|
||||
bool stopwatchScore = false,
|
||||
bool withSteps = false,
|
||||
}) {
|
||||
return jsonEncode({
|
||||
'name': 'Séance jambes',
|
||||
'programs': [
|
||||
@ -179,6 +255,29 @@ String _resolvedSnapshot({bool stopwatchScore = false}) {
|
||||
'scoreLabelSnapshot': 'Charge',
|
||||
if (!stopwatchScore) 'scoreUnitSnapshot': 'kg',
|
||||
'restSecondsOverride': 0,
|
||||
if (withSteps)
|
||||
'exerciseStepsSnapshot': [
|
||||
{
|
||||
'id': 'step-1',
|
||||
'position': 0,
|
||||
'name': 'Dribble gauche',
|
||||
'type': ExerciseStepType.time.name,
|
||||
'defaultTargetValue': 10,
|
||||
'hasScore': true,
|
||||
'scoreInputMode': ScoreInputMode.manual.name,
|
||||
'scoreLabel': 'Réussites',
|
||||
'scoreUnit': 'paniers',
|
||||
'defaultTargetScore': 3,
|
||||
},
|
||||
{
|
||||
'id': 'step-2',
|
||||
'position': 1,
|
||||
'name': 'Dribble droite',
|
||||
'type': ExerciseStepType.reps.name,
|
||||
'defaultTargetValue': 8,
|
||||
'hasScore': false,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user