test(favorites): cover sqlite migrations
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
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,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user