Default local storage to Hive with legacy migration

This commit is contained in:
Rijad Zuzo
2026-02-15 19:17:25 +01:00
parent 21c911ad4c
commit 1502360051
8 changed files with 142 additions and 10 deletions
@@ -0,0 +1,81 @@
import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:relationship_saver/features/local/local_models.dart';
import 'package:relationship_saver/features/local/local_repository.dart';
import 'package:relationship_saver/features/local/storage/local_data_store.dart';
import 'package:relationship_saver/features/local/storage/local_data_store_hive.dart';
import 'package:relationship_saver/features/local/storage/local_data_store_provider.dart';
import 'package:relationship_saver/features/local/storage/local_data_store_shared_prefs.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
setUp(() {
SharedPreferences.setMockInitialValues(<String, Object>{});
});
test(
'migrates legacy shared prefs payload into hive store on first load',
() async {
final LocalDataState legacyState = LocalDataState.seed().copyWith(
people: <PersonProfile>[
PersonProfile(
id: 'legacy-person-1',
name: 'Legacy Person',
relationship: 'Friend',
affinityScore: 82,
nextMoment: DateTime(2026, 2, 18, 19),
tags: <String>['legacy'],
notes: 'from shared prefs',
),
],
);
final SharedPrefsLocalDataStore legacyStore = SharedPrefsLocalDataStore();
await legacyStore.write(
rawState: jsonEncode(legacyState.toJson()),
schemaVersion: 2,
);
final _FakeHiveStore hiveStore = _FakeHiveStore();
final ProviderContainer container = ProviderContainer(
overrides: [localDataStoreProvider.overrideWithValue(hiveStore)],
);
addTearDown(container.dispose);
final LocalDataState loaded = await container.read(
localRepositoryProvider.future,
);
expect(loaded.people.first.name, 'Legacy Person');
final LocalDataRecord? migrated = await hiveStore.read();
expect(migrated, isNotNull);
expect(migrated!.schemaVersion, 2);
final LocalDataRecord? legacyAfter = await legacyStore.read();
expect(legacyAfter, isNull);
},
);
}
class _FakeHiveStore extends HiveLocalDataStore {
LocalDataRecord? _record;
@override
Future<void> clear() async {
_record = null;
}
@override
Future<LocalDataRecord?> read() async => _record;
@override
Future<void> write({
required String rawState,
required int schemaVersion,
}) async {
_record = LocalDataRecord(rawState: rawState, schemaVersion: schemaVersion);
}
}