From 04b37d9173de49d83360283f23790980c296b935 Mon Sep 17 00:00:00 2001 From: Alexis Choupault Date: Fri, 28 Feb 2025 13:54:30 +0100 Subject: [PATCH] create reminder alongside event (#18) * create reminder alongside event * updated readme quick start --- README.md | 6 +- lib/src/eventide.dart | 13 +++- lib/src/eventide_extensions.dart | 16 ++++ lib/src/eventide_platform_interface.dart | 1 + test/eventide_test.dart | 99 ++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd56c6d..ed8918d 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,13 @@ final event = await eventide.createEvent( title: 'Meeting', startDate: DateTime.now(), endDate: DateTime.now().add(Duration(hours: 1)), + reminders: [ + const Duration(hours: 1) + const Duration(minutes: 15), + ], ); -final updatedEvent = await eventide.addReminder( +final updatedEvent = await eventide.deleteReminder( durationBeforeEvent: Duration(minutes: 15), eventId: event.id, ); diff --git a/lib/src/eventide.dart b/lib/src/eventide.dart index 25f1c8c..ddda8ef 100644 --- a/lib/src/eventide.dart +++ b/lib/src/eventide.dart @@ -124,6 +124,7 @@ class Eventide extends EventidePlatform { bool isAllDay = false, String? description, String? url, + List? reminders, }) async { try { final event = await _calendarApi.createEvent( @@ -136,7 +137,17 @@ class Eventide extends EventidePlatform { url: url, ); - return event.toETEvent(); + if (reminders != null) { + for (final reminder in reminders) { + await _calendarApi.createReminder( + reminder: reminder.toNativeDuration(), + eventId: event.id, + ); + } + } + + return event.toETEvent().copyWithReminders(reminders); + } on PlatformException catch (e) { throw e.toETException(); } diff --git a/lib/src/eventide_extensions.dart b/lib/src/eventide_extensions.dart index 744eda0..5ce0672 100644 --- a/lib/src/eventide_extensions.dart +++ b/lib/src/eventide_extensions.dart @@ -44,6 +44,22 @@ extension EventToETEvent on Event { } } +extension ETEventCopy on ETEvent { + ETEvent copyWithReminders(List? reminders) { + return ETEvent( + id: id, + title: title, + isAllDay: isAllDay, + startDate: startDate, + endDate: endDate, + calendarId: calendarId, + description: description, + url: url, + reminders: reminders ?? this.reminders, + ); + } +} + extension AccountToETAccount on Account { ETAccount toETAccount() { return ETAccount( diff --git a/lib/src/eventide_platform_interface.dart b/lib/src/eventide_platform_interface.dart index 0561536..b71ead1 100644 --- a/lib/src/eventide_platform_interface.dart +++ b/lib/src/eventide_platform_interface.dart @@ -43,6 +43,7 @@ abstract class EventidePlatform extends PlatformInterface { required DateTime endDate, String? description, String? url, + List? reminders, }); Future> retrieveEvents({ diff --git a/test/eventide_test.dart b/test/eventide_test.dart index ce6531f..3f37417 100644 --- a/test/eventide_test.dart +++ b/test/eventide_test.dart @@ -250,6 +250,105 @@ void main() { url: any(named: 'url'), )).called(1); }); + + group('iOS tests', () { + setUpAll(() { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + }); + + tearDownAll(() { + debugDefaultTargetPlatformOverride = null; + }); + + test('createEvent with reminders returns an ECEvent with reminders', () async { + // Given + const reminders = [Duration(minutes: 10), Duration(minutes: 20)]; + when(() => mockCalendarApi.createEvent( + title: any(named: 'title'), + isAllDay: any(named: 'isAllDay'), + startDate: any(named: 'startDate'), + endDate: any(named: 'endDate'), + calendarId: any(named: 'calendarId'), + description: any(named: 'description'), + url: any(named: 'url'), + )).thenAnswer((_) async => event); + when(() => mockCalendarApi.createReminder(reminder: any(named: 'reminder'), eventId: any(named: 'eventId'))) + .thenAnswer((_) async => event.copyWithReminders(reminders.toNativeList())); + + // When + final result = await eventide.createEvent( + title: 'Test Event', + startDate: startDate, + endDate: endDate, + calendarId: '1', + reminders: reminders, + ); + + // Then + expect(result.reminders, equals(reminders)); + verify(() => mockCalendarApi.createEvent( + title: any(named: 'title'), + isAllDay: any(named: 'isAllDay'), + startDate: any(named: 'startDate'), + endDate: any(named: 'endDate'), + calendarId: any(named: 'calendarId'), + description: any(named: 'description'), + url: any(named: 'url'), + )).called(1); + verify(() => mockCalendarApi.createReminder(reminder: 10*60, eventId: event.id)).called(1); + verify(() => mockCalendarApi.createReminder(reminder: 20*60, eventId: event.id)).called(1); + }); + }); + + group('Android tests', () { + setUpAll(() { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + }); + + tearDownAll(() { + debugDefaultTargetPlatformOverride = null; + }); + + test('createEvent with reminders returns an ECEvent with reminders', () async { + // Given + const reminders = [Duration(minutes: 10), Duration(minutes: 20)]; + when(() => mockCalendarApi.createEvent( + title: any(named: 'title'), + isAllDay: any(named: 'isAllDay'), + startDate: any(named: 'startDate'), + endDate: any(named: 'endDate'), + calendarId: any(named: 'calendarId'), + description: any(named: 'description'), + url: any(named: 'url'), + )).thenAnswer((_) async => event); + when(() => mockCalendarApi.createReminder(reminder: any(named: 'reminder'), eventId: any(named: 'eventId'))) + .thenAnswer((_) async => event.copyWithReminders(reminders.toNativeList())); + + // When + final result = await eventide.createEvent( + title: 'Test Event', + startDate: startDate, + endDate: endDate, + calendarId: '1', + reminders: reminders, + ); + + // Then + expect(result.reminders, equals(reminders)); + verify(() => mockCalendarApi.createEvent( + title: any(named: 'title'), + isAllDay: any(named: 'isAllDay'), + startDate: any(named: 'startDate'), + endDate: any(named: 'endDate'), + calendarId: any(named: 'calendarId'), + description: any(named: 'description'), + url: any(named: 'url'), + )).called(1); + verify(() => mockCalendarApi.createReminder(reminder: 10, eventId: event.id)).called(1); + verify(() => mockCalendarApi.createReminder(reminder: 20, eventId: event.id)).called(1); + }); + }); + test('retrieveEvents returns a list of ETEvents with reminders', () async { // Given