104 lines
3.8 KiB
Dart
104 lines
3.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:pluriwave/estado/estado_grabacion.dart';
|
|
import 'package:pluriwave/l10n/gen/app_localizations.dart';
|
|
import 'package:pluriwave/pantallas/ajustes/pantalla_ajustes_grabaciones.dart';
|
|
import 'package:pluriwave/widgets/pluri_push_scaffold.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:shared_preferences/shared_preferences.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 GRABACIONES Y MÚSICA detail screen for "Grabaciones"
|
|
/// renders inside a [PluriPushScaffold] and its moved controls still respond
|
|
/// exactly as they did inside the old `_SeccionGrabaciones`.
|
|
///
|
|
/// This file deliberately does NOT interact with "Maximum recording size"
|
|
/// (`_editarTamanoMaximo`): that control has a pre-existing, out-of-scope
|
|
/// controller-dispose race (documented in `pantalla_ajustes_grabaciones.dart`
|
|
/// and, for the analogous `_editarGrupo` case, in
|
|
/// `pantalla_ajustes_grupos_favoritos_test.dart`) that this move does not
|
|
/// fix. "Restore default path" is exercised instead — a real, moved
|
|
/// capability with no such hazard.
|
|
void main() {
|
|
setUp(() {
|
|
SharedPreferences.setMockInitialValues({});
|
|
});
|
|
|
|
Widget buildScreen(EstadoGrabacion estado) {
|
|
return ListenableProvider<EstadoGrabacion>.value(
|
|
value: estado,
|
|
child: MaterialApp(
|
|
locale: const Locale('en'),
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
home: const PantallaAjustesGrabaciones(),
|
|
),
|
|
);
|
|
}
|
|
|
|
testWidgets('renders inside a PluriPushScaffold titled "Recordings"', (
|
|
tester,
|
|
) async {
|
|
_suppressListTileInkAssertion();
|
|
final estado = EstadoGrabacion(
|
|
servicio: FakeServicioGrabacionRadioInactiva(),
|
|
);
|
|
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('Recordings'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('moved control still responds: restore default path clears the '
|
|
'configured directory', (tester) async {
|
|
_suppressListTileInkAssertion();
|
|
final estado = EstadoGrabacion(
|
|
servicio: FakeServicioGrabacionRadioInactiva(),
|
|
);
|
|
addTearDown(estado.dispose);
|
|
await estado.cambiarDirectorio('/tmp/custom-recordings');
|
|
expect(estado.directorioConfigurado, '/tmp/custom-recordings');
|
|
|
|
await tester.pumpWidget(buildScreen(estado));
|
|
await tester.pump();
|
|
await tester.pump(const Duration(milliseconds: 100));
|
|
|
|
await tester.tap(find.byIcon(Icons.restore_rounded));
|
|
await tester.pump();
|
|
await tester.pump(const Duration(milliseconds: 100));
|
|
|
|
expect(estado.directorioConfigurado, isNull);
|
|
expect(
|
|
find.text('The default internal folder will be used'),
|
|
findsOneWidget,
|
|
);
|
|
|
|
// SnackBar's own dismiss Timer is not frame-scheduled — let it resolve
|
|
// before teardown (WU3a batch discovery) instead of leaving a pending
|
|
// Timer behind.
|
|
await tester.pump(const Duration(seconds: 5));
|
|
await tester.pumpAndSettle();
|
|
});
|
|
}
|