TF-3082 Warn user and save identity cache on reload/session expired
This commit is contained in:
+69
@@ -0,0 +1,69 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:model/extensions/account_id_extensions.dart';
|
||||
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/data/datasource_impl/local_identity_creator_data_source_impl.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/data/model/identity_cache_model.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/domain/model/identity_cache.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||
import 'package:universal_html/html.dart';
|
||||
|
||||
import '../../../../fixtures/account_fixtures.dart';
|
||||
import '../../../../fixtures/session_fixtures.dart';
|
||||
import 'local_identity_creator_data_source_impl_test.mocks.dart';
|
||||
|
||||
@GenerateNiceMocks([MockSpec<ExceptionThrower>()])
|
||||
void main() {
|
||||
final exceptionThrower = MockExceptionThrower();
|
||||
final localIdentityCreatorDataSourceImpl = LocalIdentityCreatorDataSourceImpl(exceptionThrower);
|
||||
final session = SessionFixtures.aliceSession;
|
||||
final accountId = AccountFixtures.aliceAccountId;
|
||||
|
||||
group('local identity creator data source impl test:', () {
|
||||
test(
|
||||
'should save identity cache as expected',
|
||||
() async {
|
||||
// arrange
|
||||
final identity = Identity();
|
||||
const identityActionType = IdentityActionType.create;
|
||||
const isDefault = true;
|
||||
final htmlSignature = identity.signatureAsString;
|
||||
final preExistingPublicAssetIds = <PublicAssetId>[];
|
||||
final newlyPickedPublicAssetIds = <PublicAssetId>[];
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: preExistingPublicAssetIds,
|
||||
newlyPickedPublicAssetIds: newlyPickedPublicAssetIds,
|
||||
);
|
||||
final identityCache = IdentityCache(
|
||||
identity: identity,
|
||||
identityActionType: identityActionType,
|
||||
isDefault: isDefault,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments);
|
||||
|
||||
// act
|
||||
await localIdentityCreatorDataSourceImpl.saveIdentityCacheOnWeb(
|
||||
accountId,
|
||||
session.username,
|
||||
identityCache: identityCache);
|
||||
final cacheKey = TupleKey(
|
||||
LocalIdentityCreatorDataSourceImpl.sessionStorageKeyword,
|
||||
accountId.asString,
|
||||
session.username.value
|
||||
).toString();
|
||||
final cache = window.sessionStorage[cacheKey];
|
||||
|
||||
// assert
|
||||
expect(
|
||||
jsonDecode(cache!),
|
||||
equals(IdentityCacheModel.fromDomain(identityCache).toJson()));
|
||||
});
|
||||
});
|
||||
}
|
||||
+127
-10
@@ -5,6 +5,8 @@ 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:core/utils/platform_info.dart';
|
||||
import 'package:dartz/dartz.dart' hide State;
|
||||
import 'package:flutter/widgets.dart' hide State;
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:get/get.dart';
|
||||
@@ -17,26 +19,34 @@ 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:jmap_dart_client/jmap/identities/identity.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:tmail_ui_user/features/base/before_reconnect_manager.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/domain/model/identity_cache.dart';
|
||||
import 'package:tmail_ui_user/features/identity_creator/domain/usecase/save_identity_cache_on_web_interactor.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/state/verify_name_view_state.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/model/identity_action_type.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/model/public_assets_in_identity_arguments.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:tmail_ui_user/main/universal_import/html_stub.dart';
|
||||
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'package:worker_manager/worker_manager.dart';
|
||||
@@ -75,6 +85,8 @@ import 'identity_creator_controller_test.mocks.dart';
|
||||
MockSpec<UploadAttachmentInteractor>(),
|
||||
MockSpec<CreatePublicAssetInteractor>(),
|
||||
MockSpec<HtmlDataSourceImpl>(),
|
||||
MockSpec<SaveIdentityCacheOnWebInteractor>(),
|
||||
MockSpec<BeforeReconnectManager>(),
|
||||
])
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
@@ -84,6 +96,7 @@ void main() {
|
||||
late MockGetAllIdentitiesInteractor mockGetAllIdentitiesInteractor;
|
||||
late MockIdentityUtils mockIdentityUtils;
|
||||
late MockDeletePublicAssetsInteractor deletePublicAssetsInteractor;
|
||||
late MockSaveIdentityCacheOnWebInteractor mockSaveIdentityCacheOnWebInteractor;
|
||||
|
||||
late MockCachingManager mockCachingManager;
|
||||
late MockLanguageCacheManager mockLanguageCacheManager;
|
||||
@@ -138,6 +151,7 @@ void main() {
|
||||
mockGetAllIdentitiesInteractor = MockGetAllIdentitiesInteractor();
|
||||
mockIdentityUtils = MockIdentityUtils();
|
||||
deletePublicAssetsInteractor = MockDeletePublicAssetsInteractor();
|
||||
mockSaveIdentityCacheOnWebInteractor = MockSaveIdentityCacheOnWebInteractor();
|
||||
|
||||
Get.put<DioClient>(MockDioClient(), tag: BindingTag.isolateTag);
|
||||
Get.put<Executor>(MockExecutor());
|
||||
@@ -149,16 +163,29 @@ void main() {
|
||||
Get.put<UploadAttachmentInteractor>(MockUploadAttachmentInteractor());
|
||||
Get.put<CreatePublicAssetInteractor>(MockCreatePublicAssetInteractor());
|
||||
Get.put<HtmlDataSourceImpl>(MockHtmlDataSourceImpl(), tag: BindingTag.publicAssetBindingsTag);
|
||||
Get.put<BeforeReconnectManager>(MockBeforeReconnectManager());
|
||||
|
||||
Get.testMode = true;
|
||||
|
||||
identityCreatorController = IdentityCreatorController(
|
||||
mockVerifyNameInteractor,
|
||||
mockGetAllIdentitiesInteractor,
|
||||
mockSaveIdentityCacheOnWebInteractor,
|
||||
mockIdentityUtils);
|
||||
});
|
||||
|
||||
group("IdentityCreatorController test:", () {
|
||||
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'));
|
||||
|
||||
test(
|
||||
'should call deletePublicAssetsInteractor.execute() '
|
||||
'when closeView() is called '
|
||||
@@ -204,16 +231,6 @@ void main() {
|
||||
'and user has not picked any image',
|
||||
() {
|
||||
// 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
|
||||
@@ -235,5 +252,105 @@ void main() {
|
||||
publicAssetIds: anyNamed('publicAssetIds'),
|
||||
));
|
||||
});
|
||||
|
||||
test(
|
||||
'should call saveIdentityCacheOnWebInteractor.execute() '
|
||||
'when screen is reloaded',
|
||||
() async {
|
||||
// arrange
|
||||
PlatformInfo.isTestingForWeb = true;
|
||||
const htmlContent = '<p>test</p>';
|
||||
const identityName = 'test';
|
||||
identityCreatorController.arguments = IdentityCreatorArguments(accountId, session);
|
||||
when(mockVerifyNameInteractor.execute(any, any)).thenAnswer((_) => Right(VerifyNameViewState()));
|
||||
|
||||
// act
|
||||
identityCreatorController.onReady();
|
||||
expect(identityCreatorController.publicAssetController, isNotNull);
|
||||
|
||||
final context = MockBuildContext();
|
||||
identityCreatorController.updateNameIdentity(context, identityName);
|
||||
identityCreatorController.updateContentHtmlEditor(htmlContent);
|
||||
|
||||
identityCreatorController.onUnloadBrowserListener(Event(''));
|
||||
await untilCalled(mockSaveIdentityCacheOnWebInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityCache: anyNamed('identityCache'),
|
||||
));
|
||||
|
||||
// assert
|
||||
verify(mockSaveIdentityCacheOnWebInteractor.execute(
|
||||
accountId,
|
||||
session.username,
|
||||
identityCache: IdentityCache(
|
||||
identity: Identity(
|
||||
name: identityName,
|
||||
bcc: {},
|
||||
replyTo: {},
|
||||
htmlSignature: Signature(htmlContent)
|
||||
),
|
||||
identityActionType: IdentityActionType.create,
|
||||
isDefault: false,
|
||||
publicAssetsInIdentityArguments: PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlContent,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: []
|
||||
)
|
||||
),
|
||||
)).called(1);
|
||||
|
||||
PlatformInfo.isTestingForWeb = false;
|
||||
});
|
||||
|
||||
test(
|
||||
'should call saveIdentityCacheOnWebInteractor.execute() '
|
||||
'when session expires',
|
||||
() async {
|
||||
// arrange
|
||||
PlatformInfo.isTestingForWeb = true;
|
||||
const htmlContent = '<p>test</p>';
|
||||
const identityName = 'test';
|
||||
identityCreatorController.arguments = IdentityCreatorArguments(accountId, session);
|
||||
when(mockVerifyNameInteractor.execute(any, any)).thenAnswer((_) => Right(VerifyNameViewState()));
|
||||
|
||||
// act
|
||||
identityCreatorController.onReady();
|
||||
expect(identityCreatorController.publicAssetController, isNotNull);
|
||||
|
||||
final context = MockBuildContext();
|
||||
identityCreatorController.updateNameIdentity(context, identityName);
|
||||
identityCreatorController.updateContentHtmlEditor(htmlContent);
|
||||
|
||||
identityCreatorController.onBeforeReconnect();
|
||||
await untilCalled(mockSaveIdentityCacheOnWebInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityCache: anyNamed('identityCache'),
|
||||
));
|
||||
|
||||
// assert
|
||||
verify(mockSaveIdentityCacheOnWebInteractor.execute(
|
||||
accountId,
|
||||
session.username,
|
||||
identityCache: IdentityCache(
|
||||
identity: Identity(
|
||||
name: identityName,
|
||||
bcc: {},
|
||||
replyTo: {},
|
||||
htmlSignature: Signature(htmlContent)
|
||||
),
|
||||
identityActionType: IdentityActionType.create,
|
||||
isDefault: false,
|
||||
publicAssetsInIdentityArguments: PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlContent,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: []
|
||||
)
|
||||
),
|
||||
)).called(1);
|
||||
|
||||
PlatformInfo.isTestingForWeb = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user