Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Part-VIII] TF-2840 Calendar event reject interactor and controller #2841

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions lib/features/email/domain/state/calendar_event_reject_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:jmap_dart_client/jmap/mail/calendar/reply/calendar_event_reject_response.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart';

class CalendarEventRejecting extends CalendarEventReplying {}

class CalendarEventRejected extends CalendarEventReplySuccess {
final CalendarEventRejectResponse calendarEventRejectResponse;

CalendarEventRejected(this.calendarEventRejectResponse)
: super(calendarEventRejectResponse);
}

class CalendarEventRejectFailure extends CalendarEventReplyFailure {
CalendarEventRejectFailure({super.exception});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart';

class RejectCalendarEventInteractor {
RejectCalendarEventInteractor(this._calendarEventRepository);

final CalendarEventRepository _calendarEventRepository;

Stream<Either<Failure, Success>> execute(
AccountId accountId,
Set<Id> blobIds
) async* {
try {
yield Right(CalendarEventRejecting());
final result = await _calendarEventRepository.rejectEventInvitation(accountId, blobIds);
yield Right(CalendarEventRejected(result));
} catch (e) {
yield Left(CalendarEventRejectFailure(exception: e));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/email/data/repository/calendar_event_repo
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
Expand Down Expand Up @@ -38,6 +39,7 @@ class CalendarEventInteractorBindings extends InteractorsBindings {
Get.lazyPut(() => ParseCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => AcceptCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => MaybeCalendarEventInteractor(Get.find<CalendarEventRepository>()));
Get.lazyPut(() => RejectCalendarEventInteractor(Get.find<CalendarEventRepository>()));
}

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_request.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_accept_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_maybe_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
Expand All @@ -53,6 +54,7 @@ import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_stat
import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
Expand Down Expand Up @@ -127,6 +129,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
ParseCalendarEventInteractor? _parseCalendarEventInteractor;
AcceptCalendarEventInteractor? _acceptCalendarEventInteractor;
MaybeCalendarEventInteractor? _maybeCalendarEventInteractor;
RejectCalendarEventInteractor? _rejectCalendarEventInteractor;

final emailContents = RxnString();
final attachments = <Attachment>[].obs;
Expand Down Expand Up @@ -393,6 +396,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
_parseCalendarEventInteractor = getBinding<ParseCalendarEventInteractor>();
_acceptCalendarEventInteractor = getBinding<AcceptCalendarEventInteractor>();
_maybeCalendarEventInteractor = getBinding<MaybeCalendarEventInteractor>();
_rejectCalendarEventInteractor = getBinding<RejectCalendarEventInteractor>();
}

void _injectCalendarEventBindings(Session? session, AccountId? accountId) {
Expand Down Expand Up @@ -1698,28 +1702,43 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
case EventActionType.maybe:
_maybeCalendarEventAction();
break;
case EventActionType.no:
_rejectCalendarEventAction();
break;
default:
break;
}
}

void _acceptCalendarEventAction() {
if (_acceptCalendarEventInteractor == null
|| _displayingEventBlobId == null
|| mailboxDashBoardController.accountId.value == null) {
consumeState(Stream.value(Left(CalendarEventAcceptFailure())));
|| _displayingEventBlobId == null
|| mailboxDashBoardController.accountId.value == null) {
consumeState(Stream.value(Left(CalendarEventAcceptFailure())));
} else {
consumeState(_acceptCalendarEventInteractor!.execute(
mailboxDashBoardController.accountId.value!,
{_displayingEventBlobId!}));
}
}

void _rejectCalendarEventAction() {
if (_rejectCalendarEventInteractor == null
|| _displayingEventBlobId == null
|| mailboxDashBoardController.accountId.value == null) {
consumeState(Stream.value(Left(CalendarEventRejectFailure())));
} else {
consumeState(_rejectCalendarEventInteractor!.execute(
mailboxDashBoardController.accountId.value!,
{_displayingEventBlobId!}));
}
}

void _maybeCalendarEventAction() {
if (_maybeCalendarEventInteractor == null
|| _displayingEventBlobId == null
|| mailboxDashBoardController.accountId.value == null) {
consumeState(Stream.value(Left(CalendarEventMaybeFailure())));
|| _displayingEventBlobId == null
|| mailboxDashBoardController.accountId.value == null) {
consumeState(Stream.value(Left(CalendarEventMaybeFailure())));
} else {
consumeState(_maybeCalendarEventInteractor!.execute(
mailboxDashBoardController.accountId.value!,
Expand All @@ -1734,6 +1753,14 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
appToast.showToastSuccessMessage(
currentOverlayContext!,
appLocalization.youWillAttendThisMeeting);
} else if (success is CalendarEventMaybeSuccess) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
appLocalization.youMayAttendThisMeeting);
} else if (success is CalendarEventRejected) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
appLocalization.youWillNotAttendThisMeeting);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
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/mail/calendar/properties/event_id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/reply/calendar_event_reject_response.dart';
import 'package:mockito/mockito.dart';
import 'package:tmail_ui_user/features/email/domain/exceptions/calendar_event_exceptions.dart';
import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reject_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart';

import 'calendar_event_accept_interactor_test.mocks.dart';

void main() {
final calendarEventRepository = MockCalendarEventRepository();
final rejectCalendarEventInteractor = RejectCalendarEventInteractor(calendarEventRepository);
final accountId = AccountId(Id('123'));
final blobId = Id('123321');

group('calendar event reject interactor test:', () {
test('should emit CalendarEventRejected when repo return data', () {
// arrange
final calendarEventRejectResponse = CalendarEventRejectResponse(
accountId,
null,
rejected: [EventId(blobId.value)]);
when(calendarEventRepository.rejectEventInvitation(any, any))
.thenAnswer((_) async => calendarEventRejectResponse);

// assert
expect(
rejectCalendarEventInteractor.execute(accountId, {blobId}),
emitsInOrder([
Right(CalendarEventRejecting()),
Right(CalendarEventRejected(calendarEventRejectResponse))]));
});

test('should emit CalendarEventRejectFailure when repo throw exception', () {
// arrange
final exception = NotRejectableCalendarEventException();
when(calendarEventRepository.rejectEventInvitation(any, any)).thenThrow(exception);

// assert
expect(
rejectCalendarEventInteractor.execute(accountId, {blobId}),
emitsInOrder([
Right(CalendarEventRejecting()),
Left(CalendarEventRejectFailure(exception: exception))]));
});
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_s
import 'package:tmail_ui_user/features/email/domain/state/view_attachment_for_web_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_reject_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
Expand Down Expand Up @@ -79,6 +80,7 @@ const fallbackGenerators = {
MockSpec<PrintEmailInteractor>(),
MockSpec<AcceptCalendarEventInteractor>(),
MockSpec<MaybeCalendarEventInteractor>(),
MockSpec<RejectCalendarEventInteractor>(),
])
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
Expand Down Expand Up @@ -322,5 +324,32 @@ void main() {
verify(maybeCalendarEventInteractor.execute(testAccountId, {blobId})).called(1);
});
});

group('reject test:', () {
final rejectCalendarEventInteractor = MockRejectCalendarEventInteractor();

test('should call execute on RejectCalendarEventInteractor '
'when onCalendarEventReplyAction is called on EventActionType.yes', () async {
// arrange
when(mailboxDashboardController.selectedEmail).thenReturn(Rxn(null));
when(mailboxDashboardController.emailUIAction).thenReturn(Rxn(null));
when(mailboxDashboardController.viewState).thenReturn(Rx(Right(UIState.idle)));
singleEmailController.onInit();
Get.put<RejectCalendarEventInteractor>(rejectCalendarEventInteractor);
mailboxDashboardController.accountId.refresh();
singleEmailController.handleSuccessViewState(
ParseCalendarEventSuccess([
BlobCalendarEvent(
blobId: blobId,
calendarEventList: [calendarEvent])]));

// act
singleEmailController.onCalendarEventReplyAction(EventActionType.no);
await untilCalled(rejectCalendarEventInteractor.execute(any, any));

// assert
verify(rejectCalendarEventInteractor.execute(testAccountId, {blobId})).called(1);
});
});
});
}
Loading