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>
98 lines
3.1 KiB
Dart
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));
|
|
});
|
|
});
|
|
}
|