import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/estado/estado_busqueda.dart'; import '../helpers/fakes.dart'; /// S4-R3: EstadoBusqueda owns search query, results and loading state /// previously in EstadoRadio. void main() { test('actualizar la búsqueda notifica a los listeners', () async { final busqueda = EstadoBusqueda( radio: FakeServicioRadio( busqueda: [emisoraDemo(uuid: 'b-1', nombre: 'Resultado Uno')], ), ); addTearDown(busqueda.dispose); var notificaciones = 0; busqueda.addListener(() => notificaciones++); await busqueda.buscar(nombre: 'uno'); // At least once for the loading flag and once for the results. expect(notificaciones, greaterThanOrEqualTo(2)); expect(busqueda.cargando, isFalse); expect(busqueda.resultados.map((e) => e.uuid), contains('b-1')); }); test('cargarMas pagina resultados y acota memoria', () async { final emisoras = List.generate( 70, (i) => emisoraDemo(uuid: 'page-$i', nombre: 'Page $i'), ); final busqueda = EstadoBusqueda( radio: FakeServicioRadio(busqueda: emisoras), ); addTearDown(busqueda.dispose); await busqueda.buscar(nombre: 'page'); expect(busqueda.resultados, hasLength(30)); expect(busqueda.hayMas, isTrue); await busqueda.cargarMas(); expect(busqueda.resultados, hasLength(60)); await busqueda.cargarMas(); expect(busqueda.resultados, hasLength(70)); expect(busqueda.hayMas, isFalse); }); test( 'resultados conserva identidad entre lecturas sin cambios (S4-R5)', () async { final busqueda = EstadoBusqueda( radio: FakeServicioRadio( busqueda: [emisoraDemo(uuid: 'b-1', nombre: 'Resultado Uno')], ), ); addTearDown(busqueda.dispose); await busqueda.buscar(nombre: 'uno'); // Identity-stable getters let `context.select` skip rebuilds when the // underlying data did not change. expect(identical(busqueda.resultados, busqueda.resultados), isTrue); }, ); }