TF-3042 Unit test clean up public assets interactor
This commit is contained in:
+461
@@ -0,0 +1,461 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.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/identities/identity.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.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/domain/state/add_identity_to_public_assets_state.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/state/delete_public_assets_state.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/state/remove_identity_from_public_assets_state.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/add_identity_to_public_assets_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/clean_up_public_assets_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/delete_public_assets_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/public_asset/domain/usecase/remove_identity_from_public_assets_interactor.dart';
|
||||
|
||||
import 'clean_up_public_assets_interactor_test.mocks.dart';
|
||||
|
||||
@GenerateNiceMocks([
|
||||
MockSpec<RemoveIdentityFromPublicAssetsInteractor>(),
|
||||
MockSpec<DeletePublicAssetsInteractor>(),
|
||||
MockSpec<AddIdentityToPublicAssetsInteractor>(),
|
||||
MockSpec<Session>(),
|
||||
MockSpec<AccountId>(),
|
||||
])
|
||||
void main() {
|
||||
final removeIdentityFromPublicAssetsInteractor = MockRemoveIdentityFromPublicAssetsInteractor();
|
||||
final deletePublicAssetsInteractor = MockDeletePublicAssetsInteractor();
|
||||
final addIdentityToPublicAssetsInteractor = MockAddIdentityToPublicAssetsInteractor();
|
||||
final cleanUpPublicAssetsInteractor = CleanUpPublicAssetsInteractor(
|
||||
removeIdentityFromPublicAssetsInteractor,
|
||||
deletePublicAssetsInteractor,
|
||||
addIdentityToPublicAssetsInteractor,
|
||||
);
|
||||
|
||||
group('clean up public assets interactor test:', () {
|
||||
final session = MockSession();
|
||||
final accountId = MockAccountId();
|
||||
|
||||
test(
|
||||
'should destroy unused public assets '
|
||||
'when there are picked public assets that are deleted',
|
||||
() async {
|
||||
// arrange
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
const identityActionType = IdentityActionType.edit;
|
||||
final toBeUsedPublicAssetId = Id('public-asset-1');
|
||||
final toBeDeletedPublicAssetId = Id('public-asset-2');
|
||||
final newlyPickedPublicAssetIds = [toBeUsedPublicAssetId, toBeDeletedPublicAssetId];
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${toBeUsedPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: newlyPickedPublicAssetIds);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verify(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
publicAssetIds: [toBeDeletedPublicAssetId])
|
||||
).called(1);
|
||||
verifyNever(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verifyNever(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'should remove reference of unused public assets '
|
||||
'when there are existing public assets that are deleted',
|
||||
() async {
|
||||
// arrange
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
const identityActionType = IdentityActionType.edit;
|
||||
final toBeUsedPublicAssetId = Id('public-asset-1');
|
||||
final toBeDeletedPublicAssetId = Id('public-asset-2');
|
||||
final preExistingPublicAssetIds = [toBeUsedPublicAssetId, toBeDeletedPublicAssetId];
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${toBeUsedPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: preExistingPublicAssetIds,
|
||||
newlyPickedPublicAssetIds: []);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verifyNever(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verify(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: [toBeDeletedPublicAssetId])
|
||||
).called(1);
|
||||
verifyNever(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'should add reference to public assets '
|
||||
'when there are new public assets '
|
||||
'and identity action is create',
|
||||
() async {
|
||||
// arrange
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
const identityActionType = IdentityActionType.create;
|
||||
final newlyPickedPublicAssetIds = [Id('public-asset-1')];
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${newlyPickedPublicAssetIds[0].value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: newlyPickedPublicAssetIds);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verifyNever(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verifyNever(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verify(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: newlyPickedPublicAssetIds)
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'should add reference to public assets '
|
||||
'when there are new public assets '
|
||||
'and those new public assets are pasted to signature',
|
||||
() async {
|
||||
// arrange
|
||||
const identityActionType = IdentityActionType.create;
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
final pastedPublicAssetId = Id('public-asset-1');
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${pastedPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: []);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verifyNever(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verifyNever(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verify(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: [pastedPublicAssetId])
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'should do nothing '
|
||||
'when there is no new public assets '
|
||||
'and there is no change in old public assets '
|
||||
'and there is no pasted public assets in signature',
|
||||
() async {
|
||||
// arrange
|
||||
const identityActionType = IdentityActionType.create;
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
final oldPublicAssetId = Id('public-asset-1');
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${oldPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [oldPublicAssetId],
|
||||
newlyPickedPublicAssetIds: []);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verifyNever(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verifyNever(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verifyNever(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
});
|
||||
|
||||
test(
|
||||
'should destroy unused public assets '
|
||||
'when there are picked public assets that are deleted '
|
||||
'and add reference to public assets '
|
||||
'when there are new public assets '
|
||||
'and identity action is create'
|
||||
'and add reference to public assets '
|
||||
'when there are new public assets '
|
||||
'and those new public assets are pasted to signature',
|
||||
() async {
|
||||
// arrange
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
const identityActionType = IdentityActionType.create;
|
||||
final toBeUsedNewlyPickedPublicAssetId = Id('public-asset-1');
|
||||
final toBeDeletedNewlyPickedPublicAssetId = Id('public-asset-2');
|
||||
final newlyPickedPublicAssetIds = [
|
||||
toBeUsedNewlyPickedPublicAssetId,
|
||||
toBeDeletedNewlyPickedPublicAssetId
|
||||
];
|
||||
final pastedPublicAssetId = Id('public-asset-3');
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${toBeUsedNewlyPickedPublicAssetId.value}"/>'
|
||||
'<img src="public-asset-3" public-asset-id="${pastedPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [],
|
||||
newlyPickedPublicAssetIds: newlyPickedPublicAssetIds);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verify(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
publicAssetIds: [toBeDeletedNewlyPickedPublicAssetId])
|
||||
).called(1);
|
||||
verifyNever(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
any,
|
||||
any,
|
||||
identityId: anyNamed('identityId'),
|
||||
publicAssetIds: anyNamed('publicAssetIds'))
|
||||
);
|
||||
verify(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: [pastedPublicAssetId, toBeUsedNewlyPickedPublicAssetId])
|
||||
).called(1);
|
||||
});
|
||||
|
||||
test(
|
||||
'should destroy unused public assets '
|
||||
'when there are picked public assets that are deleted '
|
||||
'and remove reference to public assets '
|
||||
'when there are old public assets that are deleted '
|
||||
'and add reference to public assets '
|
||||
'when there are new public assets '
|
||||
'and those new public assets are pasted to signature',
|
||||
() async {
|
||||
// arrange
|
||||
final identityId = IdentityId(Id('id-1'));
|
||||
const identityActionType = IdentityActionType.edit;
|
||||
final toBeUsedNewlyPickedPublicAssetId = Id('public-asset-1');
|
||||
final toBeDeletedNewlyPickedPublicAssetId = Id('public-asset-2');
|
||||
final newlyPickedPublicAssetIds = [
|
||||
toBeUsedNewlyPickedPublicAssetId,
|
||||
toBeDeletedNewlyPickedPublicAssetId
|
||||
];
|
||||
final toBeDeletedPreExistingPublicAssetId = Id('public-asset-3');
|
||||
final pastedPublicAssetId = Id('public-asset-4');
|
||||
final htmlSignature = '<img src="public-asset-1" public-asset-id="${toBeUsedNewlyPickedPublicAssetId.value}"/>'
|
||||
'<img src="public-asset-4" public-asset-id="${pastedPublicAssetId.value}"/>';
|
||||
final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
|
||||
htmlSignature: htmlSignature,
|
||||
preExistingPublicAssetIds: [toBeDeletedPreExistingPublicAssetId],
|
||||
newlyPickedPublicAssetIds: newlyPickedPublicAssetIds);
|
||||
|
||||
when(deletePublicAssetsInteractor
|
||||
.execute(any, any, publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(DeletePublicAssetsSuccessState())));
|
||||
when(removeIdentityFromPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(RemoveIdentityFromPublicAssetsSuccessState())));
|
||||
when(addIdentityToPublicAssetsInteractor
|
||||
.execute(any, any, identityId: anyNamed('identityId'), publicAssetIds: anyNamed('publicAssetIds')))
|
||||
.thenAnswer((_) => Stream.value(Right(AddIdentityToPublicAssetsSuccessState())));
|
||||
|
||||
// act
|
||||
await cleanUpPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
identityActionType: identityActionType,
|
||||
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments).last;
|
||||
|
||||
// assert
|
||||
verify(
|
||||
deletePublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
publicAssetIds: [toBeDeletedNewlyPickedPublicAssetId])
|
||||
).called(1);
|
||||
verify(
|
||||
removeIdentityFromPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: [toBeDeletedPreExistingPublicAssetId])
|
||||
).called(1);
|
||||
verify(
|
||||
addIdentityToPublicAssetsInteractor.execute(
|
||||
session,
|
||||
accountId,
|
||||
identityId: identityId,
|
||||
publicAssetIds: [pastedPublicAssetId])
|
||||
).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user