119 lines
3.5 KiB
Dart
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,
|
|
);
|
|
}
|