diff --git a/lib/helpers/consts.dart b/lib/helpers/consts.dart index ab58fb67..7d538e02 100644 --- a/lib/helpers/consts.dart +++ b/lib/helpers/consts.dart @@ -135,3 +135,5 @@ enum WeightUnitEnum { kg, lb } /// TextInputType for decimal numbers const textInputTypeDecimal = TextInputType.numberWithOptions(decimal: true); + +const String API_MAX_PAGE_SIZE = '999'; diff --git a/lib/providers/body_weight.dart b/lib/providers/body_weight.dart index 7e2b2986..9aa52c27 100644 --- a/lib/providers/body_weight.dart +++ b/lib/providers/body_weight.dart @@ -19,6 +19,7 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:wger/exceptions/http_exception.dart'; +import 'package:wger/helpers/consts.dart'; import 'package:wger/models/body_weight/weight_entry.dart'; import 'package:wger/providers/base_provider.dart'; @@ -69,7 +70,7 @@ class BodyWeightProvider with ChangeNotifier { // Process the response final data = await baseProvider.fetchPaginated(baseProvider.makeUrl( BODY_WEIGHT_URL, - query: {'ordering': '-date', 'limit': '100'}, + query: {'ordering': '-date', 'limit': API_MAX_PAGE_SIZE}, )); _entries = []; for (final entry in data) { diff --git a/lib/providers/exercises.dart b/lib/providers/exercises.dart index 63af8d91..6a4d90bf 100644 --- a/lib/providers/exercises.dart +++ b/lib/providers/exercises.dart @@ -460,7 +460,7 @@ class ExercisesProvider with ChangeNotifier { /// Updates the exercise database with *all* the exercises from the server Future updateExerciseCache(ExerciseDatabase database) async { final data = await baseProvider.fetchPaginated( - baseProvider.makeUrl(exerciseInfoUrlPath, query: {'limit': '999'}), + baseProvider.makeUrl(exerciseInfoUrlPath, query: {'limit': API_MAX_PAGE_SIZE}), ); exercises = data.map((e) => Exercise.fromApiDataJson(e, _languages)).toList(); diff --git a/lib/providers/measurement.dart b/lib/providers/measurement.dart index 77b888bc..faa07699 100644 --- a/lib/providers/measurement.dart +++ b/lib/providers/measurement.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:wger/exceptions/http_exception.dart'; import 'package:wger/exceptions/no_such_entry_exception.dart'; +import 'package:wger/helpers/consts.dart'; import 'package:wger/models/measurements/measurement_category.dart'; import 'package:wger/models/measurements/measurement_entry.dart'; import 'package:wger/providers/base_provider.dart'; @@ -54,10 +55,10 @@ class MeasurementProvider with ChangeNotifier { /// Fetches and sets the categories from the server (no entries) Future fetchAndSetCategories() async { // Process the response - final requestUrl = baseProvider.makeUrl(_categoryUrl); - final data = await baseProvider.fetch(requestUrl); + final requestUrl = baseProvider.makeUrl(_categoryUrl, query: {'limit': API_MAX_PAGE_SIZE}); + final data = await baseProvider.fetchPaginated(requestUrl); final List loadedEntries = []; - for (final entry in data['results']) { + for (final entry in data) { loadedEntries.add(MeasurementCategory.fromJson(entry)); } @@ -71,10 +72,13 @@ class MeasurementProvider with ChangeNotifier { final categoryIndex = _categories.indexOf(category); // Process the response - final requestUrl = baseProvider.makeUrl(_entryUrl, query: {'category': category.id.toString()}); - final data = await baseProvider.fetch(requestUrl); + final requestUrl = baseProvider.makeUrl( + _entryUrl, + query: {'category': category.id.toString(), 'limit': API_MAX_PAGE_SIZE}, + ); + final data = await baseProvider.fetchPaginated(requestUrl); final List loadedEntries = []; - for (final entry in data['results']) { + for (final entry in data) { loadedEntries.add(MeasurementEntry.fromJson(entry)); } final MeasurementCategory editedCategory = category.copyWith(entries: loadedEntries); diff --git a/lib/providers/nutrition.dart b/lib/providers/nutrition.dart index 384890c9..09c864af 100644 --- a/lib/providers/nutrition.dart +++ b/lib/providers/nutrition.dart @@ -96,7 +96,7 @@ class NutritionPlansProvider with ChangeNotifier { /// object itself and no child attributes Future fetchAndSetAllPlansSparse() async { final data = await baseProvider.fetchPaginated( - baseProvider.makeUrl(_nutritionalPlansPath, query: {'limit': '1000'}), + baseProvider.makeUrl(_nutritionalPlansPath, query: {'limit': API_MAX_PAGE_SIZE}), ); _plans = []; for (final planData in data) { @@ -109,7 +109,10 @@ class NutritionPlansProvider with ChangeNotifier { /// Fetches and sets all plans fully, i.e. with all corresponding child objects Future fetchAndSetAllPlansFull() async { - final data = await baseProvider.fetchPaginated(baseProvider.makeUrl(_nutritionalPlansPath)); + final data = await baseProvider.fetchPaginated(baseProvider.makeUrl( + _nutritionalPlansPath, + query: {'limit': API_MAX_PAGE_SIZE}, + )); await Future.wait(data.map((e) => fetchAndSetPlanFull(e['id'])).toList()); } @@ -448,7 +451,7 @@ class NutritionPlansProvider with ChangeNotifier { _nutritionDiaryPath, query: { 'plan': plan.id?.toString(), - 'limit': '999', + 'limit': API_MAX_PAGE_SIZE, 'ordering': 'datetime', }, ), diff --git a/lib/providers/routines.dart b/lib/providers/routines.dart index ee22eae9..e270f7d3 100644 --- a/lib/providers/routines.dart +++ b/lib/providers/routines.dart @@ -156,7 +156,7 @@ class RoutinesProvider with ChangeNotifier { final data = await baseProvider.fetch( baseProvider.makeUrl( _routinesUrlPath, - query: {'ordering': '-creation_date', 'limit': '1000', 'is_template': 'false'}, + query: {'ordering': '-creation_date', 'limit': API_MAX_PAGE_SIZE, 'is_template': 'false'}, ), ); for (final entry in data['results']) { @@ -170,7 +170,10 @@ class RoutinesProvider with ChangeNotifier { /// and no child attributes Future fetchAndSetAllRoutinesSparse() async { final data = await baseProvider.fetch( - baseProvider.makeUrl(_routinesUrlPath, query: {'limit': '1000', 'is_template': 'false'}), + baseProvider.makeUrl( + _routinesUrlPath, + query: {'limit': API_MAX_PAGE_SIZE, 'is_template': 'false'}, + ), ); _routines = []; for (final workoutPlanData in data['results']) { @@ -210,7 +213,7 @@ class RoutinesProvider with ChangeNotifier { /// and no child attributes Future fetchAndSetRoutineSparse(int planId) async { final fullPlanData = await baseProvider.fetch( - baseProvider.makeUrl(_routinesUrlPath, id: planId), + baseProvider.makeUrl(_routinesUrlPath, id: planId, query: {'limit': API_MAX_PAGE_SIZE}), ); final routine = Routine.fromJson(fullPlanData); _routines.add(routine); diff --git a/test/measurements/measurement_provider_test.dart b/test/measurements/measurement_provider_test.dart index 90f60bc1..0b50dd1c 100644 --- a/test/measurements/measurement_provider_test.dart +++ b/test/measurements/measurement_provider_test.dart @@ -6,6 +6,7 @@ import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; import 'package:wger/exceptions/http_exception.dart'; import 'package:wger/exceptions/no_such_entry_exception.dart'; +import 'package:wger/helpers/consts.dart'; import 'package:wger/models/measurements/measurement_category.dart'; import 'package:wger/models/measurements/measurement_entry.dart'; import 'package:wger/providers/base_provider.dart'; @@ -14,8 +15,6 @@ import 'package:wger/providers/measurement.dart'; import '../fixtures/fixture_reader.dart'; import 'measurement_provider_test.mocks.dart'; -// class MockWgerBaseProvider extends Mock implements WgerBaseProvider {} - @GenerateMocks([WgerBaseProvider]) void main() { late MeasurementProvider measurementProvider; @@ -48,16 +47,17 @@ void main() { measurementProvider = MeasurementProvider(mockWgerBaseProvider); when(mockWgerBaseProvider.makeUrl(any)).thenReturn(tCategoryUri); - when(mockWgerBaseProvider.makeUrl(any, id: anyNamed('id'))).thenReturn(tCategoryUri); - when(mockWgerBaseProvider.fetch(any)) - .thenAnswer((realInvocation) => Future.value(tMeasurementCategoriesMap)); + when(mockWgerBaseProvider.makeUrl(any, id: anyNamed('id'), query: anyNamed('query'))) + .thenReturn(tCategoryUri); + when(mockWgerBaseProvider.fetchPaginated(any)) + .thenAnswer((realInvocation) => Future.value(tMeasurementCategoriesMap['results'])); when(mockWgerBaseProvider.makeUrl(entryUrl, query: anyNamed('query'))) .thenReturn(tCategoryEntriesUri); when(mockWgerBaseProvider.makeUrl(entryUrl, id: anyNamed('id'), query: anyNamed('query'))) .thenReturn(tCategoryEntriesUri); - when(mockWgerBaseProvider.fetch(tCategoryEntriesUri)) - .thenAnswer((realInvocation) => Future.value(tMeasurementCategoryMap)); + when(mockWgerBaseProvider.fetchPaginated(tCategoryEntriesUri)) + .thenAnswer((realInvocation) => Future.value(tMeasurementCategoryMap['results'])); }); group('clear()', () { @@ -100,7 +100,7 @@ void main() { await measurementProvider.fetchAndSetCategories(); // assert - verify(mockWgerBaseProvider.makeUrl(categoryUrl)); + verify(mockWgerBaseProvider.makeUrl(categoryUrl, query: {'limit': API_MAX_PAGE_SIZE})); }); test('should fetch data from api', () async { @@ -108,7 +108,7 @@ void main() { await measurementProvider.fetchAndSetCategories(); // assert - verify(mockWgerBaseProvider.fetch(tCategoryUri)); + verify(mockWgerBaseProvider.fetchPaginated(tCategoryUri)); }); test('should set categories', () async { @@ -130,7 +130,10 @@ void main() { await measurementProvider.fetchAndSetCategoryEntries(tCategoryId); // assert - verify(mockWgerBaseProvider.makeUrl(entryUrl, query: {'category': tCategoryId.toString()})); + verify(mockWgerBaseProvider.makeUrl( + entryUrl, + query: {'category': tCategoryId.toString(), 'limit': API_MAX_PAGE_SIZE}, + )); }); test('should fetch categories entries for id', () async { @@ -138,7 +141,7 @@ void main() { await measurementProvider.fetchAndSetCategoryEntries(tCategoryId); // assert - verify(mockWgerBaseProvider.fetch(tCategoryEntriesUri)); + verify(mockWgerBaseProvider.fetchPaginated(tCategoryEntriesUri)); }); test('should add entries to category in list', () async { diff --git a/test/routine/routines_provider_test.dart b/test/routine/routines_provider_test.dart index 2569b4fc..6250415d 100644 --- a/test/routine/routines_provider_test.dart +++ b/test/routine/routines_provider_test.dart @@ -54,11 +54,12 @@ void main() { }); group('test the workout routine provider', () { - test('Test fetching and setting a plan', () async { + test('Test fetching and setting a routine', () async { final exercisesProvider = ExercisesProvider(mockBaseProvider); final uri = Uri.https('localhost', 'api/v2/routine/325397/'); - when(mockBaseProvider.makeUrl('routine', id: 325397)).thenReturn(uri); + when(mockBaseProvider.makeUrl('routine', id: 325397, query: {'limit': API_MAX_PAGE_SIZE})) + .thenReturn(uri); when(mockBaseProvider.fetch(uri)).thenAnswer( (_) async => Future.value({ 'id': 325397,