Files
habo/test/services/notification_service_test.dart
dazhuang aa69f2a91e feat: initial commit - Habo habit tracking app
- Complete MVP with Repository Pattern, SQLite storage
- Provider + ChangeNotifier state management
- Navigation 2.0 with deep link support
- Habit CRUD with twoDayRule, notifications, categories
- Backup/Restore via JSON
- Statistics with streak tracking
- Material You theme support
- Biometric lock support
- Desktop widget support
- 27 languages i18n structure
- Comprehensive test suite (87/89 passing)
2026-04-13 15:02:30 +00:00

147 lines
4.7 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:habo/services/notification_service.dart';
import 'package:habo/habits/habit.dart';
import 'package:habo/model/habit_data.dart';
import 'package:habo/constants.dart';
import 'dart:collection';
void main() {
group('NotificationService', () {
late NotificationService notificationService;
setUp(() {
notificationService = NotificationService();
});
test('should create instance successfully', () {
expect(notificationService, isNotNull);
});
test('resetNotifications should handle empty habits list', () {
expect(() => notificationService.resetNotifications([]), returnsNormally);
});
test('removeNotifications should handle empty habits list', () {
expect(
() => notificationService.removeNotifications([]), returnsNormally);
});
test('setHabitNotification should delegate to global function', () {
// This test verifies the method exists and can be called
expect(
() => notificationService.setHabitNotification(
1,
const TimeOfDay(hour: 9, minute: 0),
'Test Title',
'Test Description'),
returnsNormally);
});
test('disableHabitNotification should delegate to global function', () {
// This test verifies the method exists and can be called
expect(() => notificationService.disableHabitNotification(1),
returnsNormally);
});
test('handleHabitEventAdded should handle habit completion today', () {
final now = DateTime.now();
final today = DateTime(now.year, now.month, now.day);
final event = [DayType.check];
// This test verifies the method exists and can be called
expect(() => notificationService.handleHabitEventAdded(1, today, event),
returnsNormally);
});
test(
'handleHabitEventAdded should handle habit completion on different day',
() {
final yesterday = DateTime.now().subtract(const Duration(days: 1));
final event = [DayType.check];
// This test verifies the method exists and can be called
expect(
() => notificationService.handleHabitEventAdded(1, yesterday, event),
returnsNormally);
});
test('handleHabitEventDeleted should handle event deletion today', () {
final now = DateTime.now();
final today = DateTime(now.year, now.month, now.day);
// This test verifies the method exists and can be called
expect(() => notificationService.handleHabitEventDeleted(1, today),
returnsNormally);
});
test(
'handleHabitEventDeleted should handle event deletion on different day',
() {
final yesterday = DateTime.now().subtract(const Duration(days: 1));
// This test verifies the method exists and can be called
expect(() => notificationService.handleHabitEventDeleted(1, yesterday),
returnsNormally);
});
group('with sample habits', () {
late List<Habit> sampleHabits;
setUp(() {
sampleHabits = [
Habit(
habitData: HabitData(
id: 1,
position: 0,
title: 'Test Habit 1',
twoDayRule: false,
cue: 'Test cue',
routine: 'Test routine',
reward: 'Test reward',
showReward: false,
advanced: false,
events: SplayTreeMap<DateTime, List>(),
notification: true,
notTime: const TimeOfDay(hour: 9, minute: 0),
sanction: '',
showSanction: false,
accountant: '',
),
),
Habit(
habitData: HabitData(
id: 2,
position: 1,
title: 'Test Habit 2',
twoDayRule: false,
cue: 'Test cue 2',
routine: 'Test routine 2',
reward: 'Test reward 2',
showReward: false,
advanced: false,
events: SplayTreeMap<DateTime, List>(),
notification: false,
notTime: const TimeOfDay(hour: 10, minute: 0),
sanction: '',
showSanction: false,
accountant: '',
),
),
];
});
test('resetNotifications should handle habits with notifications enabled',
() {
expect(() => notificationService.resetNotifications(sampleHabits),
returnsNormally);
});
test('removeNotifications should handle multiple habits', () {
expect(() => notificationService.removeNotifications(sampleHabits),
returnsNormally);
});
});
});
}