From c438352e1148dfd14a76d921905d7b0104e23b6b Mon Sep 17 00:00:00 2001 From: DatDang Date: Mon, 15 Apr 2024 14:42:40 +0700 Subject: [PATCH] TF-2802 Create calendar event accept interactor --- .../state/calendar_event_accept_state.dart | 12 +++++ .../state/calendar_event_reply_state.dart | 18 +++++++ .../calendar_event_accept_interactor.dart | 26 +++++++++ ...calendar_event_accept_interactor_test.dart | 54 +++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 lib/features/email/domain/state/calendar_event_accept_state.dart create mode 100644 lib/features/email/domain/state/calendar_event_reply_state.dart create mode 100644 lib/features/email/domain/usecases/calendar_event_accept_interactor.dart create mode 100644 test/features/email/domain/usecases/calendar_event_accept_interactor_test.dart diff --git a/lib/features/email/domain/state/calendar_event_accept_state.dart b/lib/features/email/domain/state/calendar_event_accept_state.dart new file mode 100644 index 000000000..142cd4be1 --- /dev/null +++ b/lib/features/email/domain/state/calendar_event_accept_state.dart @@ -0,0 +1,12 @@ +import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart'; + +class CalendarEventAccepting extends CalendarEventReplying {} + +class CalendarEventAccepted extends CalendarEventReplySuccess { + + CalendarEventAccepted(super.calendarEventAcceptResponse); +} + +class CalendarEventAcceptFailure extends CalendarEventReplyFailure { + CalendarEventAcceptFailure({super.exception}); +} \ No newline at end of file diff --git a/lib/features/email/domain/state/calendar_event_reply_state.dart b/lib/features/email/domain/state/calendar_event_reply_state.dart new file mode 100644 index 000000000..c2acde6d8 --- /dev/null +++ b/lib/features/email/domain/state/calendar_event_reply_state.dart @@ -0,0 +1,18 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/core/method/response/calendar_event_reply_response.dart'; + +class CalendarEventReplying extends LoadingState {} + +class CalendarEventReplySuccess extends UIState { + final CalendarEventReplyResponse calendarEventReplyResponse; + + CalendarEventReplySuccess(this.calendarEventReplyResponse); + + @override + List get props => [calendarEventReplyResponse]; +} + +class CalendarEventReplyFailure extends FeatureFailure { + CalendarEventReplyFailure({super.exception}); +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart b/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart new file mode 100644 index 000000000..a6d9b41c7 --- /dev/null +++ b/lib/features/email/domain/usecases/calendar_event_accept_interactor.dart @@ -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_accept_state.dart'; + +class AcceptCalendarEventInteractor { + AcceptCalendarEventInteractor(this._calendarEventRepository); + + final CalendarEventRepository _calendarEventRepository; + + Stream> execute( + AccountId accountId, + Set blobIds + ) async* { + try { + yield Right(CalendarEventAccepting()); + final result = await _calendarEventRepository.acceptEventInvitation(accountId, blobIds); + yield Right(CalendarEventAccepted(result)); + } catch (e) { + yield Left(CalendarEventAcceptFailure(exception: e)); + } + } +} \ No newline at end of file diff --git a/test/features/email/domain/usecases/calendar_event_accept_interactor_test.dart b/test/features/email/domain/usecases/calendar_event_accept_interactor_test.dart new file mode 100644 index 000000000..fbf7a6760 --- /dev/null +++ b/test/features/email/domain/usecases/calendar_event_accept_interactor_test.dart @@ -0,0 +1,54 @@ +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_accept_response.dart'; +import 'package:mockito/annotations.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/repository/calendar_event_repository.dart'; +import 'package:tmail_ui_user/features/email/domain/state/calendar_event_accept_state.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/calendar_event_accept_interactor.dart'; + +import 'calendar_event_accept_interactor_test.mocks.dart'; + +@GenerateNiceMocks([MockSpec()]) +void main() { + final calendarEventRepository = MockCalendarEventRepository(); + final acceptCalendarEventInteractor = AcceptCalendarEventInteractor(calendarEventRepository); + final accountId = AccountId(Id('123')); + final blobId = Id('123321'); + + group('calendar event accept interactor test:', () { + test('should emit CalendarEventAccepted when repo return data', () { + // arrange + final calendarEventAcceptResponse = CalendarEventAcceptResponse( + accountId, + null, + accepted: [EventId(blobId.value)]); + when(calendarEventRepository.acceptEventInvitation(any, any)) + .thenAnswer((_) async => calendarEventAcceptResponse); + + // assert + expect( + acceptCalendarEventInteractor.execute(accountId, {blobId}), + emitsInOrder([ + Right(CalendarEventAccepting()), + Right(CalendarEventAccepted(calendarEventAcceptResponse))])); + }); + + test('should emit CalendarEventAcceptFailure when repo throw exception', () { + // arrange + final exception = NotAcceptableCalendarEventException(); + when(calendarEventRepository.acceptEventInvitation(any, any)).thenThrow(exception); + + // assert + expect( + acceptCalendarEventInteractor.execute(accountId, {blobId}), + emitsInOrder([ + Right(CalendarEventAccepting()), + Left(CalendarEventAcceptFailure(exception: exception))])); + }); + }); +} \ No newline at end of file