Skip to content

Commit

Permalink
di test upgrade; ci/cd for di test
Browse files Browse the repository at this point in the history
  • Loading branch information
dinaraparanid committed Dec 29, 2024
1 parent 16f49f6 commit a8f5640
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 74 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/di_test.yml
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions lib/core/di/provide_singleton.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:get_it/get_it.dart';

extension ProvideSingleton on GetIt {
Type provideSingleton<T extends Object>(T Function() factory) {
registerLazySingleton(factory);
return T;
}
}
15 changes: 7 additions & 8 deletions lib/di/app_module.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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<Type> registerAppModule() => [
...registerRootModule(),
...registerAuthModule(),
...registerMainModule(),
provideSingleton<AppRouter>(() => AppRouter()),
];
}
12 changes: 6 additions & 6 deletions lib/feature/auth/child/sign_in/di/sign_in_module.dart
Original file line number Diff line number Diff line change
@@ -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>(() => SignInUseCase(authRepository: this()));

registerLazySingleton<SignInBlocFactory>(() => SignInBlocFactory(
List<Type> registerSignInModule() => [
provideSingleton<SignInUseCase>(() => SignInUseCase(authRepository: this())),
provideSingleton<SignInBlocFactory>(() => SignInBlocFactory(
loginUseCase: this(),
validateEmailUseCase: this(),
));
}
)),
];
}
12 changes: 6 additions & 6 deletions lib/feature/auth/child/sign_up/di/sign_up_module.dart
Original file line number Diff line number Diff line change
@@ -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>(() => SignUpUseCase(authRepository: this()));

registerLazySingleton<SignUpBlocFactory>(() => SignUpBlocFactory(
List<Type> registerSignUpModule() => [
provideSingleton<SignUpUseCase>(() => SignUpUseCase(authRepository: this())),
provideSingleton<SignUpBlocFactory>(() => SignUpBlocFactory(
signUpUseCase: this(),
validateEmailUseCase: this(),
));
}
)),
];
}
18 changes: 9 additions & 9 deletions lib/feature/auth/di/auth_module.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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>(() => ValidateEmailUseCase());
registerLazySingleton<AuthRepository>(() => AuthRepositoryImpl());
registerLazySingleton<AuthBlocFactory>(() => AuthBlocFactory(
List<Type> registerAuthModule() => [
...registerSignInModule(),
...registerSignUpModule(),
provideSingleton<ValidateEmailUseCase>(() => ValidateEmailUseCase()),
provideSingleton<AuthRepository>(() => AuthRepositoryImpl()),
provideSingleton<AuthBlocFactory>(() => AuthBlocFactory(
signInBlocFactory: this(),
signUpBlocFactory: this(),
router: this(),
));
}
)),
];
}
9 changes: 4 additions & 5 deletions lib/feature/main/di/main_module.dart
Original file line number Diff line number Diff line change
@@ -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>(() => CreatePostUseCase(postRepository: this()));
registerLazySingleton<MainBlocFactory>(() => MainBlocFactory());
}
List<Type> registerMainModule() => [
provideSingleton<MainBlocFactory>(() => MainBlocFactory()),
];
}
14 changes: 7 additions & 7 deletions lib/feature/root/di/root_module.dart
Original file line number Diff line number Diff line change
@@ -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<CheckSignedInUseCase>(
List<Type> registerRootModule() => [
provideSingleton<CheckSignedInUseCase>(
() => CheckSignedInUseCase(authRepository: this()),
);

registerLazySingleton<RootBlocFactory>(() => RootBlocFactory(
),
provideSingleton<RootBlocFactory>(() => RootBlocFactory(
authBlocFactory: this(),
mainBlocFactory: this(),
checkSignedInUseCase: this(),
router: this(),
));
}
)),
];
}
36 changes: 3 additions & 33 deletions test/di_test.dart
Original file line number Diff line number Diff line change
@@ -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<Dio>(), true);
expect(canRetrieve<AppRouter>(), true);

expect(canRetrieve<CheckSignedInUseCase>(), true);
expect(canRetrieve<RootBlocFactory>(), true);

expect(canRetrieve<SignInUseCase>(), true);
expect(canRetrieve<SignInBlocFactory>(), true);

expect(canRetrieve<SignUpUseCase>(), true);
expect(canRetrieve<SignUpBlocFactory>(), true);

expect(canRetrieve<ValidateEmailUseCase>(), true);
expect(canRetrieve<AuthRepository>(), true);
expect(canRetrieve<AuthBlocFactory>(), true);

expect(canRetrieve<MainBlocFactory>(), true);
di.registerAppModule().forEach((type) => expect(canRetrieve(type), true));
});
}

bool canRetrieve<T extends Object>() {
bool canRetrieve(Type type) {
try {
di<T>();
di.get(type: type);
return true;
} catch (_) {
return false;
Expand Down

0 comments on commit a8f5640

Please sign in to comment.