Fix test, remove unused mocks

This commit is contained in:
Roland Geider
2025-11-03 15:50:32 +01:00
parent 9040106939
commit c782d1a260
4 changed files with 17 additions and 329 deletions

View File

@@ -1,131 +0,0 @@
import 'dart:convert';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:wger/core/locator.dart';
import 'package:wger/database/exercises/exercise_database.dart';
import 'package:wger/models/exercises/exercise.dart';
import 'package:wger/providers/exercises.dart';
import '../../test_data/exercises.dart';
import '../fixtures/fixture_reader.dart';
import '../measurements/measurement_provider_test.mocks.dart';
void main() {
late MockWgerBaseProvider mockBaseProvider;
late ExercisesProvider provider;
const String exerciseInfoUrl = 'exerciseinfo';
final Uri tExerciseInfoUri = Uri(
scheme: 'http',
host: 'localhost',
path: 'api/v2/$exerciseInfoUrl/9/',
);
final Uri tExerciseInfoUri2 = Uri(
scheme: 'http',
host: 'localhost',
path: 'api/v2/$exerciseInfoUrl/1/',
);
final Map<String, dynamic> tExerciseInfoMap = jsonDecode(
fixture('exercises/exerciseinfo_response.json'),
);
setUpAll(() async {
// Needs to be configured here, setUp runs on every test, setUpAll only once
await ServiceLocator().configure();
});
setUp(() {
WidgetsFlutterBinding.ensureInitialized();
driftRuntimeOptions.dontWarnAboutMultipleDatabases = true;
mockBaseProvider = MockWgerBaseProvider();
provider = ExercisesProvider(
mockBaseProvider,
database: ExerciseDatabase.inMemory(NativeDatabase.memory()),
);
provider.exercises = getTestExercises();
provider.languages = [tLanguage1, tLanguage2, tLanguage3];
// Mock base info response
when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 9)).thenReturn(tExerciseInfoUri);
when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 1)).thenReturn(tExerciseInfoUri2);
when(
mockBaseProvider.fetch(tExerciseInfoUri),
).thenAnswer((_) => Future.value(tExerciseInfoMap));
when(
mockBaseProvider.fetch(tExerciseInfoUri2),
).thenAnswer((_) => Future.value(tExerciseInfoMap));
});
group('Correctly loads and parses data from the server', () {
test('test that fetchAndSetExerciseBase finds an existing base', () async {
// arrange and act
final base = await provider.fetchAndSetExercise(1);
// assert
verifyNever(provider.baseProvider.fetch(tExerciseInfoUri2));
expect(base?.id, 1);
});
test('test that fetchAndSetExerciseBase fetches a new base', () async {
// arrange and act
final base = await provider.fetchAndSetExercise(9);
// assert
verify(provider.baseProvider.fetch(tExerciseInfoUri));
expect(base?.id, 9);
});
test('Load the readExerciseBaseFromBaseInfo parse method', () {
// arrange
// arrange and act
final exercise = Exercise.fromApiDataJson(
tExerciseInfoMap,
const [tLanguage1, tLanguage2, tLanguage3],
);
// assert
expect(exercise.id, 9);
expect(exercise.uuid, '1b020b3a-3732-4c7e-92fd-a0cec90ed69b');
expect(exercise.categoryId, 10);
expect(exercise.equipment.map((e) => e.name), ['Kettlebell']);
expect(exercise.muscles.map((e) => e.name), [
'Biceps femoris',
'Brachialis',
'Obliquus externus abdominis',
]);
expect(exercise.musclesSecondary.map((e) => e.name), [
'Biceps femoris',
'Brachialis',
'Obliquus externus abdominis',
]);
expect(exercise.images.map((e) => e.uuid), [
'1f5d2b2f-d4ea-4eeb-9377-56176465e08d',
'ab645585-26ef-4992-a9ec-15425687ece9',
'd8aa5990-bb47-4111-9823-e2fbd98fe07f',
'49a159e1-1e00-409a-81c9-b4d4489fbd67',
]);
expect(exercise.videos.map((v) => v.uuid), ['63e996e9-a772-4ca5-9d09-8b4be03f6be4']);
final translation1 = exercise.translations[0];
expect(translation1.name, '2 Handed Kettlebell Swing');
expect(translation1.languageObj.shortName, 'en');
expect(translation1.notes[0].comment, "it's important to do the exercise correctly");
expect(translation1.notes[1].comment, 'put a lot of effort into this exercise');
expect(translation1.notes[2].comment, 'have fun');
expect(translation1.aliases[0].alias, 'double handed kettlebell');
expect(translation1.aliases[1].alias, 'Kettlebell russian style');
expect(exercise.translations[1].name, 'Kettlebell Con Dos Manos');
expect(exercise.translations[2].name, 'Zweihändiges Kettlebell');
});
});
}

View File

@@ -17,24 +17,31 @@
*/
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
import 'package:wger/providers/exercises.dart';
import 'package:wger/models/exercises/category.dart';
import 'package:wger/models/exercises/equipment.dart';
import 'package:wger/models/exercises/exercise.dart';
import 'package:wger/models/exercises/muscle.dart';
import 'package:wger/providers/exercise_data.dart';
import 'package:wger/widgets/exercises/exercises.dart';
import '../../test_data/exercises.dart';
import 'exercises_detail_widget_test.mocks.dart';
@GenerateMocks([ExercisesProvider])
void main() {
final mockProvider = MockExercisesProvider();
Widget createHomeScreen({locale = 'en'}) {
return ChangeNotifierProvider<ExercisesProvider>(
create: (context) => mockProvider,
return ProviderScope(
overrides: [
exercisesProvider.overrideWith((ref) => Stream<List<Exercise>>.value(<Exercise>[])),
exerciseMusclesProvider.overrideWith((ref) => Stream<List<Muscle>>.value(<Muscle>[])),
exerciseCategoriesProvider.overrideWith(
(ref) => Stream<List<ExerciseCategory>>.value(<ExerciseCategory>[]),
),
exerciseEquipmentProvider.overrideWith(
(ref) => Stream<List<Equipment>>.value(<Equipment>[]),
),
],
child: MaterialApp(
locale: Locale(locale),
localizationsDelegates: AppLocalizations.localizationsDelegates,
@@ -46,8 +53,6 @@ void main() {
}
testWidgets('Test the widgets on the exercise detail widget', (WidgetTester tester) async {
when(mockProvider.findExercisesByVariationId(any, exerciseIdToExclude: 1)).thenReturn([]);
await tester.pumpWidget(createHomeScreen());
await tester.pumpAndSettle();

View File

@@ -1,180 +0,0 @@
// Mocks generated by Mockito 5.4.6 from annotations
// in wger/test/exercises/exercises_detail_widget_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i10;
import 'dart:ui' as _i11;
import 'package:mockito/mockito.dart' as _i1;
import 'package:wger/database/exercises/exercise_database.dart' as _i3;
import 'package:wger/models/exercises/category.dart' as _i6;
import 'package:wger/models/exercises/equipment.dart' as _i8;
import 'package:wger/models/exercises/exercise.dart' as _i5;
import 'package:wger/models/exercises/language.dart' as _i9;
import 'package:wger/models/exercises/muscle.dart' as _i7;
import 'package:wger/providers/base_provider.dart' as _i2;
import 'package:wger/providers/exercises.dart' as _i4;
// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: must_be_immutable
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeWgerBaseProvider_0 extends _i1.SmartFake implements _i2.WgerBaseProvider {
_FakeWgerBaseProvider_0(Object parent, Invocation parentInvocation)
: super(parent, parentInvocation);
}
class _FakeExerciseDatabase_1 extends _i1.SmartFake implements _i3.ExerciseDatabase {
_FakeExerciseDatabase_1(Object parent, Invocation parentInvocation)
: super(parent, parentInvocation);
}
/// A class which mocks [ExercisesProvider].
///
/// See the documentation for Mockito's code generation for more information.
class MockExercisesProvider extends _i1.Mock implements _i4.ExercisesProvider {
MockExercisesProvider() {
_i1.throwOnMissingStub(this);
}
@override
_i2.WgerBaseProvider get baseProvider =>
(super.noSuchMethod(
Invocation.getter(#baseProvider),
returnValue: _FakeWgerBaseProvider_0(
this,
Invocation.getter(#baseProvider),
),
)
as _i2.WgerBaseProvider);
@override
_i3.ExerciseDatabase get database =>
(super.noSuchMethod(
Invocation.getter(#database),
returnValue: _FakeExerciseDatabase_1(
this,
Invocation.getter(#database),
),
)
as _i3.ExerciseDatabase);
@override
List<_i5.Exercise> get exercises =>
(super.noSuchMethod(
Invocation.getter(#exercises),
returnValue: <_i5.Exercise>[],
)
as List<_i5.Exercise>);
@override
Map<int, List<_i5.Exercise>> get exerciseByVariation =>
(super.noSuchMethod(
Invocation.getter(#exerciseByVariation),
returnValue: <int, List<_i5.Exercise>>{},
)
as Map<int, List<_i5.Exercise>>);
@override
List<_i6.ExerciseCategory> get categories =>
(super.noSuchMethod(
Invocation.getter(#categories),
returnValue: <_i6.ExerciseCategory>[],
)
as List<_i6.ExerciseCategory>);
@override
List<_i7.Muscle> get muscles =>
(super.noSuchMethod(
Invocation.getter(#muscles),
returnValue: <_i7.Muscle>[],
)
as List<_i7.Muscle>);
@override
List<_i8.Equipment> get equipment =>
(super.noSuchMethod(
Invocation.getter(#equipment),
returnValue: <_i8.Equipment>[],
)
as List<_i8.Equipment>);
@override
List<_i9.Language> get languages =>
(super.noSuchMethod(
Invocation.getter(#languages),
returnValue: <_i9.Language>[],
)
as List<_i9.Language>);
@override
set database(_i3.ExerciseDatabase? _database) => super.noSuchMethod(
Invocation.setter(#database, _database),
returnValueForMissingStub: null,
);
@override
set exercises(List<_i5.Exercise>? _exercises) => super.noSuchMethod(
Invocation.setter(#exercises, _exercises),
returnValueForMissingStub: null,
);
@override
set languages(List<_i9.Language>? languages) => super.noSuchMethod(
Invocation.setter(#languages, languages),
returnValueForMissingStub: null,
);
@override
bool get hasListeners =>
(super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false) as bool);
@override
void clear() => super.noSuchMethod(
Invocation.method(#clear, []),
returnValueForMissingStub: null,
);
@override
_i10.Future<_i5.Exercise?> fetchAndSetExercise(int? exerciseId) =>
(super.noSuchMethod(
Invocation.method(#fetchAndSetExercise, [exerciseId]),
returnValue: _i10.Future<_i5.Exercise?>.value(),
)
as _i10.Future<_i5.Exercise?>);
@override
void addListener(_i11.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(#addListener, [listener]),
returnValueForMissingStub: null,
);
@override
void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(
Invocation.method(#removeListener, [listener]),
returnValueForMissingStub: null,
);
@override
void dispose() => super.noSuchMethod(
Invocation.method(#dispose, []),
returnValueForMissingStub: null,
);
@override
void notifyListeners() => super.noSuchMethod(
Invocation.method(#notifyListeners, []),
returnValueForMissingStub: null,
);
}

View File

@@ -17,16 +17,10 @@
*/
import 'package:wger/providers/auth.dart';
import 'package:wger/providers/exercises.dart';
import 'measurements/measurement_provider_test.mocks.dart';
import 'other/base_provider_test.mocks.dart';
// Test Auth provider
final AuthProvider testAuthProvider = AuthProvider(MockClient())
..token = 'FooBar'
..serverUrl = 'https://localhost';
// Test Exercises provider
final mockBaseProvider = MockWgerBaseProvider();
final ExercisesProvider testExercisesProvider = ExercisesProvider(mockBaseProvider);