diff --git a/app/.discoverignore b/app/.discoverignore new file mode 100644 index 0000000..619b97e --- /dev/null +++ b/app/.discoverignore @@ -0,0 +1,3 @@ +lib/**/*.g.dart +lib/**/*.freezed.dart +lib/presentation/ui/**/*.dart \ No newline at end of file diff --git a/app/android/build.properties b/app/android/build.properties index 45bf95e..16589b3 100644 --- a/app/android/build.properties +++ b/app/android/build.properties @@ -1,6 +1,6 @@ flutter.versionName=1.0.0 flutter.appId=base flutter.versionCode=1 -flutter.compileSdkVersion=34 +flutter.compileSdkVersion=35 flutter.minSdkVersion=21 -flutter.targetSdkVersion=33 +flutter.targetSdkVersion=35 diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 0f7943f..8e1a6fd 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: flutter: sdk: flutter flutter_svg: ^2.0.5 + discover: ^0.4.0 shared_preferences: ^2.5.3 intl: ^0.19.0 intl_utils: ^2.8.7 @@ -35,7 +36,7 @@ dependencies: package_info_plus: ^8.3.0 permission_handler: ^11.4.0 universal_html: ^2.2.2 - go_router: ^7.0.1 + go_router: ^15.1.1 equatable: ^2.0.5 firebase_core: ^3.13.0 url_strategy: ^0.2.0 @@ -56,8 +57,8 @@ dependencies: example_presentation: path: ../example/example_presentation - http: ^0.13.6 - melos: ^3.4.0 + http: ^1.3.0 + melos: ^7.0.0-dev.8 dev: ^1.0.0 dev_dependencies: @@ -68,7 +69,7 @@ dev_dependencies: sdk: flutter mockito: ^5.4.4 mocktail: ^1.0.3 - flutter_lints: ^3.0.2 + flutter_lints: ^5.0.0 flutter_intl: enabled: true # Required. Must be set to true to activate the package. Default: false diff --git a/app/test/widget_test.dart b/app/test/widget_test.dart deleted file mode 100644 index 9ab4255..0000000 --- a/app/test/widget_test.dart +++ /dev/null @@ -1,25 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/modules/common/pubspec.yaml b/modules/common/pubspec.yaml index 8696246..25ec2f4 100644 --- a/modules/common/pubspec.yaml +++ b/modules/common/pubspec.yaml @@ -11,6 +11,7 @@ dependencies: sdk: flutter intl: ^0.19.0 intl_utils: ^2.8.6 + discover: ^0.4.0 cupertino_icons: ^1.0.5 async: ^2.11.0 flutter_bloc: ^8.1.2 diff --git a/modules/data/.discoverignore b/modules/data/.discoverignore new file mode 100644 index 0000000..f474250 --- /dev/null +++ b/modules/data/.discoverignore @@ -0,0 +1,4 @@ +lib/**/*.g.dart +lib/**/*.freezed.dart +lib/network/**/*.dart +lib/preferences/*.dart \ No newline at end of file diff --git a/modules/data/pubspec.yaml b/modules/data/pubspec.yaml index 7e8c992..79f2e29 100644 --- a/modules/data/pubspec.yaml +++ b/modules/data/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: async: ^2.11.0 flutter_bloc: ^8.1.2 get_it: ^7.6.0 + discover: ^0.4.0 equatable: ^2.0.5 flutter_localizations: sdk: flutter @@ -22,11 +23,14 @@ dependencies: path: ../domain common: path: ../common + url_strategy: ^0.2.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 + mocktail: ^1.0.0 + test: ^1.24.0 #connectivity_plus: ^5.0.2. Steps to add connectivity plus: #Add platform :ios, '12.0' in ios/Podfile and check no new crashings are in ios 16 diff --git a/modules/data/test/repositories/auth_repository_impl_test.dart b/modules/data/test/repositories/auth_repository_impl_test.dart new file mode 100644 index 0000000..bfa9b00 --- /dev/null +++ b/modules/data/test/repositories/auth_repository_impl_test.dart @@ -0,0 +1,73 @@ +import 'package:common/core/result_type.dart'; +import 'package:data/preferences/preferences.dart'; +import 'package:data/repositories/auth_repository_impl.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; + +class MockPreferences extends Mock implements Preferences {} + +void main() { + late AuthRepositoryImpl repository; + late MockPreferences mockPreferences; + + setUp(() { + mockPreferences = MockPreferences(); + repository = AuthRepositoryImpl(mockPreferences); + }); + + group('isLoggedIn', () { + test('should return true when token exists', () { + // Arrange + when(() => mockPreferences.getToken()).thenReturn('some-token'); + + // Act + final result = repository.isLoggedIn(); + + // Assert + expect(result, true); + verify(() => mockPreferences.getToken()).called(1); + }); + + test('should return false when token is null', () { + // Arrange + when(() => mockPreferences.getToken()).thenReturn(null); + + // Act + final result = repository.isLoggedIn(); + + // Assert + expect(result, false); + verify(() => mockPreferences.getToken()).called(1); + }); + }); + + group('login', () { + test('should return success and set token when login is successful', + () async { + // Arrange + const username = 'test_user'; + const password = 'test_password'; + when(() => mockPreferences.setToken(any())).thenAnswer((_) async {}); + + // Act + final result = await repository.login(username, password); + + // Assert + expect(result, isA()); + verify(() => mockPreferences.setToken('new-token')).called(1); + }); + }); + + group('logout', () { + test('should clear token when logging out', () async { + // Arrange + when(() => mockPreferences.setToken(null)).thenAnswer((_) async {}); + + // Act + await repository.logout(); + + // Assert + verify(() => mockPreferences.setToken(null)).called(1); + }); + }); +} diff --git a/modules/domain/.discoverignore b/modules/domain/.discoverignore new file mode 100644 index 0000000..619b97e --- /dev/null +++ b/modules/domain/.discoverignore @@ -0,0 +1,3 @@ +lib/**/*.g.dart +lib/**/*.freezed.dart +lib/presentation/ui/**/*.dart \ No newline at end of file diff --git a/modules/domain/pubspec.yaml b/modules/domain/pubspec.yaml index d8f2535..09c815a 100644 --- a/modules/domain/pubspec.yaml +++ b/modules/domain/pubspec.yaml @@ -12,6 +12,7 @@ dependencies: sdk: flutter async: ^2.11.0 flutter_bloc: ^8.1.2 + discover: ^0.4.0 get_it: ^7.6.0 equatable: ^2.0.5 url_strategy: ^0.2.0 diff --git a/pubspec.yaml b/pubspec.yaml index 20ca790..931a73e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ # This config file is for Sonarqube only -name: Sonar -description: Sonar +name: sonar +description: sonar publish_to: "none" version: 0.0.1+1 diff --git a/run_coverage.sh b/run_coverage.sh new file mode 100755 index 0000000..1f4a760 --- /dev/null +++ b/run_coverage.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Function to run tests and coverage for a module +run_module_coverage() { + local module=$1 + echo "Running tests and coverage for $module..." + cd $module + discover scan + cd .. + cd .. +} + +# Run coverage for each module +echo "Starting test coverage scan..." +# run_module_coverage "modules/common" +run_module_coverage "modules/domain" +run_module_coverage "modules/data" +# run_module_coverage "app" + +# Combine coverage reports +echo "Combining coverage reports..." +lcov --add-tracefile modules/domain/coverage/lcov.info \ + --add-tracefile modules/data/coverage/lcov.info \ + --output-file coverage/lcov.info + +# Generate HTML report +echo "Generating HTML report..." +genhtml coverage/lcov.info -o coverage/html + +echo "Coverage report generated in coverage/html" \ No newline at end of file