From e67d992385535c628c3d13d61b79540229cc8d94 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Thu, 11 Jan 2024 22:13:11 +0100 Subject: [PATCH] Add (for now) simple settings page to reset the exercise cache This should be expanded later to allow to re-fetch all available exercises, etc. --- flatpak/scripts/flatpak_shared.dart | 65 ++++------- flatpak/scripts/manifest_generator.dart | 21 ++-- .../exercises/exercise_database.g.dart | 28 ++--- lib/l10n/app_en.arb | 4 + lib/main.dart | 2 + .../exercises/exercise_api.freezed.dart | 2 +- lib/widgets/core/about.dart | 7 +- lib/widgets/core/app_bar.dart | 32 +++--- lib/widgets/core/settings.dart | 106 ++++++++++++++++++ test/core/settings_test.dart | 54 +++++++++ .../contribute_exercise_test.mocks.dart | 2 +- test/gallery/gallery_form_test.mocks.dart | 2 +- test/gallery/gallery_screen_test.mocks.dart | 2 +- ...surement_categories_screen_test.mocks.dart | 2 +- .../measurement_provider_test.mocks.dart | 2 +- .../nutritional_meal_form_test.mocks.dart | 2 +- .../nutritional_plan_form_test.mocks.dart | 2 +- .../nutritional_plan_screen_test.mocks.dart | 2 +- .../nutritional_plans_screen_test.mocks.dart | 2 +- test/other/base_provider_test.mocks.dart | 2 +- test/user/provider_test.mocks.dart | 2 +- test/weight/weight_provider_test.mocks.dart | 2 +- test/weight/weight_screen_test.mocks.dart | 2 +- test/workout/gym_mode_screen_test.mocks.dart | 11 +- ...epetition_unit_form_widget_test.mocks.dart | 2 +- .../weight_unit_form_widget_test.mocks.dart | 2 +- test/workout/workout_day_form_test.mocks.dart | 2 +- test/workout/workout_form_test.mocks.dart | 2 +- .../workout_plan_screen_test.mocks.dart | 2 +- .../workout_plans_screen_test.mocks.dart | 2 +- test/workout/workout_provider_test.mocks.dart | 2 +- test/workout/workout_set_form_test.mocks.dart | 11 +- 32 files changed, 261 insertions(+), 122 deletions(-) create mode 100644 lib/widgets/core/settings.dart create mode 100644 test/core/settings_test.dart diff --git a/flatpak/scripts/flatpak_shared.dart b/flatpak/scripts/flatpak_shared.dart index d3ad12ad..f9432f5c 100644 --- a/flatpak/scripts/flatpak_shared.dart +++ b/flatpak/scripts/flatpak_shared.dart @@ -44,9 +44,8 @@ class Icon { _fileExtension = path.split('.').last; } - String getFilename(String appId) => (type == _symbolicType) - ? '$appId-symbolic.$_fileExtension' - : '$appId.$_fileExtension'; + String getFilename(String appId) => + (type == _symbolicType) ? '$appId-symbolic.$_fileExtension' : '$appId.$_fileExtension'; } class GithubReleases { @@ -75,8 +74,7 @@ class GithubReleases { final releaseJsonContent = (await http.get(Uri( scheme: 'https', host: 'api.github.com', - path: - '/repos/$githubReleaseOrganization/$githubReleaseProject/releases'))) + path: '/repos/$githubReleaseOrganization/$githubReleaseProject/releases'))) .body; final decodedJson = jsonDecode(releaseJsonContent) as List; @@ -87,23 +85,19 @@ class GithubReleases { await Future.forEach(decodedJson, (dynamic releaseDynamic) async { final releaseMap = releaseDynamic as Map; - final releaseDateAndTime = - DateTime.parse(releaseMap['published_at'] as String); - final releaseDateString = - releaseDateAndTime.toIso8601String().split('T').first; + final releaseDateAndTime = DateTime.parse(releaseMap['published_at'] as String); + final releaseDateString = releaseDateAndTime.toIso8601String().split('T').first; if (latestReleaseAssetDate == null || (latestReleaseAssetDate?.compareTo(releaseDateAndTime) == -1)) { - final assets = - await _parseGithubReleaseAssets(releaseMap['assets'] as List); + final assets = await _parseGithubReleaseAssets(releaseMap['assets'] as List); if (assets != null) { _latestReleaseAssets = assets; latestReleaseAssetDate = releaseDateAndTime; } } - releases.add(Release( - version: releaseMap['name'] as String, date: releaseDateString)); + releases.add(Release(version: releaseMap['name'] as String, date: releaseDateString)); }); if (releases.isNotEmpty || canBeEmpty) { @@ -124,8 +118,7 @@ class GithubReleases { final downloadUrl = amMap['browser_download_url'] as String; final filename = amMap['name'] as String; final fileExtension = filename.substring(filename.indexOf('.') + 1); - final filenameWithoutExtension = - filename.substring(0, filename.indexOf('.')); + final filenameWithoutExtension = filename.substring(0, filename.indexOf('.')); final arch = filenameWithoutExtension.endsWith('aarch64') ? CPUArchitecture.aarch64 @@ -221,8 +214,7 @@ class FlatpakMeta { : _localReleases = localReleases, _localReleaseAssets = localReleaseAssets { if (githubReleaseOrganization != null && githubReleaseProject != null) { - _githubReleases = - GithubReleases(githubReleaseOrganization!, githubReleaseProject!); + _githubReleases = GithubReleases(githubReleaseOrganization!, githubReleaseProject!); } } @@ -231,20 +223,17 @@ class FlatpakMeta { final releases = List.empty(growable: true); if (addedTodaysVersion != null) { releases.add(Release( - version: addedTodaysVersion, - date: DateTime.now().toIso8601String().split("T").first)); + version: addedTodaysVersion, date: DateTime.now().toIso8601String().split("T").first)); } if (fetchReleasesFromGithub) { if (_githubReleases == null) { throw Exception( 'Metadata must include Github repository info if fetching releases from Github.'); } - releases.addAll( - await _githubReleases!.getReleases(addedTodaysVersion != null)); + releases.addAll(await _githubReleases!.getReleases(addedTodaysVersion != null)); } else { if (_localReleases == null && addedTodaysVersion == null) { - throw Exception( - 'Metadata must include releases if not fetching releases from Github.'); + throw Exception('Metadata must include releases if not fetching releases from Github.'); } if (_localReleases?.isNotEmpty ?? false) { releases.addAll(_localReleases!); @@ -253,8 +242,7 @@ class FlatpakMeta { return releases; } - Future?> getLatestReleaseAssets( - bool fetchReleasesFromGithub) async { + Future?> getLatestReleaseAssets(bool fetchReleasesFromGithub) async { if (fetchReleasesFromGithub) { if (_githubReleases == null) { throw Exception( @@ -263,8 +251,7 @@ class FlatpakMeta { return await _githubReleases!.getLatestReleaseAssets(); } else { if (_localReleases == null) { - throw Exception( - 'Metadata must include releases if not fetching releases from Github.'); + throw Exception('Metadata must include releases if not fetching releases from Github.'); } return _localReleaseAssets; } @@ -276,24 +263,20 @@ class FlatpakMeta { return FlatpakMeta( appId: json['appId'] as String, lowercaseAppName: json['lowercaseAppName'] as String, - githubReleaseOrganization: - json['githubReleaseOrganization'] as String?, + githubReleaseOrganization: json['githubReleaseOrganization'] as String?, githubReleaseProject: json['githubReleaseProject'] as String?, localReleases: skipLocalReleases ? null : (json['localReleases'] as List?)?.map((dynamic r) { final rMap = r as Map; - return Release( - version: rMap['version'] as String, - date: rMap['date'] as String); + return Release(version: rMap['version'] as String, date: rMap['date'] as String); }).toList(), localReleaseAssets: skipLocalReleases ? null : (json['localReleaseAssets'] as List?)?.map((dynamic ra) { final raMap = ra as Map; final archString = raMap['arch'] as String; - final arch = (archString == - CPUArchitecture.x86_64.flatpakArchCode) + final arch = (archString == CPUArchitecture.x86_64.flatpakArchCode) ? CPUArchitecture.x86_64 : (archString == CPUArchitecture.aarch64.flatpakArchCode) ? CPUArchitecture.aarch64 @@ -302,11 +285,10 @@ class FlatpakMeta { throw Exception( 'Architecture must be either "${CPUArchitecture.x86_64.flatpakArchCode}" or "${CPUArchitecture.aarch64.flatpakArchCode}"'); } - final tarballFile = File( - '${jsonFile.parent.path}/${raMap['tarballPath'] as String}'); + final tarballFile = + File('${jsonFile.parent.path}/${raMap['tarballPath'] as String}'); final tarballPath = tarballFile.absolute.path; - final preShasum = - Process.runSync('shasum', ['-a', '256', tarballPath]); + final preShasum = Process.runSync('shasum', ['-a', '256', tarballPath]); final shasum = preShasum.stdout.toString().split(' ').first; if (preShasum.exitCode != 0) { throw Exception(preShasum.stderr); @@ -321,17 +303,14 @@ class FlatpakMeta { appStreamPath: json['appStreamPath'] as String, desktopPath: json['desktopPath'] as String, icons: (json['icons'] as Map).entries.map((mapEntry) { - return Icon( - type: mapEntry.key as String, path: mapEntry.value as String); + return Icon(type: mapEntry.key as String, path: mapEntry.value as String); }).toList(), freedesktopRuntime: json['freedesktopRuntime'] as String, buildCommandsAfterUnpack: (json['buildCommandsAfterUnpack'] as List?) ?.map((dynamic bc) => bc as String) .toList(), extraModules: json['extraModules'] as List?, - finishArgs: (json['finishArgs'] as List) - .map((dynamic fa) => fa as String) - .toList()); + finishArgs: (json['finishArgs'] as List).map((dynamic fa) => fa as String).toList()); } catch (e) { throw Exception('Could not parse JSON file, due to this error:\n$e'); } diff --git a/flatpak/scripts/manifest_generator.dart b/flatpak/scripts/manifest_generator.dart index 8957a3d1..254bb1ae 100644 --- a/flatpak/scripts/manifest_generator.dart +++ b/flatpak/scripts/manifest_generator.dart @@ -26,8 +26,7 @@ void main(List arguments) async { 'You must run this script with a metadata file argument, using the --meta flag.'); } if (arguments.length == metaIndex + 1) { - throw Exception( - 'The --meta flag must be followed by the path to the metadata file.'); + throw Exception('The --meta flag must be followed by the path to the metadata file.'); } final metaFile = File(arguments[metaIndex + 1]); @@ -37,23 +36,19 @@ void main(List arguments) async { final fetchFromGithub = arguments.contains('--github'); - final meta = - FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub); + final meta = FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub); - final outputDir = - Directory('${Directory.current.path}/flatpak_generator_exports'); + final outputDir = Directory('${Directory.current.path}/flatpak_generator_exports'); outputDir.createSync(); final manifestGenerator = FlatpakManifestGenerator(meta); - final manifestContent = - await manifestGenerator.generateFlatpakManifest(fetchFromGithub); + final manifestContent = await manifestGenerator.generateFlatpakManifest(fetchFromGithub); final manifestPath = '${outputDir.path}/${meta.appId}.json'; final manifestFile = File(manifestPath); manifestFile.writeAsStringSync(manifestContent); print('Generated $manifestPath'); - final flathubJsonContent = - await manifestGenerator.generateFlathubJson(fetchFromGithub); + final flathubJsonContent = await manifestGenerator.generateFlathubJson(fetchFromGithub); if (flathubJsonContent != null) { final flathubJsonPath = '${outputDir.path}/flathub.json'; final flathubJsonFile = File(flathubJsonPath); @@ -132,8 +127,7 @@ class FlatpakManifestGenerator { const encoder = JsonEncoder.withIndent(' '); - final onlyArchListInput = - fetchFromGithub ? _githubArchSupport! : _localArchSupport!; + final onlyArchListInput = fetchFromGithub ? _githubArchSupport! : _localArchSupport!; final onlyArchList = List.empty(growable: true); for (final e in onlyArchListInput.entries) { @@ -149,8 +143,7 @@ class FlatpakManifestGenerator { } } - void _lazyGenerateArchSupportMap( - bool fetchFromGithub, List assets) { + void _lazyGenerateArchSupportMap(bool fetchFromGithub, List assets) { if (fetchFromGithub) { if (_githubArchSupport == null) { _githubArchSupport = { diff --git a/lib/database/exercises/exercise_database.g.dart b/lib/database/exercises/exercise_database.g.dart index 4109167e..3e09c0ef 100644 --- a/lib/database/exercises/exercise_database.g.dart +++ b/lib/database/exercises/exercise_database.g.dart @@ -317,8 +317,7 @@ class MuscleTable extends DataClass implements Insertable { final map = {}; map['id'] = Variable(id); { - final converter = $MusclesTable.$converterdata; - map['data'] = Variable(converter.toSql(data)); + map['data'] = Variable($MusclesTable.$converterdata.toSql(data)); } return map; } @@ -409,9 +408,7 @@ class MusclesCompanion extends UpdateCompanion { map['id'] = Variable(id.value); } if (data.present) { - final converter = $MusclesTable.$converterdata; - - map['data'] = Variable(converter.toSql(data.value)); + map['data'] = Variable($MusclesTable.$converterdata.toSql(data.value)); } if (rowid.present) { map['rowid'] = Variable(rowid.value); @@ -495,8 +492,7 @@ class EquipmentTable extends DataClass implements Insertable { final map = {}; map['id'] = Variable(id); { - final converter = $EquipmentsTable.$converterdata; - map['data'] = Variable(converter.toSql(data)); + map['data'] = Variable($EquipmentsTable.$converterdata.toSql(data)); } return map; } @@ -587,9 +583,7 @@ class EquipmentsCompanion extends UpdateCompanion { map['id'] = Variable(id.value); } if (data.present) { - final converter = $EquipmentsTable.$converterdata; - - map['data'] = Variable(converter.toSql(data.value)); + map['data'] = Variable($EquipmentsTable.$converterdata.toSql(data.value)); } if (rowid.present) { map['rowid'] = Variable(rowid.value); @@ -673,8 +667,7 @@ class CategoryTable extends DataClass implements Insertable { final map = {}; map['id'] = Variable(id); { - final converter = $CategoriesTable.$converterdata; - map['data'] = Variable(converter.toSql(data)); + map['data'] = Variable($CategoriesTable.$converterdata.toSql(data)); } return map; } @@ -765,9 +758,7 @@ class CategoriesCompanion extends UpdateCompanion { map['id'] = Variable(id.value); } if (data.present) { - final converter = $CategoriesTable.$converterdata; - - map['data'] = Variable(converter.toSql(data.value)); + map['data'] = Variable($CategoriesTable.$converterdata.toSql(data.value)); } if (rowid.present) { map['rowid'] = Variable(rowid.value); @@ -851,8 +842,7 @@ class LanguagesTable extends DataClass implements Insertable { final map = {}; map['id'] = Variable(id); { - final converter = $LanguagesTable.$converterdata; - map['data'] = Variable(converter.toSql(data)); + map['data'] = Variable($LanguagesTable.$converterdata.toSql(data)); } return map; } @@ -943,9 +933,7 @@ class LanguagesCompanion extends UpdateCompanion { map['id'] = Variable(id.value); } if (data.present) { - final converter = $LanguagesTable.$converterdata; - - map['data'] = Variable(converter.toSql(data.value)); + map['data'] = Variable($LanguagesTable.$converterdata.toSql(data.value)); } if (rowid.present) { map['rowid'] = Variable(rowid.value); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7271a8c4..5ba87a4b 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -639,6 +639,10 @@ "@baseData": { "description": "The base data for an exercise such as category, trained muscles, etc." }, + "settingsTitle": "Settings", + "settingsCacheTitle": "Cache", + "settingsCacheDescription": "Exercise cache", + "settingsCacheDeletedSnackbar": "Cache successfully cleared", "aboutPageTitle": "About Wger", "contributeExerciseWarning": "You can only contribute exercises if your account is older than {days} days and have verified your email", "@contributeExerciseWarning": { diff --git a/lib/main.dart b/lib/main.dart index 5628ad30..88240ae3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -49,6 +49,7 @@ import 'package:wger/screens/workout_plan_screen.dart'; import 'package:wger/screens/workout_plans_screen.dart'; import 'package:wger/theme/theme.dart'; import 'package:wger/widgets/core/about.dart'; +import 'package:wger/widgets/core/settings.dart'; import 'providers/auth.dart'; @@ -164,6 +165,7 @@ class MyApp extends StatelessWidget { ExerciseDetailScreen.routeName: (ctx) => const ExerciseDetailScreen(), AddExerciseScreen.routeName: (ctx) => const AddExerciseScreen(), AboutPage.routeName: (ctx) => const AboutPage(), + SettingsPage.routeName: (ctx) => const SettingsPage(), }, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, diff --git a/lib/models/exercises/exercise_api.freezed.dart b/lib/models/exercises/exercise_api.freezed.dart index 79dbc58f..ecc6aa7f 100644 --- a/lib/models/exercises/exercise_api.freezed.dart +++ b/lib/models/exercises/exercise_api.freezed.dart @@ -425,7 +425,7 @@ class _$ExerciseBaseDataImpl implements _ExerciseBaseData { } @override - bool operator ==(dynamic other) { + bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType && other is _$ExerciseBaseDataImpl && diff --git a/lib/widgets/core/about.dart b/lib/widgets/core/about.dart index b5979f18..cd29a8e1 100644 --- a/lib/widgets/core/about.dart +++ b/lib/widgets/core/about.dart @@ -57,16 +57,11 @@ class AboutEntry extends StatelessWidget { } } -class AboutPage extends StatefulWidget { +class AboutPage extends StatelessWidget { static String routeName = '/AboutPage'; const AboutPage({super.key}); - @override - State createState() => _AboutPageState(); -} - -class _AboutPageState extends State { @override Widget build(BuildContext context) { final deviceSize = MediaQuery.of(context).size; diff --git a/lib/widgets/core/app_bar.dart b/lib/widgets/core/app_bar.dart index 06f1c746..9b66a815 100644 --- a/lib/widgets/core/app_bar.dart +++ b/lib/widgets/core/app_bar.dart @@ -27,6 +27,7 @@ import 'package:wger/providers/user.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/form_screen.dart'; import 'package:wger/widgets/core/about.dart'; +import 'package:wger/widgets/core/settings.dart'; import 'package:wger/widgets/user/forms.dart'; class MainAppBar extends StatelessWidget implements PreferredSizeWidget { @@ -50,9 +51,7 @@ class MainAppBar extends StatelessWidget implements PreferredSizeWidget { actions: [ TextButton( child: Text(MaterialLocalizations.of(context).closeButtonLabel), - onPressed: () { - Navigator.of(context).pop(); - }, + onPressed: () => Navigator.of(context).pop(), ), ], contentPadding: EdgeInsets.zero, @@ -63,22 +62,23 @@ class MainAppBar extends StatelessWidget implements PreferredSizeWidget { //dense: true, leading: const Icon(Icons.person), title: Text(AppLocalizations.of(context).userProfile), - onTap: () { - Navigator.pushNamed( - context, - FormScreen.routeName, - arguments: FormScreenArguments( - AppLocalizations.of(context).userProfile, - UserProfileForm(context.read().profile!), - ), - ); - }, + onTap: () => Navigator.pushNamed( + context, + FormScreen.routeName, + arguments: FormScreenArguments( + AppLocalizations.of(context).userProfile, + UserProfileForm(context.read().profile!), + ), + ), + ), + ListTile( + leading: const Icon(Icons.settings), + onTap: () => Navigator.of(context).pushNamed(SettingsPage.routeName), + title: Text(AppLocalizations.of(context).settingsTitle), ), ListTile( leading: const Icon(Icons.info), - onTap: () { - Navigator.of(context).pushNamed(AboutPage.routeName); - }, + onTap: () => Navigator.of(context).pushNamed(AboutPage.routeName), title: Text(AppLocalizations.of(context).aboutPageTitle), ), const Divider(), diff --git a/lib/widgets/core/settings.dart b/lib/widgets/core/settings.dart new file mode 100644 index 00000000..e2af3db6 --- /dev/null +++ b/lib/widgets/core/settings.dart @@ -0,0 +1,106 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +//import 'package:drift/drift.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:provider/provider.dart'; +import 'package:wger/helpers/misc.dart'; +import 'package:wger/providers/exercises.dart'; + +class AboutEntry extends StatelessWidget { + final String url; + final String title; + final String content; + final Icon icon; + + const AboutEntry({ + required this.title, + required this.content, + required this.url, + required this.icon, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: icon, + title: Text(title), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(content), + Text( + url, + style: const TextStyle(color: Colors.blue), + ), + ], + ), + contentPadding: EdgeInsets.zero, + onTap: () async => launchURL(url, context), + ); + } +} + +class SettingsPage extends StatefulWidget { + static String routeName = '/SettingsPage'; + + const SettingsPage({super.key}); + + @override + State createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + @override + Widget build(BuildContext context) { + final exerciseProvider = Provider.of(context, listen: false); + final today = DateTime.now(); + + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context).settingsTitle), + ), + body: ListView( + children: [ + ListTile( + // leading: const Icon(Icons.cached), + title: Text(AppLocalizations.of(context).settingsCacheTitle), + subtitle: Text(AppLocalizations.of(context).settingsCacheDescription), + trailing: IconButton( + key: const ValueKey('cacheIcon'), + icon: const Icon(Icons.cached), + onPressed: () async { + await exerciseProvider.clearAllCachesAndPrefs(); + + if (context.mounted) { + final snackBar = SnackBar( + content: Text(AppLocalizations.of(context).settingsCacheDeletedSnackbar), + ); + + // Find the ScaffoldMessenger in the widget tree + // and use it to show a SnackBar. + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } + }, + ), + ) + ], + )); + } +} diff --git a/test/core/settings_test.dart b/test/core/settings_test.dart new file mode 100644 index 00000000..213fae58 --- /dev/null +++ b/test/core/settings_test.dart @@ -0,0 +1,54 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) 2020, 2021 wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.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/providers/exercises.dart'; +import 'package:wger/widgets/core/settings.dart'; + +import 'settings_test.mocks.dart'; + +@GenerateMocks([ExercisesProvider]) +void main() { + final mockExerciseProvider = MockExercisesProvider(); + + Widget createSettingsScreen({locale = 'en'}) { + return ChangeNotifierProvider( + create: (context) => mockExerciseProvider, + child: MaterialApp( + locale: Locale(locale), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + home: const SettingsPage()), + ); + } + + group('Cache', () { + testWidgets('Test the widgets on the gym mode screen', (WidgetTester tester) async { + await tester.pumpWidget(createSettingsScreen()); + await tester.tap(find.byKey(const ValueKey('cacheIcon'))); + await tester.pumpAndSettle(); + + verify(mockExerciseProvider.clearAllCachesAndPrefs()); + }); + }); +} diff --git a/test/exercises/contribute_exercise_test.mocks.dart b/test/exercises/contribute_exercise_test.mocks.dart index 0ba3357b..5a02ea6b 100644 --- a/test/exercises/contribute_exercise_test.mocks.dart +++ b/test/exercises/contribute_exercise_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/exercises/contribute_exercise_test.dart. // Do not manually edit this file. diff --git a/test/gallery/gallery_form_test.mocks.dart b/test/gallery/gallery_form_test.mocks.dart index f999751f..e6a42a1d 100644 --- a/test/gallery/gallery_form_test.mocks.dart +++ b/test/gallery/gallery_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/gallery/gallery_form_test.dart. // Do not manually edit this file. diff --git a/test/gallery/gallery_screen_test.mocks.dart b/test/gallery/gallery_screen_test.mocks.dart index 57aca247..bea4448f 100644 --- a/test/gallery/gallery_screen_test.mocks.dart +++ b/test/gallery/gallery_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/gallery/gallery_screen_test.dart. // Do not manually edit this file. diff --git a/test/measurements/measurement_categories_screen_test.mocks.dart b/test/measurements/measurement_categories_screen_test.mocks.dart index 622d72bf..bcda9791 100644 --- a/test/measurements/measurement_categories_screen_test.mocks.dart +++ b/test/measurements/measurement_categories_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/measurements/measurement_categories_screen_test.dart. // Do not manually edit this file. diff --git a/test/measurements/measurement_provider_test.mocks.dart b/test/measurements/measurement_provider_test.mocks.dart index 7eb41157..280d6390 100644 --- a/test/measurements/measurement_provider_test.mocks.dart +++ b/test/measurements/measurement_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/measurements/measurement_provider_test.dart. // Do not manually edit this file. diff --git a/test/nutrition/nutritional_meal_form_test.mocks.dart b/test/nutrition/nutritional_meal_form_test.mocks.dart index d1703de2..fdb841d2 100644 --- a/test/nutrition/nutritional_meal_form_test.mocks.dart +++ b/test/nutrition/nutritional_meal_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/nutrition/nutritional_meal_form_test.dart. // Do not manually edit this file. diff --git a/test/nutrition/nutritional_plan_form_test.mocks.dart b/test/nutrition/nutritional_plan_form_test.mocks.dart index edc6f7e3..35b25878 100644 --- a/test/nutrition/nutritional_plan_form_test.mocks.dart +++ b/test/nutrition/nutritional_plan_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/nutrition/nutritional_plan_form_test.dart. // Do not manually edit this file. diff --git a/test/nutrition/nutritional_plan_screen_test.mocks.dart b/test/nutrition/nutritional_plan_screen_test.mocks.dart index f60a99ca..4711f7f2 100644 --- a/test/nutrition/nutritional_plan_screen_test.mocks.dart +++ b/test/nutrition/nutritional_plan_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/nutrition/nutritional_plan_screen_test.dart. // Do not manually edit this file. diff --git a/test/nutrition/nutritional_plans_screen_test.mocks.dart b/test/nutrition/nutritional_plans_screen_test.mocks.dart index 40e4bd01..53513e7f 100644 --- a/test/nutrition/nutritional_plans_screen_test.mocks.dart +++ b/test/nutrition/nutritional_plans_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/nutrition/nutritional_plans_screen_test.dart. // Do not manually edit this file. diff --git a/test/other/base_provider_test.mocks.dart b/test/other/base_provider_test.mocks.dart index d0bd92ea..ea7ee384 100644 --- a/test/other/base_provider_test.mocks.dart +++ b/test/other/base_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/other/base_provider_test.dart. // Do not manually edit this file. diff --git a/test/user/provider_test.mocks.dart b/test/user/provider_test.mocks.dart index c32cf725..c06d47a1 100644 --- a/test/user/provider_test.mocks.dart +++ b/test/user/provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/user/provider_test.dart. // Do not manually edit this file. diff --git a/test/weight/weight_provider_test.mocks.dart b/test/weight/weight_provider_test.mocks.dart index 6c15ccc2..86083803 100644 --- a/test/weight/weight_provider_test.mocks.dart +++ b/test/weight/weight_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/weight/weight_provider_test.dart. // Do not manually edit this file. diff --git a/test/weight/weight_screen_test.mocks.dart b/test/weight/weight_screen_test.mocks.dart index 547003f9..530a9aeb 100644 --- a/test/weight/weight_screen_test.mocks.dart +++ b/test/weight/weight_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/weight/weight_screen_test.dart. // Do not manually edit this file. diff --git a/test/workout/gym_mode_screen_test.mocks.dart b/test/workout/gym_mode_screen_test.mocks.dart index 1ddf87bf..f4aa799f 100644 --- a/test/workout/gym_mode_screen_test.mocks.dart +++ b/test/workout/gym_mode_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/gym_mode_screen_test.dart. // Do not manually edit this file. @@ -422,6 +422,15 @@ class MockExercisesProvider extends _i1.Mock implements _i12.ExercisesProvider { returnValueForMissingStub: _i11.Future.value(), ) as _i11.Future); + @override + void initFilters() => super.noSuchMethod( + Invocation.method( + #initFilters, + [], + ), + returnValueForMissingStub: null, + ); + @override _i11.Future findByFilters() => (super.noSuchMethod( Invocation.method( diff --git a/test/workout/repetition_unit_form_widget_test.mocks.dart b/test/workout/repetition_unit_form_widget_test.mocks.dart index 9f69e023..1c716093 100644 --- a/test/workout/repetition_unit_form_widget_test.mocks.dart +++ b/test/workout/repetition_unit_form_widget_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/repetition_unit_form_widget_test.dart. // Do not manually edit this file. diff --git a/test/workout/weight_unit_form_widget_test.mocks.dart b/test/workout/weight_unit_form_widget_test.mocks.dart index 08bd227b..994ac3ff 100644 --- a/test/workout/weight_unit_form_widget_test.mocks.dart +++ b/test/workout/weight_unit_form_widget_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/weight_unit_form_widget_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_day_form_test.mocks.dart b/test/workout/workout_day_form_test.mocks.dart index 5a7344b3..4c2d603d 100644 --- a/test/workout/workout_day_form_test.mocks.dart +++ b/test/workout/workout_day_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_day_form_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_form_test.mocks.dart b/test/workout/workout_form_test.mocks.dart index c1e686e4..6d97eca7 100644 --- a/test/workout/workout_form_test.mocks.dart +++ b/test/workout/workout_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_form_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_plan_screen_test.mocks.dart b/test/workout/workout_plan_screen_test.mocks.dart index 449bf250..7a89d992 100644 --- a/test/workout/workout_plan_screen_test.mocks.dart +++ b/test/workout/workout_plan_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_plan_screen_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_plans_screen_test.mocks.dart b/test/workout/workout_plans_screen_test.mocks.dart index c2798777..0756f351 100644 --- a/test/workout/workout_plans_screen_test.mocks.dart +++ b/test/workout/workout_plans_screen_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_plans_screen_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_provider_test.mocks.dart b/test/workout/workout_provider_test.mocks.dart index d2952a6d..8309f4ec 100644 --- a/test/workout/workout_provider_test.mocks.dart +++ b/test/workout/workout_provider_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_provider_test.dart. // Do not manually edit this file. diff --git a/test/workout/workout_set_form_test.mocks.dart b/test/workout/workout_set_form_test.mocks.dart index 9b5099d7..792776b9 100644 --- a/test/workout/workout_set_form_test.mocks.dart +++ b/test/workout/workout_set_form_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.3 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in wger/test/workout/workout_set_form_test.dart. // Do not manually edit this file. @@ -352,6 +352,15 @@ class MockExercisesProvider extends _i1.Mock implements _i19.ExercisesProvider { returnValueForMissingStub: _i20.Future.value(), ) as _i20.Future); + @override + void initFilters() => super.noSuchMethod( + Invocation.method( + #initFilters, + [], + ), + returnValueForMissingStub: null, + ); + @override _i20.Future findByFilters() => (super.noSuchMethod( Invocation.method(