Files
pluriwave/test/servicios/servicio_favoritos_sqlite_test.dart
T
FreeTLab b6e66e75ce
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m39s
Build & Deploy Pluriwave / Análisis de código (push) Successful in 24s
test(favorites): cover sqlite migrations
2026-05-22 17:21:03 +02:00

119 lines
3.5 KiB
Dart

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,
);
}