From 903440e37ddd3a53cd2438d6a26ba78e4d8e823e Mon Sep 17 00:00:00 2001 From: hieubt Date: Sun, 4 Feb 2024 00:55:22 +0700 Subject: [PATCH] TF-2502 Write unit test for all day event --- .../extensions/calendar_event_extension.dart | 58 ++++++++++++++----- .../calendar_event_extension_test.dart | 44 ++++++++++++++ 2 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 test/features/features/email/presentation/extensions/calendar_event_extension_test.dart diff --git a/lib/features/email/presentation/extensions/calendar_event_extension.dart b/lib/features/email/presentation/extensions/calendar_event_extension.dart index d955a3b2d..2455ba965 100644 --- a/lib/features/email/presentation/extensions/calendar_event_extension.dart +++ b/lib/features/email/presentation/extensions/calendar_event_extension.dart @@ -272,21 +272,53 @@ extension CalendarEventExtension on CalendarEvent { ); } - String get dateTimeEventAsString { + bool get isAllDayEvent { if (startUtcDate != null && endUtcDate != null) { - final startHour = startUtcDate!.value.hour; - final startMinute = startUtcDate!.value.minute; - final endHour = endUtcDate!.value.hour; - final endMinute = endUtcDate!.value.minute; - log('CalendarEventExtension::endDate: $endUtcDate'); - if (startHour == 0 && startMinute == 0 && endHour == 0 && endMinute == 0 && !DateUtils.isSameDay(localStartDate, localEndDate)) { - final timeZoneOffset = DateTime.now().timeZoneOffset.inHours; - final timeZoneOffsetAsString = timeZoneOffset >= 0 ? '+$timeZoneOffset' : '$timeZoneOffset'; - final timeStart = formatDate(AppUtils.getCurrentDateLocale(), startUtcDate!.value); - final timeEnd = formatDate(AppUtils.getCurrentDateLocale(), endUtcDate!.value); - return '$timeStart - $timeEnd (GMT$timeZoneOffsetAsString)'; - } + final startDateValue = startUtcDate!.value; + final endDateValue = endUtcDate!.value; + + final eventDurationInHours = startDateValue.difference(endDateValue).inHours; + + final startHour = startDateValue.hour; + final startMinute = startDateValue.minute; + final startSecond = startDateValue.second; + + final endHour = endDateValue.hour; + final endMinute = endDateValue.minute; + final endSecond = endDateValue.second; + + return startHour == 0 + && startMinute == 0 + && startSecond == 0 + && endHour == 0 + && endMinute == 0 + && endSecond == 0 + && eventDurationInHours % 24 == 0; } + return false; + } + + String dateTimeStringForAllDayEvent(DateTime startDate, DateTime endDate) { + final timeZoneOffset = DateTime.now().timeZoneOffset.inHours; + final timeZoneOffsetAsString = timeZoneOffset >= 0 ? '+$timeZoneOffset' : '$timeZoneOffset'; + + final dateStart = formatDate(AppUtils.getCurrentDateLocale(), startDate); + + final endDateToDisplay = endDate.subtract(const Duration(days: 1)); + final dateEnd = formatDate(AppUtils.getCurrentDateLocale(), endDateToDisplay); + + if (DateUtils.isSameDay(startDate, endDateToDisplay)) { + return '$dateStart (GMT$timeZoneOffsetAsString)'; + } else { + return '$dateStart - $dateEnd (GMT$timeZoneOffsetAsString)'; + } + } + + String get dateTimeEventAsString { + if (isAllDayEvent) { + return dateTimeStringForAllDayEvent(startUtcDate!.value, endUtcDate!.value); + } + if (localStartDate != null && localEndDate != null) { final timeStart = formatDateTime(localStartDate!); final timeEnd = DateUtils.isSameDay(localStartDate, localEndDate) diff --git a/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart b/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart new file mode 100644 index 000000000..5e52a74a6 --- /dev/null +++ b/test/features/features/email/presentation/extensions/calendar_event_extension_test.dart @@ -0,0 +1,44 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/core/utc_date.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; +import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; + +void main() { + group('calendar event extension test', () { + test('dateTimeEventAsString should return string with format start date - end date (timezone offset) and date formatted as DD, MM dd, YYYY for all-day event for many days', () { + const expectedFormattedDateString = 'Sunday, October 10, 2021 - Sunday, October 24, 2021 (GMT+0)'; + + final startDate = DateTime(2021, 10, 10, 00, 00, 00, 00, 00); + final endDate = DateTime(2021, 10, 25, 00, 00, 00, 00, 00); + + final calendarEvent = CalendarEvent( + startDate: startDate, + endDate: endDate, + startUtcDate: UTCDate(startDate), + endUtcDate: UTCDate(endDate), + ); + + final formattedDateString = calendarEvent.dateTimeEventAsString; + + expect(formattedDateString, expectedFormattedDateString); + }); + + test('dateTimeEventAsString should return string with format date (timezone offset) and date formatted as DD, MM dd, YYYY for all-day event for one day', () { + const expectedFormattedDateString = 'Sunday, October 10, 2021 (GMT+0)'; + + final startDate = DateTime(2021, 10, 10, 00, 00, 00, 00, 00); + final endDate = DateTime(2021, 10, 11, 00, 00, 00, 00, 00); + + final calendarEvent = CalendarEvent( + startDate: startDate, + endDate: endDate, + startUtcDate: UTCDate(startDate), + endUtcDate: UTCDate(endDate), + ); + + final formattedDateString = calendarEvent.dateTimeEventAsString; + + expect(formattedDateString, expectedFormattedDateString); + }); + }); +} \ No newline at end of file