Files
mugiten/test/models/library_test.dart
2026-02-20 15:33:33 +09:00

116 lines
2.8 KiB
Dart

import 'dart:ffi';
import 'dart:io';
import 'dart:math';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get_it/get_it.dart';
import 'package:mugiten/database/database.dart';
import 'package:mugiten/models/library_list.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqlite3/open.dart';
Future<Database> createDatabaseCopy({
required String libsqlitePath,
required String jadbPath,
}) async {
final jadbFile = File(jadbPath);
if (!jadbFile.existsSync()) {
throw Exception('JADB_PATH does not exist: $jadbPath');
}
// Make a copy of jadbPath
final randomSuffix = Random()
.nextInt((pow(2, 32) - 1) as int)
.toRadixString(16);
final jadbCopyPath = jadbFile.parent.uri
.resolve('jadb_copy_$randomSuffix.sqlite')
.path;
await jadbFile.copy(jadbCopyPath);
print('Using database copy: $jadbCopyPath');
// Initialize FFI
sqfliteFfiInit();
databaseFactory = createDatabaseFactoryFfi(
ffiInit: () =>
open.overrideForAll(() => DynamicLibrary.open(libsqlitePath)),
);
WidgetsFlutterBinding.ensureInitialized();
return await openAndMigrateDatabase(
jadbCopyPath,
await readMigrationsFromAssets(),
);
}
Future<void> insertTestData(Database db) async {
final libraryList1 = await db.libraryListInsertList('Test Library 1');
assert(libraryList1 == true);
await db.libraryListInsertEntry(
'Test Library 1',
jmdictEntryId: null,
kanji: '',
);
await db.libraryListInsertEntry(
'Test Library 1',
jmdictEntryId: null,
kanji: '',
);
}
void main() {
late final String libsqlitePath;
late final String jadbPath;
late final Database database;
setUpAll(() {
if (!Platform.environment.containsKey('LIBSQLITE_PATH')) {
throw Exception('LIBSQLITE_PATH environment variable is not set.');
}
if (!Platform.environment.containsKey('JADB_PATH')) {
throw Exception('JADB_PATH environment variable is not set.');
}
libsqlitePath = File(
Platform.environment['LIBSQLITE_PATH']!,
).resolveSymbolicLinksSync();
jadbPath = File(
Platform.environment['JADB_PATH']!,
).resolveSymbolicLinksSync();
});
// Setup sqflite_common_ffi for flutter test
setUp(() async {
database = await createDatabaseCopy(
libsqlitePath: libsqlitePath,
jadbPath: jadbPath,
);
GetIt.instance.registerSingleton<Database>(database);
await insertTestData(database);
});
tearDown(() async {
await database.close();
GetIt.instance.unregister<Database>();
final jadbCopyPath = database.path;
if (File(jadbCopyPath).existsSync()) {
await File(jadbCopyPath).delete();
}
});
test('Database is open', () async {
expect(database.isOpen, isTrue);
});
}