Files
emergency/test/repositories/emergency_number_repository_test.dart
rootandClaude Sonnet 5 e3aa088bc2 Notrufnummern-Datenbasis, Ländererkennung, State-Management und Lokalisierung (AP1-AP7)
Implementiert den kompletten Kern-Flow der Emergency App gemäß docs/plan.md:
- Notrufnummern-Datenbasis für 199 Länder + Modelle/Repository (AP1)
- DialerService für tel:-Notrufe ohne Auto-Dial (AP2)
- Statisches UI mit Panik-Button-Fallback (AP3)
- Priorisierte Ländererkennung: SIM/Netz -> GPS/Geocoding -> Cache (AP4)
- EmergencyProvider verdrahtet Repository/LocationService mit der UI (AP5)
- Manuelle Länderauswahl als Fallback samt eigener Priorität (AP6)
- UI-Lokalisierung (de/en/fr/es), an erkanntes Land gekoppelt (AP7)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 11:29:38 +02:00

98 lines
3.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:emergency/repositories/emergency_number_repository.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('EmergencyNumberRepository', () {
test('lookup() vor load() liefert null statt Exception', () {
final repository = EmergencyNumberRepository();
expect(repository.isLoaded, isFalse);
expect(repository.lookup('DE'), isNull);
});
test('load() liest das Asset ein und lookup() liefert bekannte Länder', () async {
final repository = EmergencyNumberRepository();
await repository.load();
expect(repository.isLoaded, isTrue);
final germany = repository.lookup('DE');
expect(germany, isNotNull);
expect(germany!.nameEn, 'Germany');
expect(germany.nameDe, 'Deutschland');
expect(germany.numbers.map((e) => e.number), containsAll(['112', '110']));
final us = repository.lookup('US');
expect(us, isNotNull);
expect(us!.nameEn, 'United States');
expect(us.numbers.single.number, '911');
final uk = repository.lookup('GB');
expect(uk, isNotNull);
expect(uk!.nameEn, 'United Kingdom');
expect(uk.numbers.map((e) => e.number), contains('999'));
});
test('lookup() ist case-insensitive', () async {
final repository = EmergencyNumberRepository();
await repository.load();
final lower = repository.lookup('de');
final mixed = repository.lookup('De');
final upper = repository.lookup('DE');
expect(lower, isNotNull);
expect(lower, equals(upper));
expect(mixed, equals(upper));
});
test('lookup() mit unbekanntem Ländercode liefert null', () async {
final repository = EmergencyNumberRepository();
await repository.load();
expect(repository.lookup('ZZ'), isNull);
expect(repository.lookup(''), isNull);
});
test('load() ist idempotent (zweiter Aufruf lädt nicht erneut)', () async {
final repository = EmergencyNumberRepository();
await repository.load();
final firstLookup = repository.lookup('DE');
await repository.load();
final secondLookup = repository.lookup('DE');
expect(firstLookup, equals(secondLookup));
});
});
group('EmergencyNumberRepository.allCountries', () {
test('vor load() liefert eine leere Liste statt Exception', () {
final repository = EmergencyNumberRepository();
expect(repository.allCountries, isEmpty);
});
test('nach load() nicht leer und enthält bekannte Länder (DE/US)', () async {
final repository = EmergencyNumberRepository();
await repository.load();
final countries = repository.allCountries;
expect(countries, isNotEmpty);
expect(countries.map((c) => c.isoCode), containsAll(['DE', 'US']));
});
test('ist alphabetisch nach nameDe sortiert', () async {
final repository = EmergencyNumberRepository();
await repository.load();
final names = repository.allCountries.map((c) => c.nameDe).toList();
final sortedNames = [...names]..sort();
expect(names, equals(sortedNames));
});
});
}