diff --git a/lib/features/email/domain/state/calendar_event_reject_state.dart b/lib/features/email/domain/state/calendar_event_reject_state.dart new file mode 100644 index 000000000..08929aec4 --- /dev/null +++ b/lib/features/email/domain/state/calendar_event_reject_state.dart @@ -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}); +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart b/lib/features/email/domain/usecases/calendar_event_reject_interactor.dart new file mode 100644 index 000000000..433c2a75f --- /dev/null +++ b/lib/features/email/domain/usecases/calendar_event_reject_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_reject_state.dart'; + +class RejectCalendarEventInteractor { + RejectCalendarEventInteractor(this._calendarEventRepository); + + final CalendarEventRepository _calendarEventRepository; + + Stream> execute( + AccountId accountId, + Set blobIds + ) async* { + try { + yield Right(CalendarEventRejecting()); + final result = await _calendarEventRepository.rejectEventInvitation(accountId, blobIds); + yield Right(CalendarEventRejected(result)); + } catch (e) { + yield Left(CalendarEventRejectFailure(exception: e)); + } + } +} \ No newline at end of file diff --git a/test/features/email/domain/usecases/calendar_event_reject_interactor_test.dart b/test/features/email/domain/usecases/calendar_event_reject_interactor_test.dart new file mode 100644 index 000000000..462d11412 --- /dev/null +++ b/test/features/email/domain/usecases/calendar_event_reject_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_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))])); + }); + }); +} \ No newline at end of file