Skip to content

Commit c6ab5cf

Browse files
author
Branislav Nohaj
committed
Add exercise contribution tests with proper mocks
1 parent 45ab81a commit c6ab5cf

File tree

2 files changed

+46
-46
lines changed

2 files changed

+46
-46
lines changed

test/exercises/contribute_exercise_test.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ void main() {
9393
/// Note: All 6 steps are rendered immediately by the Stepper widget,
9494
/// so all their required properties must be mocked.
9595
void setupAddExerciseProviderDefaults() {
96+
when(mockAddExerciseProvider.author).thenReturn('');
9697
when(mockAddExerciseProvider.equipment).thenReturn([]);
9798
when(mockAddExerciseProvider.primaryMuscles).thenReturn([]);
9899
when(mockAddExerciseProvider.secondaryMuscles).thenReturn([]);
@@ -135,8 +136,8 @@ void main() {
135136

136137
group('Form Field Validation Tests', () {
137138
testWidgets('Exercise name field is required and displays validation error', (
138-
WidgetTester tester,
139-
) async {
139+
WidgetTester tester,
140+
) async {
140141
// Setup: Create verified user with required data
141142
setupFullVerifiedUserContext();
142143

@@ -186,8 +187,8 @@ void main() {
186187
});
187188

188189
testWidgets('Alternative names field accepts multiple lines of text', (
189-
WidgetTester tester,
190-
) async {
190+
WidgetTester tester,
191+
) async {
191192
// Setup: Create verified user
192193
setupFullVerifiedUserContext();
193194

@@ -405,7 +406,7 @@ void main() {
405406
testWidgets('Successful submission shows success dialog', (WidgetTester tester) async {
406407
// Setup: Create verified user and mock successful submission
407408
setupFullVerifiedUserContext();
408-
when(mockAddExerciseProvider.addExercise()).thenAnswer((_) async => 1);
409+
when(mockAddExerciseProvider.postExerciseToServer()).thenAnswer((_) async => 1);
409410
when(mockAddExerciseProvider.addImages(any)).thenAnswer((_) async => {});
410411
when(mockExerciseProvider.fetchAndSetExercise(any)).thenAnswer((_) async => testBenchPress);
411412
when(mockAddExerciseProvider.clear()).thenReturn(null);
@@ -425,7 +426,7 @@ void main() {
425426
final httpException = WgerHttpException({
426427
'name': ['This field is required'],
427428
});
428-
when(mockAddExerciseProvider.addExercise()).thenThrow(httpException);
429+
when(mockAddExerciseProvider.postExerciseToServer()).thenThrow(httpException);
429430

430431
// Build the exercise contribution screen
431432
await tester.pumpWidget(createExerciseScreen());
@@ -437,11 +438,11 @@ void main() {
437438
});
438439

439440
testWidgets('Provider clear method is called after successful submission', (
440-
WidgetTester tester,
441-
) async {
441+
WidgetTester tester,
442+
) async {
442443
// Setup: Mock successful submission flow
443444
setupFullVerifiedUserContext();
444-
when(mockAddExerciseProvider.addExercise()).thenAnswer((_) async => 1);
445+
when(mockAddExerciseProvider.postExerciseToServer()).thenAnswer((_) async => 1);
445446
when(mockAddExerciseProvider.addImages(any)).thenAnswer((_) async => {});
446447
when(mockExerciseProvider.fetchAndSetExercise(any)).thenAnswer((_) async => testBenchPress);
447448
when(mockAddExerciseProvider.clear()).thenReturn(null);
@@ -517,4 +518,4 @@ void main() {
517518
expect(profileButton, findsOneWidget);
518519
});
519520
});
520-
}
521+
}

test/exercises/contribute_exercise_test.mocks.dart

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44

55
// ignore_for_file: no_leading_underscores_for_library_prefixes
66
import 'dart:async' as _i15;
7-
import 'dart:io' as _i12;
87
import 'dart:ui' as _i16;
98

109
import 'package:flutter/material.dart' as _i18;
1110
import 'package:mockito/mockito.dart' as _i1;
12-
import 'package:mockito/src/dummies.dart' as _i14;
11+
import 'package:mockito/src/dummies.dart' as _i13;
1312
import 'package:shared_preferences/shared_preferences.dart' as _i4;
1413
import 'package:wger/database/exercises/exercise_database.dart' as _i5;
1514
import 'package:wger/models/exercises/category.dart' as _i7;
1615
import 'package:wger/models/exercises/equipment.dart' as _i8;
1716
import 'package:wger/models/exercises/exercise.dart' as _i6;
18-
import 'package:wger/models/exercises/exercise_submission.dart' as _i13;
17+
import 'package:wger/models/exercises/exercise_submission.dart' as _i14;
18+
import 'package:wger/models/exercises/exercise_submission_images.dart' as _i12;
1919
import 'package:wger/models/exercises/language.dart' as _i10;
2020
import 'package:wger/models/exercises/muscle.dart' as _i9;
2121
import 'package:wger/models/exercises/variation.dart' as _i3;
@@ -110,12 +110,23 @@ class MockAddExerciseProvider extends _i1.Mock
110110
as _i2.WgerBaseProvider);
111111

112112
@override
113-
List<_i12.File> get exerciseImages =>
113+
List<_i12.ExerciseSubmissionImage> get exerciseImages =>
114114
(super.noSuchMethod(
115115
Invocation.getter(#exerciseImages),
116-
returnValue: <_i12.File>[],
116+
returnValue: <_i12.ExerciseSubmissionImage>[],
117117
)
118-
as List<_i12.File>);
118+
as List<_i12.ExerciseSubmissionImage>);
119+
120+
@override
121+
String get author =>
122+
(super.noSuchMethod(
123+
Invocation.getter(#author),
124+
returnValue: _i13.dummyValue<String>(
125+
this,
126+
Invocation.getter(#author),
127+
),
128+
)
129+
as String);
119130

120131
@override
121132
List<String> get alternateNamesEn =>
@@ -171,15 +182,21 @@ class MockAddExerciseProvider extends _i1.Mock
171182
as List<_i9.Muscle>);
172183

173184
@override
174-
_i13.ExerciseSubmissionApi get exerciseApiObject =>
185+
_i14.ExerciseSubmissionApi get exerciseApiObject =>
175186
(super.noSuchMethod(
176187
Invocation.getter(#exerciseApiObject),
177-
returnValue: _i14.dummyValue<_i13.ExerciseSubmissionApi>(
188+
returnValue: _i13.dummyValue<_i14.ExerciseSubmissionApi>(
178189
this,
179190
Invocation.getter(#exerciseApiObject),
180191
),
181192
)
182-
as _i13.ExerciseSubmissionApi);
193+
as _i14.ExerciseSubmissionApi);
194+
195+
@override
196+
set author(String? value) => super.noSuchMethod(
197+
Invocation.setter(#author, value),
198+
returnValueForMissingStub: null,
199+
);
183200

184201
@override
185202
set exerciseNameEn(String? value) => super.noSuchMethod(
@@ -277,40 +294,22 @@ class MockAddExerciseProvider extends _i1.Mock
277294
);
278295

279296
@override
280-
void addExerciseImages(
281-
List<_i12.File>? images, {
282-
String? title,
283-
String? author,
284-
String? authorUrl,
285-
String? sourceUrl,
286-
String? derivativeSourceUrl,
287-
String? style = '1',
288-
}) => super.noSuchMethod(
289-
Invocation.method(
290-
#addExerciseImages,
291-
[images],
292-
{
293-
#title: title,
294-
#author: author,
295-
#authorUrl: authorUrl,
296-
#sourceUrl: sourceUrl,
297-
#derivativeSourceUrl: derivativeSourceUrl,
298-
#style: style,
299-
},
300-
),
301-
returnValueForMissingStub: null,
302-
);
297+
void addExerciseImages(List<_i12.ExerciseSubmissionImage>? images) =>
298+
super.noSuchMethod(
299+
Invocation.method(#addExerciseImages, [images]),
300+
returnValueForMissingStub: null,
301+
);
303302

304303
@override
305-
void removeExercise(String? path) => super.noSuchMethod(
306-
Invocation.method(#removeExercise, [path]),
304+
void removeImage(String? path) => super.noSuchMethod(
305+
Invocation.method(#removeImage, [path]),
307306
returnValueForMissingStub: null,
308307
);
309308

310309
@override
311-
_i15.Future<int> addExercise() =>
310+
_i15.Future<int> postExerciseToServer() =>
312311
(super.noSuchMethod(
313-
Invocation.method(#addExercise, []),
312+
Invocation.method(#postExerciseToServer, []),
314313
returnValue: _i15.Future<int>.value(0),
315314
)
316315
as _i15.Future<int>);

0 commit comments

Comments
 (0)