import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/estado/estado_radio.dart'; import 'package:pluriwave/l10n/gen/app_localizations.dart'; import 'package:pluriwave/pantallas/ajustes/pantalla_ajustes_backup.dart'; import 'package:pluriwave/widgets/pluri_push_scaffold.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../helpers/fakes.dart'; import '../../helpers/fakes_alarmas.dart'; /// Pre-existing project constraint (see `pantalla_ajustes_test.dart`): /// PluriGlassSurface paints a background over ListTile's ink layer, which /// Flutter flags as a warning-level assertion, not a correctness bug. void _suppressListTileInkAssertion() { final original = FlutterError.onError; FlutterError.onError = (details) { if (details.exceptionAsString().contains( 'ListTile background color or ink splashes may be invisible', )) { return; } original?.call(details); }; addTearDown(() => FlutterError.onError = original); } /// WU3b task 3b.1: the APLICACIÓN detail screen for "Copia de seguridad" /// renders inside a [PluriPushScaffold] and its moved controls (export / /// import rows) are still present and reachable exactly as they were inside /// the old `_SeccionBackup`. /// /// Both rows call into native plugins (`share_plus`, `file_picker`) that /// this suite does not mock, so this file verifies reachability (title and /// both row labels present, with a live `onTap`) rather than tapping through /// the native share/pick flow — the same conservative choice this batch /// makes for any moved control that would otherwise depend on an unmocked /// platform channel. void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); Future archivoCustomVacio() async => File( '${Directory.current.path}/test/fixtures/emisoras_custom_vacio.json', ); Future crearEstado() async { return EstadoRadio( audio: FakeServicioAudio(), favoritos: FakeServicioFavoritos(), radio: FakeServicioRadio(), servicioEcualizador: FakeServicioEcualizador(), servicioGrabacion: FakeServicioGrabacionRadioInactiva(), resolverArchivoCustom: archivoCustomVacio, iniciarAutomaticamente: false, ); } Widget buildScreen(EstadoRadio estado) { return ChangeNotifierProvider.value( value: estado, child: MaterialApp( locale: const Locale('en'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: const PantallaAjustesBackup(), ), ); } testWidgets('renders inside a PluriPushScaffold titled "Backup"', ( tester, ) async { _suppressListTileInkAssertion(); final estado = await crearEstado(); addTearDown(estado.dispose); await tester.pumpWidget(buildScreen(estado)); await tester.pump(); await tester.pump(const Duration(milliseconds: 100)); expect(find.byType(PluriPushScaffold), findsOneWidget); expect(find.text('Backup'), findsOneWidget); }); testWidgets( 'moved controls still reachable: export and import rows both present', (tester) async { _suppressListTileInkAssertion(); final estado = await crearEstado(); addTearDown(estado.dispose); await tester.pumpWidget(buildScreen(estado)); await tester.pump(); await tester.pump(const Duration(milliseconds: 100)); final exportTile = find.widgetWithText(ListTile, 'Export configuration'); final importTile = find.widgetWithText(ListTile, 'Import configuration'); expect(exportTile, findsOneWidget); expect(importTile, findsOneWidget); expect(tester.widget(exportTile).onTap, isNotNull); expect(tester.widget(importTile).onTap, isNotNull); }, ); }