import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hl_lieferservice/bloc/app_bloc.dart'; import 'package:hl_lieferservice/bloc/app_events.dart'; import 'package:hl_lieferservice/bloc/app_states.dart'; import 'package:hl_lieferservice/data/network/backend_config.dart'; import 'package:hl_lieferservice/data/network/backend_environment.dart'; import 'package:hl_lieferservice/data/network/environment_repository.dart'; import 'package:hl_lieferservice/feature/settings/presentation/environment_settings_page.dart'; /// Liest die echte Asset-Config, speichert die Auswahl im Speicher. class _FakeRepository extends EnvironmentRepository { _FakeRepository(this.selectedId); String? selectedId; @override Future loadCatalog(String assetPath) async => ServerCatalog.fromJson( jsonDecode(File(assetPath).readAsStringSync()) as Map, ); @override Future loadSelectedId() async => selectedId; @override Future saveSelectedId(String id) async => selectedId = id; } void main() { late _FakeRepository repo; late List activated; late AppBloc bloc; setUp(() { repo = _FakeRepository(null); activated = []; bloc = AppBloc(repository: repo, activate: activated.add); }); tearDown(() => bloc.close()); test('ohne gespeicherte Wahl startet die Default-Umgebung', () async { bloc.add(AppLoadConfig(path: 'hl_server_config.json')); final state = await bloc.stream.firstWhere((s) => s is AppConfigLoaded) as AppConfigLoaded; expect(state.active.id, 'production'); expect(activated.single.apiBaseUrl, 'http://192.168.1.9:3000'); }); test('gespeicherte, aber unbekannte Umgebung fällt auf Default', () async { repo.selectedId = 'gibt-es-nicht'; bloc.add(AppLoadConfig(path: 'hl_server_config.json')); final state = await bloc.stream.firstWhere((s) => s is AppConfigLoaded) as AppConfigLoaded; expect(state.active.id, 'production'); }); testWidgets('Card antippen wechselt Umgebung, speichert und schließt', (tester) async { await tester.runAsync(() async { bloc.add(AppLoadConfig(path: 'hl_server_config.json')); await bloc.stream.firstWhere((s) => s is AppConfigLoaded); }); await tester.pumpWidget( BlocProvider.value( value: bloc, child: MaterialApp( home: Builder( builder: (context) => Scaffold( body: TextButton( onPressed: () => Navigator.of(context).push( MaterialPageRoute( builder: (_) => const EnvironmentSettingsPage(), ), ), child: const Text('open'), ), ), ), ), ), ); await tester.tap(find.text('open')); await tester.pumpAndSettle(); // Beide Umgebungen aus der Config als Card mit Name + IP:Port. expect(find.text('Produktion'), findsOneWidget); expect(find.text('192.168.1.9:3000'), findsOneWidget); expect(find.text('Testumgebung'), findsOneWidget); expect(find.text('192.168.1.9:3001'), findsOneWidget); expect(find.byIcon(Icons.check_circle), findsOneWidget); await tester.tap(find.text('Testumgebung')); await tester.runAsync( () => bloc.stream.firstWhere( (s) => s is AppConfigLoaded && s.active.id == 'test', ), ); await tester.pumpAndSettle(); expect(find.byType(EnvironmentSettingsPage), findsNothing); expect(repo.selectedId, 'test'); expect(activated.last.apiBaseUrl, 'http://192.168.1.9:3001'); }); }