Files
SpotiFLAC-Mobile/test/sqlite_path_keys_batch_test.dart
T
zarzet a21e46e6dd perf(library): trim scan ingestion writes
Fresh staging tables hold no path keys, so the first row for an id no longer issues a delete. Removing scanned paths now runs in one transaction with a subselect instead of committing a lookup and two deletes per chunk.
2026-10-01 19:06:25 +07:00

57 lines
1.6 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:spotiflac_android/services/sqlite_helpers.dart';
import 'package:spotiflac_android/utils/path_match_keys.dart';
import 'package:sqflite/sqflite.dart';
class _RecordingBatch implements Batch {
final operations = <String>[];
@override
void delete(String table, {String? where, List<Object?>? whereArgs}) {
operations.add('delete $table ${whereArgs?.single}');
}
@override
void insert(
String table,
Map<String, Object?> values, {
String? nullColumnHack,
ConflictAlgorithm? conflictAlgorithm,
}) {
expect(conflictAlgorithm, ConflictAlgorithm.ignore);
operations.add('insert $table ${values['item_id']} ${values['path_key']}');
}
@override
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
void main() {
const path = '/storage/emulated/0/Music/Album/01 Song.flac';
test('path keys replace existing rows by default', () {
final batch = _RecordingBatch();
putPathKeysInBatch(batch, 'stage_keys', 'lib_1', path);
expect(batch.operations.first, 'delete stage_keys lib_1');
expect(batch.operations.skip(1), [
for (final key in buildPathMatchKeys(path))
'insert stage_keys lib_1 $key',
]);
});
test('first row in a fresh stage writes the same keys without a delete', () {
final batch = _RecordingBatch();
putPathKeysInBatch(
batch,
'stage_keys',
'lib_1',
path,
replaceExisting: false,
);
expect(batch.operations, [
for (final key in buildPathMatchKeys(path))
'insert stage_keys lib_1 $key',
]);
});
}