From a8f5640afd14c3a4b98a197c0beab0710cf0c630 Mon Sep 17 00:00:00 2001 From: paranid5 Date: Sun, 29 Dec 2024 22:08:48 +0300 Subject: [PATCH] di test upgrade; ci/cd for di test --- .github/workflows/di_test.yml | 25 +++++++++++++ lib/core/di/provide_singleton.dart | 8 +++++ lib/di/app_module.dart | 15 ++++---- .../auth/child/sign_in/di/sign_in_module.dart | 12 +++---- .../auth/child/sign_up/di/sign_up_module.dart | 12 +++---- lib/feature/auth/di/auth_module.dart | 18 +++++----- lib/feature/main/di/main_module.dart | 9 +++-- lib/feature/root/di/root_module.dart | 14 ++++---- test/di_test.dart | 36 ++----------------- 9 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 .github/workflows/di_test.yml create mode 100644 lib/core/di/provide_singleton.dart diff --git a/.github/workflows/di_test.yml b/.github/workflows/di_test.yml new file mode 100644 index 0000000..f7486a1 --- /dev/null +++ b/.github/workflows/di_test.yml @@ -0,0 +1,25 @@ +name: DiTest + +on: + push: + branches: + - master + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: 3.27.1 + + - name: Get Dependencies + run: flutter pub get + + - name: Run Tests + run: flutter test test/di_test.dart \ No newline at end of file diff --git a/lib/core/di/provide_singleton.dart b/lib/core/di/provide_singleton.dart new file mode 100644 index 0000000..cb2b0fd --- /dev/null +++ b/lib/core/di/provide_singleton.dart @@ -0,0 +1,8 @@ +import 'package:get_it/get_it.dart'; + +extension ProvideSingleton on GetIt { + Type provideSingleton(T Function() factory) { + registerLazySingleton(factory); + return T; + } +} \ No newline at end of file diff --git a/lib/di/app_module.dart b/lib/di/app_module.dart index c589207..31eec98 100644 --- a/lib/di/app_module.dart +++ b/lib/di/app_module.dart @@ -1,5 +1,5 @@ import 'package:get_it/get_it.dart'; -import 'package:poster/core/di/core_module.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/auth/di/auth_module.dart'; import 'package:poster/feature/main/di/main_module.dart'; import 'package:poster/feature/root/di/root_module.dart'; @@ -8,11 +8,10 @@ import 'package:poster/navigation/app_router.dart'; final di = GetIt.instance; extension AppModule on GetIt { - void registerAppModule() { - registerCoreModule(); - registerRootModule(); - registerAuthModule(); - registerMainModule(); - registerLazySingleton(() => AppRouter()); - } + List registerAppModule() => [ + ...registerRootModule(), + ...registerAuthModule(), + ...registerMainModule(), + provideSingleton(() => AppRouter()), + ]; } diff --git a/lib/feature/auth/child/sign_in/di/sign_in_module.dart b/lib/feature/auth/child/sign_in/di/sign_in_module.dart index 5071292..5784956 100644 --- a/lib/feature/auth/child/sign_in/di/sign_in_module.dart +++ b/lib/feature/auth/child/sign_in/di/sign_in_module.dart @@ -1,14 +1,14 @@ import 'package:get_it/get_it.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/auth/child/sign_in/presentation/bloc/sign_in_bloc_factory.dart'; import 'package:poster/feature/auth/child/sign_in/domain/use_case/sign_in_use_case.dart'; extension SignInModule on GetIt { - void registerSignInModule() { - registerLazySingleton(() => SignInUseCase(authRepository: this())); - - registerLazySingleton(() => SignInBlocFactory( + List registerSignInModule() => [ + provideSingleton(() => SignInUseCase(authRepository: this())), + provideSingleton(() => SignInBlocFactory( loginUseCase: this(), validateEmailUseCase: this(), - )); - } + )), + ]; } \ No newline at end of file diff --git a/lib/feature/auth/child/sign_up/di/sign_up_module.dart b/lib/feature/auth/child/sign_up/di/sign_up_module.dart index eb9ed06..d82c596 100644 --- a/lib/feature/auth/child/sign_up/di/sign_up_module.dart +++ b/lib/feature/auth/child/sign_up/di/sign_up_module.dart @@ -1,14 +1,14 @@ import 'package:get_it/get_it.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/auth/child/sign_up/domain/use_case/sign_up_use_case.dart'; import 'package:poster/feature/auth/child/sign_up/presentation/bloc/mod.dart'; extension SignUpModule on GetIt { - void registerSignUpModule() { - registerLazySingleton(() => SignUpUseCase(authRepository: this())); - - registerLazySingleton(() => SignUpBlocFactory( + List registerSignUpModule() => [ + provideSingleton(() => SignUpUseCase(authRepository: this())), + provideSingleton(() => SignUpBlocFactory( signUpUseCase: this(), validateEmailUseCase: this(), - )); - } + )), + ]; } diff --git a/lib/feature/auth/di/auth_module.dart b/lib/feature/auth/di/auth_module.dart index 0da4cb7..0d63e0e 100644 --- a/lib/feature/auth/di/auth_module.dart +++ b/lib/feature/auth/di/auth_module.dart @@ -1,4 +1,5 @@ import 'package:get_it/get_it.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/auth/child/sign_in/di/sign_in_module.dart'; import 'package:poster/feature/auth/child/sign_up/di/sign_up_module.dart'; import 'package:poster/feature/auth/data/repository/auth_repository_impl.dart'; @@ -7,16 +8,15 @@ import 'package:poster/feature/auth/domain/use_case/validate_email_use_case.dart import 'package:poster/feature/auth/presentation/bloc/auth_bloc_factory.dart'; extension AuthModule on GetIt { - void registerAuthModule() { - registerSignInModule(); - registerSignUpModule(); - - registerLazySingleton(() => ValidateEmailUseCase()); - registerLazySingleton(() => AuthRepositoryImpl()); - registerLazySingleton(() => AuthBlocFactory( + List registerAuthModule() => [ + ...registerSignInModule(), + ...registerSignUpModule(), + provideSingleton(() => ValidateEmailUseCase()), + provideSingleton(() => AuthRepositoryImpl()), + provideSingleton(() => AuthBlocFactory( signInBlocFactory: this(), signUpBlocFactory: this(), router: this(), - )); - } + )), + ]; } diff --git a/lib/feature/main/di/main_module.dart b/lib/feature/main/di/main_module.dart index 0ca353d..c778d49 100644 --- a/lib/feature/main/di/main_module.dart +++ b/lib/feature/main/di/main_module.dart @@ -1,10 +1,9 @@ import 'package:get_it/get_it.dart'; -import 'package:poster/feature/main/domain/use_case/create_post_use_case.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/main/presentation/bloc/main_bloc_factory.dart'; extension MainModule on GetIt { - void registerMainModule() { - registerLazySingleton(() => CreatePostUseCase(postRepository: this())); - registerLazySingleton(() => MainBlocFactory()); - } + List registerMainModule() => [ + provideSingleton(() => MainBlocFactory()), + ]; } diff --git a/lib/feature/root/di/root_module.dart b/lib/feature/root/di/root_module.dart index c72e272..e1becbe 100644 --- a/lib/feature/root/di/root_module.dart +++ b/lib/feature/root/di/root_module.dart @@ -1,18 +1,18 @@ import 'package:get_it/get_it.dart'; +import 'package:poster/core/di/provide_singleton.dart'; import 'package:poster/feature/root/domain/use_case/check_signed_in_use_case.dart'; import 'package:poster/feature/root/presentation/bloc/root_bloc_factory.dart'; extension RootModule on GetIt { - void registerRootModule() { - registerLazySingleton( + List registerRootModule() => [ + provideSingleton( () => CheckSignedInUseCase(authRepository: this()), - ); - - registerLazySingleton(() => RootBlocFactory( + ), + provideSingleton(() => RootBlocFactory( authBlocFactory: this(), mainBlocFactory: this(), checkSignedInUseCase: this(), router: this(), - )); - } + )), + ]; } diff --git a/test/di_test.dart b/test/di_test.dart index d1abeb9..28db490 100644 --- a/test/di_test.dart +++ b/test/di_test.dart @@ -1,45 +1,15 @@ -import 'package:dio/dio.dart'; import 'package:poster/di/app_module.dart'; -import 'package:poster/feature/auth/child/sign_in/domain/use_case/sign_in_use_case.dart'; -import 'package:poster/feature/auth/child/sign_in/presentation/bloc/sign_in_bloc_factory.dart'; -import 'package:poster/feature/auth/child/sign_up/domain/use_case/sign_up_use_case.dart'; -import 'package:poster/feature/auth/child/sign_up/presentation/bloc/sign_up_bloc_factory.dart'; -import 'package:poster/feature/auth/domain/repository/auth_repository.dart'; -import 'package:poster/feature/auth/domain/use_case/validate_email_use_case.dart'; -import 'package:poster/feature/auth/presentation/bloc/auth_bloc_factory.dart'; -import 'package:poster/feature/main/presentation/bloc/main_bloc_factory.dart'; -import 'package:poster/feature/root/domain/use_case/check_signed_in_use_case.dart'; -import 'package:poster/feature/root/presentation/bloc/root_bloc_factory.dart'; -import 'package:poster/navigation/app_router.dart'; import 'package:test/test.dart'; void main() { test('Check dependency graph', () { - di.registerAppModule(); - - expect(canRetrieve(), true); - expect(canRetrieve(), true); - - expect(canRetrieve(), true); - expect(canRetrieve(), true); - - expect(canRetrieve(), true); - expect(canRetrieve(), true); - - expect(canRetrieve(), true); - expect(canRetrieve(), true); - - expect(canRetrieve(), true); - expect(canRetrieve(), true); - expect(canRetrieve(), true); - - expect(canRetrieve(), true); + di.registerAppModule().forEach((type) => expect(canRetrieve(type), true)); }); } -bool canRetrieve() { +bool canRetrieve(Type type) { try { - di(); + di.get(type: type); return true; } catch (_) { return false;