00f37d7e19
- 新增 ReminderActionExecutor 处理取消/稍后提醒操作 - 新增 ReminderOutboxStore 本地存储待处理操作 - 重构 LocalNotificationService 支持聚合提醒和交互操作 - 新增 event_color_resolver 工具类统一颜色解析 - 新增 CalendarService.archiveEvent 归档方法 - 增强 ModelTracking 支持缓存命中、推理token和成本追踪 - 添加 qwen3.5-35b-a3b 模型配置 - 更新 AndroidManifest 全屏intent权限 - 补充相关单元测试和文档
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);
|
|
});
|
|
}
|