import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; import 'package:fruitshorts/core/config/locale_controller.dart'; import 'package:fruitshorts/core/config/server_endpoint.dart'; import 'package:fruitshorts/core/data/models/drama.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; import 'package:fruitshorts/l10n/app_localizations.dart'; import 'package:fruitshorts/pages/mine/mine_logic.dart'; const _drama = Drama( id: 'drama-1', title: 'The Signal', synopsis: 'synopsis', posterUrl: '/files/1.jpg', ); void main() { setUp(() { SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty(); }); testWidgets('should_show_server_address_when_debug_entry_is_enabled', ( tester, ) async { await _pumpSettings(tester, showServerSetting: true); expect(find.byKey(const Key('server-endpoint-setting')), findsOneWidget); expect(find.text('Server address'), findsOneWidget); }); testWidgets('should_hide_server_address_when_debug_entry_is_disabled', ( tester, ) async { await _pumpSettings(tester, showServerSetting: false); expect(find.byKey(const Key('server-endpoint-setting')), findsNothing); expect(find.text('Server address'), findsNothing); }); testWidgets('should_reject_invalid_server_address_without_saving', ( tester, ) async { await _pumpSettings(tester, showServerSetting: true); await tester.tap(find.byKey(const Key('server-endpoint-setting'))); await tester.pumpAndSettle(); expect(find.text('Restart the app to apply.'), findsOneWidget); await tester.enterText( find.byKey(const Key('server-endpoint-input')), 'ftp://invalid', ); await tester.tap(find.byKey(const Key('server-endpoint-save'))); await tester.pumpAndSettle(); expect(find.text('Enter a valid http(s) server address.'), findsOneWidget); expect( await SharedPreferencesAsync().getString(ServerEndpoint.preferenceKey), isNull, ); }); } Future _pumpSettings( WidgetTester tester, { required bool showServerSetting, }) async { final logic = MineLogic( history: InMemoryWatchHistoryRepository(), drama: _drama, initialSection: 0, ); addTearDown(logic.dispose); await tester.pumpWidget( ChangeNotifierProvider( create: (_) => LocaleController(), child: MaterialApp( locale: const Locale('en'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Builder( builder: (context) => Scaffold( body: TextButton( key: const Key('open-settings'), onPressed: () => logic.showLanguage( context, showServerSetting: showServerSetting, ), child: const Text('Open settings'), ), ), ), ), ), ); await tester.tap(find.byKey(const Key('open-settings'))); await tester.pumpAndSettle(); }