49 lines
1.6 KiB
Dart
49 lines
1.6 KiB
Dart
|
|
import 'package:flutter_test/flutter_test.dart';
|
||
|
|
import 'package:social_app/features/calendar/data/models/schedule_item_model.dart';
|
||
|
|
import 'package:social_app/features/calendar/reminders/reminder_overlap_policy.dart';
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
final policy = ReminderOverlapPolicy();
|
||
|
|
|
||
|
|
test('groups reminders in same minute bucket', () {
|
||
|
|
final now = DateTime(2026, 3, 18, 15, 40, 0);
|
||
|
|
final eventA = ScheduleItemModel(
|
||
|
|
id: 'a',
|
||
|
|
ownerId: 'u1',
|
||
|
|
title: 'A',
|
||
|
|
startAt: DateTime(2026, 3, 18, 16, 0, 0),
|
||
|
|
endAt: DateTime(2026, 3, 18, 17, 0, 0),
|
||
|
|
metadata: ScheduleMetadata(reminderMinutes: 15),
|
||
|
|
);
|
||
|
|
final eventB = ScheduleItemModel(
|
||
|
|
id: 'b',
|
||
|
|
ownerId: 'u1',
|
||
|
|
title: 'B',
|
||
|
|
startAt: DateTime(2026, 3, 18, 16, 0, 20),
|
||
|
|
endAt: DateTime(2026, 3, 18, 17, 0, 0),
|
||
|
|
metadata: ScheduleMetadata(reminderMinutes: 15),
|
||
|
|
);
|
||
|
|
|
||
|
|
final groups = policy.groupByMinute([eventA, eventB], now: now);
|
||
|
|
expect(groups.length, 1);
|
||
|
|
expect(groups.first.events.length, 2);
|
||
|
|
expect(groups.first.isAggregate, isTrue);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('returns compensation fire time when remindAt already passed', () {
|
||
|
|
final now = DateTime(2026, 3, 18, 15, 50, 0);
|
||
|
|
final event = ScheduleItemModel(
|
||
|
|
id: 'a',
|
||
|
|
ownerId: 'u1',
|
||
|
|
title: 'A',
|
||
|
|
startAt: DateTime(2026, 3, 18, 16, 0, 0),
|
||
|
|
endAt: DateTime(2026, 3, 18, 16, 30, 0),
|
||
|
|
metadata: ScheduleMetadata(reminderMinutes: 15),
|
||
|
|
);
|
||
|
|
|
||
|
|
final fireAt = policy.resolveFirstFireAt(event, now: now);
|
||
|
|
expect(fireAt, isNotNull);
|
||
|
|
expect(fireAt!.isAfter(now), isTrue);
|
||
|
|
});
|
||
|
|
}
|