diff --git a/lib/features/email/domain/state/calendar_event_maybe_state.dart b/lib/features/email/domain/state/calendar_event_maybe_state.dart new file mode 100644 index 000000000..c6a0ff793 --- /dev/null +++ b/lib/features/email/domain/state/calendar_event_maybe_state.dart @@ -0,0 +1,15 @@ +import 'package:jmap_dart_client/jmap/mail/calendar/reply/calendar_event_maybe_response.dart'; +import 'package:tmail_ui_user/features/email/domain/state/calendar_event_reply_state.dart'; + +class CalendarEventMaybeReplying extends CalendarEventReplying {} + +class CalendarEventMaybeSuccess extends CalendarEventReplySuccess { + final CalendarEventMaybeResponse calendarEventMaybeResponse; + + CalendarEventMaybeSuccess(this.calendarEventMaybeResponse) + : super(calendarEventMaybeResponse); +} + +class CalendarEventMaybeFailure extends CalendarEventReplyFailure { + CalendarEventMaybeFailure({super.exception}); +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart b/lib/features/email/domain/usecases/maybe_calendar_event_interactor.dart new file mode 100644 index 000000000..e5f593907 --- /dev/null +++ b/lib/features/email/domain/usecases/maybe_calendar_event_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_maybe_state.dart'; + +class MaybeCalendarEventInteractor { + MaybeCalendarEventInteractor(this._calendarEventRepository); + + final CalendarEventRepository _calendarEventRepository; + + Stream> execute( + AccountId accountId, + Set blobIds + ) async* { + try { + yield Right(CalendarEventMaybeReplying()); + final result = await _calendarEventRepository.maybeEventInvitation(accountId, blobIds); + yield Right(CalendarEventMaybeSuccess(result)); + } catch (e) { + yield Left(CalendarEventMaybeFailure(exception: e)); + } + } +} \ No newline at end of file diff --git a/test/features/email/domain/usecases/maybe_calendar_event_interactor_test.dart b/test/features/email/domain/usecases/maybe_calendar_event_interactor_test.dart new file mode 100644 index 000000000..90cd57798 --- /dev/null +++ b/test/features/email/domain/usecases/maybe_calendar_event_interactor_test.dart @@ -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_maybe_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_maybe_state.dart'; +import 'package:tmail_ui_user/features/email/domain/usecases/maybe_calendar_event_interactor.dart'; + +import 'calendar_event_accept_interactor_test.mocks.dart'; + +void main() { + final calendarEventRepository = MockCalendarEventRepository(); + final maybeCalendarEventInteractor = MaybeCalendarEventInteractor(calendarEventRepository); + final accountId = AccountId(Id('123')); + final blobId = Id('123321'); + + group('calendar event maybe interactor should emit expected states', () { + test('when repo return data', () { + // arrange + final calendarEventMaybeResponse = CalendarEventMaybeResponse( + accountId, + null, + maybe: [EventId(blobId.value)]); + when(calendarEventRepository.maybeEventInvitation(any, any)) + .thenAnswer((_) async => calendarEventMaybeResponse); + + // assert + expect( + maybeCalendarEventInteractor.execute(accountId, {blobId}), + emitsInOrder([ + Right(CalendarEventMaybeReplying()), + Right(CalendarEventMaybeSuccess(calendarEventMaybeResponse))])); + }); + + test('when repo throw exception', () { + // arrange + final exception = NotMaybeableCalendarEventException(); + when(calendarEventRepository.maybeEventInvitation(any, any)).thenThrow(exception); + + // assert + expect( + maybeCalendarEventInteractor.execute(accountId, {blobId}), + emitsInOrder([ + Right(CalendarEventMaybeReplying()), + Left(CalendarEventMaybeFailure(exception: exception))])); + }); + }); +} \ No newline at end of file