feat(grabaciones): add recordings library screen

This commit is contained in:
2026-07-28 23:01:33 +02:00
parent c1903623be
commit 589fc54580
23 changed files with 1825 additions and 13 deletions
@@ -8,6 +8,9 @@ import 'package:pluriwave/modelos/emisora.dart';
import 'package:pluriwave/servicios/servicio_grabacion_radio.dart';
import 'package:shared_preferences/shared_preferences.dart';
/// WU15 task 15.5: `listarGrabaciones()` is a pure filesystem-listing
/// addition — no logic edit to any existing method above.
void main() {
group('ServicioGrabacionRadio', () {
test(
@@ -194,6 +197,119 @@ void main() {
await servicio.dispose();
await servicio2.dispose();
});
group('listarGrabaciones (WU15 task 15.5)', () {
test('lista archivos existentes con metadata, orden más reciente '
'primero', () async {
final dir = await Directory.systemTemp.createTemp(
'pluriwave-rec-list-',
);
final carpeta = Directory(
'${dir.path}${Platform.pathSeparator}grabaciones',
);
await carpeta.create(recursive: true);
final antiguo = File(
'${carpeta.path}${Platform.pathSeparator}2026-01-01-radio-a.mp3',
);
await antiguo.writeAsBytes(List.filled(10, 0));
await antiguo.setLastModified(DateTime(2026, 1, 1));
final reciente = File(
'${carpeta.path}${Platform.pathSeparator}2026-06-01-radio-b.mp3',
);
await reciente.writeAsBytes(List.filled(20, 0));
await reciente.setLastModified(DateTime(2026, 6, 1));
final servicio = ServicioGrabacionRadio(
resolverDirectorioBase: () async => dir,
);
final lista = await servicio.listarGrabaciones();
expect(lista, hasLength(2));
expect(lista.first.nombre, '2026-06-01-radio-b');
expect(lista.first.tamanoBytes, 20);
expect(lista.first.fecha, DateTime(2026, 6, 1));
expect(lista.last.nombre, '2026-01-01-radio-a');
expect(lista.last.tamanoBytes, 10);
await servicio.dispose();
});
test('carpeta inexistente devuelve lista vacía, no lanza', () async {
final dir = await Directory.systemTemp.createTemp(
'pluriwave-rec-list-empty-',
);
final servicio = ServicioGrabacionRadio(
resolverDirectorioBase: () async => dir,
);
final lista = await servicio.listarGrabaciones();
expect(lista, isEmpty);
await servicio.dispose();
});
});
group('eliminarGrabacion y renombrarGrabacion (WU15 task 15.5)', () {
test('eliminarGrabacion borra el archivo del disco', () async {
final dir = await Directory.systemTemp.createTemp(
'pluriwave-rec-delete-',
);
final archivo = File('${dir.path}${Platform.pathSeparator}a.mp3');
await archivo.writeAsBytes([1, 2, 3]);
final servicio = ServicioGrabacionRadio(
resolverDirectorioBase: () async => dir,
);
await servicio.eliminarGrabacion(archivo.path);
expect(await archivo.exists(), isFalse);
await servicio.dispose();
});
test('eliminarGrabacion sobre un archivo ya borrado no lanza', () async {
final dir = await Directory.systemTemp.createTemp(
'pluriwave-rec-delete-missing-',
);
final servicio = ServicioGrabacionRadio(
resolverDirectorioBase: () async => dir,
);
await expectLater(
servicio.eliminarGrabacion(
'${dir.path}${Platform.pathSeparator}no-existe.mp3',
),
completes,
);
await servicio.dispose();
});
test(
'renombrarGrabacion preserva la extensión y devuelve la nueva ruta',
() async {
final dir = await Directory.systemTemp.createTemp(
'pluriwave-rec-rename-',
);
final archivo = File(
'${dir.path}${Platform.pathSeparator}original.mp3',
);
await archivo.writeAsBytes([1, 2, 3]);
final servicio = ServicioGrabacionRadio(
resolverDirectorioBase: () async => dir,
);
final nuevaRuta = await servicio.renombrarGrabacion(
archivo.path,
'mi grabación',
);
expect(nuevaRuta, endsWith('mi grabación.mp3'));
expect(await File(nuevaRuta).exists(), isTrue);
expect(await archivo.exists(), isFalse);
await servicio.dispose();
},
);
});
});
}