diff --git a/.github/hooks/pre-push b/.github/hooks/pre-push index 9a037673..abc91f17 100755 --- a/.github/hooks/pre-push +++ b/.github/hooks/pre-push @@ -2,3 +2,6 @@ printf "\e[33;1m%s\e[0m\n" 'Running the Pre-push checks' ./scripts/checks.sh + +printf "\e[33;1m%s\e[0m\n" 'Running the Pre-push tests' +fvm flutter test diff --git a/analysis_options.yaml b/analysis_options.yaml index b6e00af1..fc5b6c48 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -112,18 +112,16 @@ dart_code_metrics: allowed-duplicated-chains: 3 - prefer-trailing-comma - - # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options analyzer: exclude: - - '**/*.freezed.dart' - - '**/*.g.dart' - - '**/*.gen.dart' - - '**/*.gr.dart' - - 'bricks' - - 'lib/generated_plugin_registrant.dart' + - "**/*.freezed.dart" + - "**/*.g.dart" + - "**/*.gen.dart" + - "**/*.gr.dart" + - "bricks" + - "lib/generated_plugin_registrant.dart" errors: invalid_annotation_target: ignore unused_element: ignore # https://github.com/dart-lang/sdk/issues/49025 diff --git a/lib/core/di/di_repository_module.dart b/lib/core/di/di_repository_module.dart index 45cfb22a..a5ac5fa5 100644 --- a/lib/core/di/di_repository_module.dart +++ b/lib/core/di/di_repository_module.dart @@ -27,7 +27,8 @@ class RepositoryDiModule { extension _GetItDiModuleExtensions on GetIt { void _setupProvidersAndUtils() { registerLazySingleton( - () => HttpServiceDio([AuthInterceptor(get())])); + () => HttpServiceDio([AuthInterceptor(get())]), + ); } void _setupRepositories() { diff --git a/lib/core/model/db/repository_db_entity.dart b/lib/core/model/db/repository_db_entity.dart index c82b94be..9ce52f9a 100644 --- a/lib/core/model/db/repository_db_entity.dart +++ b/lib/core/model/db/repository_db_entity.dart @@ -1,7 +1,8 @@ +import 'package:equatable/equatable.dart'; import 'package:floor/floor.dart'; @Entity(tableName: 'projects') -class ProjectDbEntity { +class ProjectDbEntity extends Equatable { @primaryKey final int id; final String name; @@ -10,7 +11,7 @@ class ProjectDbEntity { final String imageUrl; final String language; - ProjectDbEntity({ + const ProjectDbEntity({ required this.id, required this.name, required this.description, @@ -18,4 +19,14 @@ class ProjectDbEntity { required this.imageUrl, required this.language, }); + + @override + List get props => [ + id, + name, + description, + url, + imageUrl, + language, + ]; } diff --git a/pubspec.lock b/pubspec.lock index 04c3a182..7ede8961 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.2" + bloc_test: + dependency: "direct dev" + description: + name: bloc_test + sha256: "02f04270be5abae8df171143e61a0058a7acbce5dcac887612e89bb40cca4c33" + url: "https://pub.dev" + source: hosted + version: "9.1.5" boolean_selector: dependency: transitive description: @@ -232,6 +240,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" + url: "https://pub.dev" + source: hosted + version: "1.6.4" crypto: dependency: transitive description: @@ -288,6 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + diff_match_patch: + dependency: transitive + description: + name: diff_match_patch + sha256: "2efc9e6e8f449d0abe15be240e2c2a3bcd977c8d126cfd70598aee60af35c0a4" + url: "https://pub.dev" + source: hosted + version: "0.4.1" dio: dependency: "direct main" description: @@ -717,7 +741,7 @@ packages: source: hosted version: "1.0.4" mocktail: - dependency: "direct main" + dependency: "direct dev" description: name: mocktail sha256: bac151b31e4ed78bd59ab89aa4c0928f297b1180186d5daf03734519e5f596c1 @@ -740,6 +764,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" package_config: dependency: transitive description: @@ -956,6 +988,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" shelf_web_socket: dependency: transitive description: @@ -985,6 +1033,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.4" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" source_span: dependency: transitive description: @@ -1105,6 +1169,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + test: + dependency: transitive + description: + name: test + sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + url: "https://pub.dev" + source: hosted + version: "1.24.3" test_api: dependency: transitive description: @@ -1113,6 +1185,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.0" + test_core: + dependency: transitive + description: + name: test_core + sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + url: "https://pub.dev" + source: hosted + version: "0.5.3" time: dependency: transitive description: @@ -1169,6 +1249,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + url: "https://pub.dev" + source: hosted + version: "11.10.0" watcher: dependency: transitive description: @@ -1193,6 +1281,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 12aadd4d..0863fb4f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,6 @@ dependencies: dio: 5.3.2 equatable: 2.0.5 floor: 1.4.2 - mocktail: 1.0.1 flutter_bloc: 8.1.3 flutter_dotenv: 5.1.0 flutter_native_splash: 2.3.2 @@ -53,6 +52,8 @@ dev_dependencies: auto_route_generator: 7.3.1 build_runner: 2.4.6 + mocktail: 1.0.1 + bloc_test: 9.1.5 dart_code_metrics: 5.7.6 floor_generator: 1.4.2 flutter_flavorizr: 2.2.1 diff --git a/test/common/general_helpers.dart b/test/common/general_helpers.dart new file mode 100644 index 00000000..491fac6d --- /dev/null +++ b/test/common/general_helpers.dart @@ -0,0 +1,4 @@ +import 'package:flutter_template/core/source/common/app_database.dart'; + +Future setupFloorDatabase() async => + $FloorAppDatabase.inMemoryDatabaseBuilder().build(); diff --git a/test/common/mocks.dart b/test/common/mocks.dart new file mode 100644 index 00000000..82e81c81 --- /dev/null +++ b/test/common/mocks.dart @@ -0,0 +1,35 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_template/core/repository/project_repository.dart'; +import 'package:flutter_template/core/repository/session_repository.dart'; +import 'package:flutter_template/core/source/auth_local_source.dart'; +import 'package:flutter_template/core/source/auth_remote_source.dart'; +import 'package:flutter_template/core/source/common/http_service.dart'; +import 'package:flutter_template/core/source/common/local_shared_preferences_storage.dart'; +import 'package:flutter_template/core/source/project_local_source.dart'; +import 'package:flutter_template/core/source/project_remote_source.dart'; +import 'package:flutter_template/ui/section/error_handler/global_event_handler_cubit.dart'; +import 'package:mocktail/mocktail.dart'; + +//* Services +class HttpServiceMock extends Mock implements HttpService {} + +//* Data sources +class ProjectLocalSourceMock extends Mock implements ProjectLocalSource {} + +class ProjectRemoteSourceMock extends Mock implements ProjectRemoteSource {} + +class AuthLocalSourceMock extends Mock implements AuthLocalSource {} + +class AuthRemoteSourceMock extends Mock implements AuthRemoteSource {} + +//* Repositories +class MockSessionRepository extends Mock implements SessionRepository {} + +class MockProjectRepository extends Mock implements ProjectRepository {} + +//* Cubits +class MockGlobalEventHandlerCubit extends MockCubit + implements GlobalEventHandlerCubit {} + +class LocalSharedPreferencesStorageMock extends Mock + implements LocalSharedPreferencesStorage {} diff --git a/test/common/project_helpers.dart b/test/common/project_helpers.dart new file mode 100644 index 00000000..e7536e45 --- /dev/null +++ b/test/common/project_helpers.dart @@ -0,0 +1,26 @@ +import 'package:flutter_template/core/model/db/repository_db_entity.dart'; +import 'package:flutter_template/core/model/project.dart'; + +List generateProjectDbEntities(int count) => Iterable.generate( + count, + (index) => ProjectDbEntity( + id: index, + name: 'Test $index project', + description: 'Test $index project description', + url: 'test$index.com', + imageUrl: '', + language: 'ES', + ), + ).toList(); + +List generateProjects(int count) => Iterable.generate( + count, + (index) => Project( + id: index, + name: 'Test $index project', + description: 'Test $index project description', + url: 'test$index.com', + imageUrl: '', + language: 'ES', + ), + ).toList(); diff --git a/test/cubits/signin_cubit_test.dart b/test/cubits/signin_cubit_test.dart new file mode 100644 index 00000000..3488e00a --- /dev/null +++ b/test/cubits/signin_cubit_test.dart @@ -0,0 +1,85 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_template/core/repository/session_repository.dart'; +import 'package:flutter_template/ui/signin/signin_cubit.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mocktail/mocktail.dart'; + +import '../common/mocks.dart'; + +void main() { + late GetIt getIt; + late SessionRepository sessionRepository; + late SignInCubit signInCubit; + + setUp(() { + getIt = GetIt.instance + ..registerSingleton( + sessionRepository = MockSessionRepository(), + ); + }); + tearDown(() => getIt.reset()); + + test('Create SignInCubit should return base state', () { + signInCubit = SignInCubit(MockGlobalEventHandlerCubit()); + + expect( + signInCubit.state, + equals( + const SignInBaseState.state( + email: 'hi@xmartlabs.com', + password: 'xmartlabs', + error: '', + ), + ), + ); + }); + + blocTest( + 'SignInCubit change email should return state with new email', + build: () => signInCubit = SignInCubit(MockGlobalEventHandlerCubit()), + act: (bloc) => bloc.changeEmail('hitest@xmartlabs.com'), + expect: () => [ + const SignInBaseState.state( + email: 'hitest@xmartlabs.com', + password: 'xmartlabs', + error: '', + ), + ], + ); + + blocTest( + 'SignInCubit change password should return state with new password', + build: () => signInCubit = SignInCubit(MockGlobalEventHandlerCubit()), + act: (bloc) => bloc.changePassword('xmartlabs123'), + expect: () => [ + const SignInBaseState.state( + email: 'hi@xmartlabs.com', + password: 'xmartlabs123', + error: '', + ), + ], + ); + + blocTest( + 'SignInCubit signIn method should call signInUser in repository', + setUp: () { + when( + () => sessionRepository.signInUser( + email: 'hi@xmartlabs.com', + password: 'xmartlabs', + ), + ).thenAnswer((_) async {}); + }, + build: () => signInCubit = SignInCubit(MockGlobalEventHandlerCubit()), + act: (bloc) => bloc.signIn(), + verify: (_) { + verify( + () => sessionRepository.signInUser( + email: 'hi@xmartlabs.com', + password: 'xmartlabs', + ), + ).called(1); + }, + ); +} diff --git a/test/cubits/welcome_cubit_test.dart b/test/cubits/welcome_cubit_test.dart new file mode 100644 index 00000000..879674f3 --- /dev/null +++ b/test/cubits/welcome_cubit_test.dart @@ -0,0 +1,99 @@ +// ignore_for_file: lines_longer_than_80_chars + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_template/core/repository/project_repository.dart'; +import 'package:flutter_template/core/repository/session_repository.dart'; +import 'package:flutter_template/ui/welcome/welcome_cubit.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mocktail/mocktail.dart'; + +import '../common/mocks.dart'; +import '../common/project_helpers.dart'; + +void main() { + // ignore: unused_local_variable + late GetIt getIt; + late SessionRepository sessionRepository; + late ProjectRepository projectRepository; + late WelcomeCubit welcomeCubit; + + setUp(() { + getIt = GetIt.instance + ..registerSingleton( + sessionRepository = MockSessionRepository(), + ) + ..registerSingleton( + projectRepository = MockProjectRepository(), + ); + }); + + tearDown(() => getIt.reset()); + test( + 'Create Welcome cubit, should return a WelcomeCubit with base state', + () { + when(() => projectRepository.getProjects()).thenAnswer( + (_) => Stream.value([]), + ); + welcomeCubit = WelcomeCubit(MockGlobalEventHandlerCubit()); + + expect(welcomeCubit.state, equals(const WelcomeBaseState.state())); + }, + ); + + group('Welcome cubit with loaded projects tests', () { + blocTest( + 'Welcome cubit is created when project repository has data, should have' + ' projects in state', + setUp: () { + when(() => projectRepository.getProjects()).thenAnswer( + (_) => Stream.value(generateProjects(1)), + ); + }, + build: () => welcomeCubit = WelcomeCubit(MockGlobalEventHandlerCubit()), + expect: () => [ + WelcomeBaseState.state( + projects: generateProjects(1), + ), + ], + ); + + blocTest( + 'Welcome cubit is created when project repository is empty, project ' + 'repository stream emits new values then WelcomeCubit should emit a new ' + 'state with projects', + setUp: () { + when(() => projectRepository.getProjects()).thenAnswer( + (_) => Stream.fromIterable([ + generateProjects(1), + generateProjects(2), + ]), + ); + }, + build: () => welcomeCubit = WelcomeCubit(MockGlobalEventHandlerCubit()), + expect: () => [ + WelcomeBaseState.state( + projects: generateProjects(1), + ), + WelcomeBaseState.state( + projects: generateProjects(2), + ), + ], + ); + + blocTest( + 'Welcome cubit calls logOut from sessionRepository when the screen calls logOut method from cubit', + build: () => welcomeCubit = WelcomeCubit(MockGlobalEventHandlerCubit()), + setUp: () { + when(() => sessionRepository.logOut()).thenAnswer( + (_) async {}, + ); + when(() => projectRepository.getProjects()).thenAnswer( + (_) => Stream.value([]), + ); + }, + act: (cubit) => cubit.logOut(), + verify: (_) => verify(() => sessionRepository.logOut()).called(1), + ); + }); +} diff --git a/test/repositories/project/project_local_source_test.dart b/test/repositories/project/project_local_source_test.dart index 9ab19550..0c95b564 100644 --- a/test/repositories/project/project_local_source_test.dart +++ b/test/repositories/project/project_local_source_test.dart @@ -1,17 +1,19 @@ import 'dart:math'; -import 'package:collection/collection.dart'; import 'package:flutter_template/core/model/db/repository_db_entity.dart'; import 'package:flutter_template/core/source/common/app_database.dart'; import 'package:flutter_template/core/source/project_local_source.dart'; import 'package:flutter_test/flutter_test.dart'; +import '../../common/general_helpers.dart'; +import '../../common/project_helpers.dart'; + void main() { late AppDatabase database; late ProjectLocalSource projectDao; setUp(() async { - database = await $FloorAppDatabase.inMemoryDatabaseBuilder().build(); + database = await setupFloorDatabase(); projectDao = database.projectLocalSource; }); @@ -20,67 +22,32 @@ void main() { }); group('Test projects db', () { - test('Get projects from empty db, should return an empty list', () async { + test('Get projects from empty db, should return an empty list', () async { final projects = await projectDao.getProjects().first; expect(projects, []); }); test('Insert one project to empty db, should return 1 project', () async { - final project = ProjectDbEntity( - id: 1, - name: 'Test projects', - description: 'Test project description', - url: 'test.com', - imageUrl: '', - language: 'ES', + final projects = generateProjectDbEntities(1); + await projectDao.insertProjects(projects); + expect( + await projectDao.getProjects().first, + projects, ); - await projectDao.insertProjects([project]); - final projects = await projectDao.getProjects().first; - expect(projects.length, 1); }); test('get all projects from db, should return 10', () async { - final projects = Iterable.generate( - 10, - (index) => ProjectDbEntity( - id: index, - name: 'Test $index project', - description: 'Test $index project description', - url: 'test$index.com', - imageUrl: '', - language: 'ES', - ), - ).toList(); + final projects = generateProjectDbEntities(10); await projectDao.insertProjects(projects); - expect((await projectDao.getProjects().first).length, projects.length); + expect(await projectDao.getProjects().first, projects); }); test('Delete all projects from db, should return empty list', () async { - final projects = Iterable.generate( - 10, - (index) => ProjectDbEntity( - id: index, - name: 'Test $index project', - description: 'Test $index project description', - url: 'test$index.com', - imageUrl: '', - language: 'ES', - ), - ).toList(); + final projects = generateProjectDbEntities(10); await projectDao.insertProjects(projects); await projectDao.deleteAllProjects(); expect(await projectDao.getProjects().first, []); }); test('Replace 2 projects from db, should return two new projects', () async { - final projects = Iterable.generate( - 2, - (index) => ProjectDbEntity( - id: index, - name: 'Test $index project', - description: 'Test $index project description', - url: 'test$index.com', - imageUrl: '', - language: 'ES', - ), - ).toList(); + final projects = generateProjectDbEntities(2); await projectDao.insertProjects(projects); final replacement = projects .map( @@ -98,14 +65,7 @@ void main() { replacement, ); final list = await projectDao.getProjects().first; - bool result = true; - for (final element in list) { - if (replacement.firstWhereOrNull((e) => e.id == element.id) == null) { - result = false; - break; - } - } - expect(result, true); + expect(list, replacement); }); }); } diff --git a/test/repositories/project/project_remote_source_test.dart b/test/repositories/project/project_remote_source_test.dart index 9953fbc5..aeaaec0c 100644 --- a/test/repositories/project/project_remote_source_test.dart +++ b/test/repositories/project/project_remote_source_test.dart @@ -4,7 +4,8 @@ import 'package:flutter_template/core/source/project_remote_source.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -class HttpServiceMock extends Mock implements HttpService {} +import '../../common/mocks.dart'; +import '../../common/project_helpers.dart'; void main() { late HttpService httpService; @@ -18,26 +19,17 @@ void main() { test('Get projects from API should return one project', () async { const urlGetProjects = 'rest/v1/projects?select=*'; final requestOptions = RequestOptions(path: urlGetProjects); - + final projects = generateProjects(1); when(() => httpService.get(urlGetProjects)).thenAnswer( (_) async => Response( - data: [ - { - 'id': 1, - 'name': 'Test projects', - 'description': 'Test project description', - 'url': 'test.com', - 'image_url': '', - 'language': 'ES', - } - ], + data: projects.map((e) => e.toJson()).toList(), statusCode: 200, requestOptions: requestOptions, ), ); final result = await projectRemoteSource.getProjects(); - expect(result.length, 1); + expect(result, projects); }); test('Get projects from empty API should return empty', () async { const urlGetProjects = 'rest/v1/projects?select=*'; diff --git a/test/repositories/project/project_repository_test.dart b/test/repositories/project/project_repository_test.dart index 1daadb75..a678653f 100644 --- a/test/repositories/project/project_repository_test.dart +++ b/test/repositories/project/project_repository_test.dart @@ -1,14 +1,13 @@ -import 'package:flutter_template/core/model/db/repository_db_entity.dart'; -import 'package:flutter_template/core/model/project.dart'; +// ignore_for_file: lines_longer_than_80_chars + import 'package:flutter_template/core/repository/project_repository.dart'; import 'package:flutter_template/core/source/project_local_source.dart'; import 'package:flutter_template/core/source/project_remote_source.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -class ProjectLocalSourceMock extends Mock implements ProjectLocalSource {} - -class ProjectRemoteSourceMock extends Mock implements ProjectRemoteSource {} +import '../../common/mocks.dart'; +import '../../common/project_helpers.dart'; void main() { late ProjectLocalSource projectLocalSource; @@ -45,56 +44,26 @@ void main() { test( 'get projects stream from a loaded state, should return a stream that gives 2 values', () async { + final projects = generateProjects(2); when(() => projectLocalSource.getProjects()).thenAnswer( (_) => Stream.value( - [ - ProjectDbEntity( - id: 1, - name: 'Test projects', - description: 'Test project description', - url: 'test.com', - imageUrl: '', - language: 'ES', - ), - ProjectDbEntity( - id: 2, - name: 'Test projects', - description: 'Test project description', - url: 'test.com', - imageUrl: '', - language: 'ES', - ), - ], + generateProjectDbEntities(2), ), ); when(() => projectLocalSource.replaceProjects(any())) .thenAnswer((_) async {}); when(() => projectRemoteSource.getProjects()).thenAnswer( - (_) async => [ - Project( - id: 1, - name: 'Test projects', - description: 'Test project description', - url: 'test.com', - imageUrl: '', - language: 'ES', - ), - Project( - id: 2, - name: 'Test projects', - description: 'Test project description', - url: 'test.com', - imageUrl: '', - language: 'ES', - ), - ], + (_) async => generateProjects(2), ); final list = await projectRepository.getProjects().first; verify(() => projectLocalSource.getProjects()).called(1); verify(() => projectRemoteSource.getProjects()).called(1); verify(() => projectLocalSource.replaceProjects(any())).called(1); - expect(list?.length, 2); + expect( + list, + projects, + ); }, ); } diff --git a/test/repositories/session/session_local_source_test.dart b/test/repositories/session/session_local_source_test.dart index 83d02362..62745ae9 100644 --- a/test/repositories/session/session_local_source_test.dart +++ b/test/repositories/session/session_local_source_test.dart @@ -1,11 +1,11 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'package:flutter_template/core/model/user.dart'; import 'package:flutter_template/core/source/auth_local_source.dart'; -import 'package:flutter_template/core/source/common/local_shared_preferences_storage.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -class LocalSharedPreferencesStorageMock extends Mock - implements LocalSharedPreferencesStorage {} +import '../../common/mocks.dart'; void main() { late LocalSharedPreferencesStorageMock storage; diff --git a/test/repositories/session/session_remote_source_test.dart b/test/repositories/session/session_remote_source_test.dart index 2160d448..7274cf40 100644 --- a/test/repositories/session/session_remote_source_test.dart +++ b/test/repositories/session/session_remote_source_test.dart @@ -8,7 +8,7 @@ import 'package:flutter_template/core/source/common/http_service.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -class HttpServiceMock extends Mock implements HttpService {} +import '../../common/mocks.dart'; void main() { late HttpService httpService; diff --git a/test/repositories/session/session_repository_test.dart b/test/repositories/session/session_repository_test.dart index e0ce7c40..147cda71 100644 --- a/test/repositories/session/session_repository_test.dart +++ b/test/repositories/session/session_repository_test.dart @@ -1,3 +1,5 @@ +// ignore_for_file: lines_longer_than_80_chars + import 'dart:io'; import 'package:flutter_template/core/model/authentication_status.dart'; @@ -10,9 +12,8 @@ import 'package:flutter_template/core/source/common/app_database.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -class AuthLocalSourceMock extends Mock implements AuthLocalSource {} - -class AuthRemoteSourceMock extends Mock implements AuthRemoteSource {} +import '../../common/general_helpers.dart'; +import '../../common/mocks.dart'; void main() { late AuthLocalSource authLocalSource; @@ -23,7 +24,7 @@ void main() { setUp(() async { authLocalSource = AuthLocalSourceMock(); authRemoteSource = AuthRemoteSourceMock(); - appDatabase = await $FloorAppDatabase.inMemoryDatabaseBuilder().build(); + appDatabase = await setupFloorDatabase(); sessionRepository = SessionRepository(appDatabase, authLocalSource, authRemoteSource); });