diff --git a/test/features/identity_creator/presentation/identity_creator_controller_test.dart b/test/features/identity_creator/presentation/identity_creator_controller_test.dart new file mode 100644 index 000000000..1c60c945c --- /dev/null +++ b/test/features/identity_creator/presentation/identity_creator_controller_test.dart @@ -0,0 +1,194 @@ +import 'package:core/data/network/config/dynamic_url_interceptors.dart'; +import 'package:core/data/network/dio_client.dart'; +import 'package:core/data/network/download/download_client.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/app_toast.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/utils/application_manager.dart'; +import 'package:flutter/widgets.dart' hide State; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/http/http_client.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/account/account.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart'; +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:tmail_ui_user/features/caching/caching_manager.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/upload_attachment_interactor.dart'; +import 'package:tmail_ui_user/features/email/data/datasource_impl/html_datasource_impl.dart'; +import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_controller.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart'; +import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/usecase/create_public_asset_interactor.dart'; +import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart'; +import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; +import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:uuid/uuid.dart'; +import 'package:worker_manager/worker_manager.dart'; + +import 'identity_creator_controller_test.mocks.dart'; + +@GenerateNiceMocks([ + // Base controller mockspecs + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + // Identity creator controller mockspecs + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), + MockSpec(), +]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late IdentityCreatorController identityCreatorController; + late MockVerifyNameInteractor mockVerifyNameInteractor; + late MockGetAllIdentitiesInteractor mockGetAllIdentitiesInteractor; + late MockIdentityUtils mockIdentityUtils; + late MockDeletePublicAssetsInteractor deletePublicAssetsInteractor; + + late MockCachingManager mockCachingManager; + late MockLanguageCacheManager mockLanguageCacheManager; + late MockAuthorizationInterceptors mockAuthorizationInterceptors; + late MockDynamicUrlInterceptors mockDynamicUrlInterceptors; + late MockDeleteCredentialInteractor mockDeleteCredentialInteractor; + late MockLogoutOidcInteractor mockLogoutOidcInteractor; + late MockDeleteAuthorityOidcInteractor mockDeleteAuthorityOidcInteractor; + late MockAppToast mockAppToast; + late MockImagePaths mockImagePaths; + late MockResponsiveUtils mockResponsiveUtils; + late MockUuid mockUuid; + late MockApplicationManager mockApplicationManager; + + setUpAll(() { + //mock base controller + mockCachingManager = MockCachingManager(); + mockLanguageCacheManager = MockLanguageCacheManager(); + mockAuthorizationInterceptors = MockAuthorizationInterceptors(); + mockDynamicUrlInterceptors = MockDynamicUrlInterceptors(); + mockDeleteCredentialInteractor = MockDeleteCredentialInteractor(); + mockLogoutOidcInteractor = MockLogoutOidcInteractor(); + mockDeleteAuthorityOidcInteractor = MockDeleteAuthorityOidcInteractor(); + mockAppToast = MockAppToast(); + mockImagePaths = MockImagePaths(); + mockResponsiveUtils = MockResponsiveUtils(); + mockUuid = MockUuid(); + mockApplicationManager = MockApplicationManager(); + + Get.put(mockCachingManager); + Get.put(mockLanguageCacheManager); + Get.put(mockAuthorizationInterceptors); + Get.put( + mockAuthorizationInterceptors, + tag: BindingTag.isolateTag, + ); + Get.put(mockDynamicUrlInterceptors); + Get.put(mockDeleteCredentialInteractor); + Get.put(mockLogoutOidcInteractor); + Get.put(mockDeleteAuthorityOidcInteractor); + Get.put(mockAppToast); + Get.put(mockImagePaths); + Get.put(mockResponsiveUtils); + Get.put(mockUuid); + Get.put(mockApplicationManager); + + //mock identity creator controller + mockVerifyNameInteractor = MockVerifyNameInteractor(); + mockGetAllIdentitiesInteractor = MockGetAllIdentitiesInteractor(); + mockIdentityUtils = MockIdentityUtils(); + deletePublicAssetsInteractor = MockDeletePublicAssetsInteractor(); + + Get.put(MockDioClient(), tag: BindingTag.isolateTag); + Get.put(MockExecutor()); + Get.put(MockRemoteExceptionThrower()); + Get.put(MockDownloadClient()); + Get.put(MockHtmlAnalyzer()); + Get.put(MockHttpClient()); + Get.put(deletePublicAssetsInteractor, tag: BindingTag.publicAssetBindingsTag); + Get.put(MockUploadAttachmentInteractor()); + Get.put(MockCreatePublicAssetInteractor()); + Get.put(MockHtmlDataSourceImpl(), tag: BindingTag.publicAssetBindingsTag); + + Get.testMode = true; + + identityCreatorController = IdentityCreatorController( + mockVerifyNameInteractor, + mockGetAllIdentitiesInteractor, + mockIdentityUtils); + }); + + group("IdentityCreatorController test:", () { + test( + 'should call deletePublicAssetsInteractor.execute() ' + 'when closeView() is called', + () { + // arrange + final accountId = AccountId(Id('value')); + final account = Account( + AccountName('value'), + true, + true, + {CapabilityIdentifier.jmapPublicAsset: DefaultCapability({})}); + final session = Session( + {}, + {accountId: account}, + {}, UserName('value'), Uri(), Uri(), Uri(), Uri(), State('value')); + identityCreatorController.arguments = IdentityCreatorArguments(accountId, session); + + // act + identityCreatorController.onReady(); + expect(identityCreatorController.publicAssetController, isNotNull); + + final context = MockBuildContext(); + final buildOwner = MockBuildOwner(); + final focusManager = MockFocusManager(); + when(context.owner).thenReturn(buildOwner); + when(buildOwner.focusManager).thenReturn(focusManager); + when(focusManager.rootScope).thenReturn(FocusScopeNode()); + identityCreatorController.closeView(context); + + // assert + verify(deletePublicAssetsInteractor.execute( + session, + accountId, + publicAssetIds: anyNamed('publicAssetIds'), + )).called(1); + }); + }); +} \ No newline at end of file