Generiert vom Lianko-Agent für konsistente Unit Tests über alle Repos.
Datei: lib/models/child.dart
Speichern in: test/models/child_test.dart
Beschreibung: Kind-Model mit allen Einstellungen
-
Childcreate()- Factory für neues KindfromFirestore()- Parsed Firestore DocumenttoFirestore()- Konvertiert zu Firestore MapcopyWith()- Erstellt Kopie mit Änderungen
-
GameSettingsfromMap()/toMap()copyWith()
- create() setzt parentCodeExpiresAt auf +7 Tage
- create() generiert Default TimeLimit
- fromFirestore parsed alle Felder
- fromFirestore mit fehlenden Feldern gibt Defaults
- toFirestore/fromFirestore Roundtrip
- copyWith ändert nur angegebene Felder
- GameSettings Defaults sind korrekt
- Leere linkedDeviceIds
- Null avatarUrl
- Leere gameSettings Map
- Timestamp Conversion
test('create() setzt parentCodeExpiresAt korrekt', () {
final now = DateTime.now();
final child = Child.create(
id: 'test-id',
name: 'Max',
age: 6,
parentCode: 'ABC123',
);
expect(child.parentCodeExpiresAt.isAfter(now.add(Duration(days: 6))), isTrue);
});Datei: lib/models/time_limit.dart
Speichern in: test/models/time_limit_test.dart
Beschreibung: Zeitlimit-Einstellungen für Kinder
-
TimeLimitdefaultLimit()- Factory für Standard-LimitsfromMap()/toMap()isCurrentlyBedtime()- Prüft SchlafenszeitgetLimitForDay()- Gibt Limit für Wochentag
-
TimeOfDayformat()- Formatiert als HH:MM
- defaultLimit hat korrekte Werte
- isCurrentlyBedtime erkennt Schlafenszeit
- isCurrentlyBedtime funktioniert über Mitternacht
- getLimitForDay gibt weekdayLimits wenn gesetzt
- getLimitForDay gibt dailyMinutes als Fallback
- TimeOfDay.format() formatiert korrekt
- bedtimeEnabled = false
- Schlafenszeit genau über Mitternacht (20:00 - 07:00)
- Schlafenszeit am selben Tag (13:00 - 15:00)
- Leere weekdayLimits
test('isCurrentlyBedtime erkennt Schlafenszeit über Mitternacht', () {
final limit = TimeLimit(
bedtimeStart: TimeOfDay(hour: 20, minute: 0),
bedtimeEnd: TimeOfDay(hour: 7, minute: 0),
bedtimeEnabled: true,
);
// Test um 22:00 - sollte Schlafenszeit sein
// Test um 10:00 - sollte KEINE Schlafenszeit sein
});
test('TimeOfDay.format() formatiert korrekt', () {
expect(TimeOfDay(hour: 8, minute: 5).format(), equals('08:05'));
expect(TimeOfDay(hour: 20, minute: 30).format(), equals('20:30'));
});Datei: lib/models/accessibility_settings.dart
Speichern in: test/models/accessibility_settings_test.dart
Beschreibung: Barrierefreiheit-Einstellungen (Untertitel)
-
AccessibilitySettingsfromMap()/toMap()copyWith()currentLanguageName- Gibt Sprachname zurück
-
SubtitleLanguage- Statische Daten
- Default subtitlesEnabled ist false
- currentLanguageName gibt korrekten Namen
- availableLanguages enthält alle erwarteten Sprachen
- fromMap mit fehlenden Feldern gibt Defaults
- subtitleLanguage mit ungültigem Code
test('currentLanguageName gibt korrekten Namen', () {
final settings = AccessibilitySettings(
subtitlesEnabled: true,
subtitleLanguage: 'de',
);
expect(settings.currentLanguageName, equals('Deutsch'));
});Datei: lib/services/pin_service.dart
Speichern in: test/services/pin_service_test.dart
Beschreibung: PIN-Schutz für Eltern-Dashboard
-
PinServiceisPinEnabled()- Prüft ob PIN aktiviertisLockedOut()- Prüft ob gesperrtgetRemainingLockoutSeconds()- Verbleibende SperrzeitgetRemainingAttempts()- Verbleibende VersuchesetPin()- Setzt neuen PINverifyPin()- Verifiziert PINchangePin()- Ändert PINdisablePin()- Deaktiviert PIN
-
PinVerificationResult- Factory Methods: success(), wrongPin(), lockedOut(), noPinSet()
- setPin akzeptiert nur 4 Ziffern
- setPin hasht PIN korrekt
- verifyPin gibt success bei korrektem PIN
- verifyPin gibt wrongPin bei falschem PIN
- verifyPin zählt Fehlversuche
- Nach 5 Fehlversuchen: lockout für 15 Min
- isLockedOut wird nach Ablauf automatisch zurückgesetzt
- changePin benötigt korrekten alten PIN
- disablePin benötigt korrekten PIN
- PIN = "0000" (gültig)
- PIN mit Buchstaben (ungültig)
- PIN mit weniger/mehr als 4 Zeichen
- Lockout genau abgelaufen
test('setPin akzeptiert nur 4 Ziffern', () async {
final prefs = MockSharedPreferences();
final service = PinService(prefs);
expect(await service.setPin('1234'), isTrue);
expect(await service.setPin('123'), isFalse); // Zu kurz
expect(await service.setPin('12345'), isFalse); // Zu lang
expect(await service.setPin('abcd'), isFalse); // Keine Ziffern
});
test('verifyPin sperrt nach 5 Fehlversuchen', () async {
// 5x falscher PIN eingeben
// Dann prüfen ob isLockedOut() true ist
});- Mock für SharedPreferences
Datei: lib/services/children_service.dart
Speichern in: test/services/children_service_test.dart
Beschreibung: CRUD für Kinder in Firestore
ChildrenServicewatchChildren()- Stream von KinderngetChild()- Einzelnes Kind ladencreateChild()- Kind erstellenupdateChild()- Kind aktualisierendeleteChild()- Kind löschenupdateTimeLimit()- Zeitlimit aktualisierenupdateGameSettings()- Spieleinstellungen aktualisierenregenerateParentCode()- Neuen ParentCode generierenunlinkDevice()- Gerät entfernen
- createChild generiert einzigartigen ParentCode
- createChild speichert in Firestore
- getChild gibt null bei nicht existierendem Kind
- updateTimeLimit aktualisiert nur timeLimit Feld
- unlinkDevice entfernt deviceId aus Array
- Kind existiert nicht
- Firestore Fehler
test('createChild generiert einzigartigen ParentCode', () async {
// Mock Firestore und ParentCodeService
// createChild aufrufen
// Prüfen dass ParentCode generiert wurde
});- Mock für FirebaseFirestore
- Mock für ParentCodeService
Datei: lib/services/notification_service.dart
Speichern in: test/services/notification_service_test.dart
Beschreibung: Push Notifications für Eltern
NotificationServiceinitialize()- Initialisiert ServiceshowLocalNotification()- Zeigt lokale NotificationgetToken()- Holt FCM TokensubscribeToTopic()/unsubscribeFromTopic()subscribeToChild()/unsubscribeFromChild()
- initialize wird nur einmal ausgeführt
- subscribeToChild subscribed zu 'child_{id}' Topic
- showLocalNotification zeigt Notification
- Permissions nicht erteilt
- FCM Token null
- Mock für FirebaseMessaging
- Mock für FlutterLocalNotificationsPlugin
- Mock für FirebaseFirestore
- Mock für FirebaseAuth
Datei: lib/providers/children_provider.dart
Speichern in: test/providers/children_provider_test.dart
Beschreibung: State Management für Kinder
- Provider lädt Kinder korrekt
- Provider reagiert auf Auth-Änderungen
Datei: lib/providers/pin_provider.dart
Speichern in: test/providers/pin_provider_test.dart
Beschreibung: State Management für PIN
- Provider Status nach Lock/Unlock
| Modul | Priorität | Komplexität |
|---|---|---|
| Child Model | Hoch | Niedrig |
| TimeLimit Model | Hoch | Mittel |
| AccessibilitySettings | Mittel | Niedrig |
| PinService | Hoch | Mittel |
| ChildrenService | Hoch | Hoch (Firestore) |
| NotificationService | Mittel | Hoch (ext. APIs) |