import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:path/path.dart' as p; import 'package:pluriwave/modelos/emisora.dart'; import 'package:pluriwave/modelos/grupo_favoritos.dart'; import 'package:pluriwave/servicios/servicio_favoritos.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; void main() { late Directory tempDir; setUpAll(() { sqfliteFfiInit(); }); setUp(() async { tempDir = await Directory.systemTemp.createTemp('pluriwave_favoritos_'); }); tearDown(() async { if (await tempDir.exists()) { await tempDir.delete(recursive: true); } }); ServicioFavoritos crearServicio() { return ServicioFavoritos( databaseFactory: databaseFactoryFfi, databasePathProvider: () async => tempDir.path, ); } test('primera instalación crea esquema completo y guarda favoritos', () async { final servicio = crearServicio(); addTearDown(servicio.cerrar); await servicio.agregar(_emisora('radio-1', 'Radio Uno')); final favoritos = await servicio.obtenerTodos(); final grupos = await servicio.obtenerGrupos(); expect(favoritos, hasLength(1)); expect(favoritos.single.grupoFavoritosId, GrupoFavoritos.sinAsignarId); expect(grupos, hasLength(1)); expect(grupos.single.esSinAsignar, isTrue); }); test('migra esquema antiguo sin grupo ni columnas nuevas', () async { final dbPath = p.join(tempDir.path, 'pluriwave.db'); final db = await databaseFactoryFfi.openDatabase( dbPath, options: OpenDatabaseOptions( version: 1, onCreate: (db, version) async { await db.execute(''' CREATE TABLE favoritos ( id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT NOT NULL UNIQUE, nombre TEXT NOT NULL, url TEXT NOT NULL ) '''); await db.insert('favoritos', { 'uuid': 'legacy-1', 'nombre': 'Legacy Radio', 'url': 'https://example.com/legacy.mp3', }); }, ), ); await db.close(); final servicio = crearServicio(); addTearDown(servicio.cerrar); final favoritos = await servicio.obtenerTodos(); final grupos = await servicio.obtenerGrupos(); expect(favoritos, hasLength(1)); expect(favoritos.single.uuid, 'legacy-1'); expect(favoritos.single.grupoFavoritosId, GrupoFavoritos.sinAsignarId); expect(grupos.singleWhere((g) => g.esSinAsignar).nombre, 'Sin asignar'); final grupo = await servicio.crearGrupo('Viajes'); await servicio.asignarGrupo('legacy-1', grupo.id); expect( (await servicio.obtenerTodos()).single.grupoFavoritosId, grupo.id, ); }); test('eliminar grupo reasigna sus favoritos a Sin asignar', () async { final servicio = crearServicio(); addTearDown(servicio.cerrar); await servicio.agregar(_emisora('radio-1', 'Radio Uno')); final grupo = await servicio.crearGrupo('Trabajo'); await servicio.asignarGrupo('radio-1', grupo.id); await servicio.eliminarGrupo(grupo.id); final favoritos = await servicio.obtenerTodos(); final grupos = await servicio.obtenerGrupos(); expect(favoritos.single.grupoFavoritosId, GrupoFavoritos.sinAsignarId); expect(grupos.any((g) => g.id == grupo.id), isFalse); }); } Emisora _emisora(String uuid, String nombre) { return Emisora( uuid: uuid, nombre: nombre, url: 'https://example.com/$uuid.mp3', codec: 'MP3', bitrate: 192, ); }