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/feature/feature_flags/feature.dart'; import 'package:hl_lieferservice/feature/feature_flags/feature_flags.dart'; import 'package:hl_lieferservice/feature/feature_flags/feature_gate.dart'; Map _asset() => jsonDecode(File('assets/feature_flags.json').readAsStringSync()) as Map; void main() { group('assets/feature_flags.json', () { test('enthält jeden Feature-Key genau so, wie er im Code steht', () { final keys = (_asset()['features'] as Map).keys.toSet(); for (final f in Feature.values) { expect(keys, contains(f.key), reason: 'Key fehlt: ${f.key}'); } }); test('Gutschriften-Abschnitt ist aktuell deaktiviert', () { final flags = FeatureFlags.fromJson(_asset()); expect(flags.isEnabled(Feature.articlesCreditSection), isFalse); }); }); group('FeatureFlags.fromJson', () { test('fehlender Key fällt auf den Default zurück', () { final flags = FeatureFlags.fromJson({'features': {}}); for (final f in Feature.values) { expect(flags.isEnabled(f), f.defaultEnabled); } }); test('unbekannte Keys werden ignoriert', () { final flags = FeatureFlags.fromJson({ 'features': { 'gibt.es.nicht': {'enabled': true}, 'articles.credit_section': {'enabled': false}, }, }); expect(flags.isEnabled(Feature.articlesCreditSection), isFalse); }); test('kein bool bei enabled ist ein Fehler', () { expect( () => FeatureFlags.fromJson({ 'features': { 'articles.credit_section': {'enabled': 'nein'}, }, }), throwsFormatException, ); }); }); group('FeatureGate', () { Future pumpGate(WidgetTester tester, {required bool enabled}) { return tester.pumpWidget( RepositoryProvider.value( value: FeatureFlags({Feature.articlesCreditSection.key: enabled}), child: const MaterialApp( home: FeatureGate( feature: Feature.articlesCreditSection, child: Text('Gutschriften'), ), ), ), ); } testWidgets('zeigt den Inhalt bei aktivem Feature', (tester) async { await pumpGate(tester, enabled: true); expect(find.text('Gutschriften'), findsOneWidget); }); testWidgets('blendet den Inhalt bei inaktivem Feature aus', (tester) async { await pumpGate(tester, enabled: false); expect(find.text('Gutschriften'), findsNothing); }); }); }