Add local data store adapter layer and Hive scaffold

This commit is contained in:
Rijad Zuzo
2026-02-15 19:05:20 +01:00
parent 2a7d039475
commit 21c911ad4c
13 changed files with 328 additions and 19 deletions
@@ -0,0 +1,29 @@
import 'package:flutter_test/flutter_test.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('write and read roundtrip', () async {
final SharedPrefsLocalDataStore store = SharedPrefsLocalDataStore();
await store.write(rawState: '{"people":[]}', schemaVersion: 7);
final record = await store.read();
expect(record, isNotNull);
expect(record!.rawState, '{"people":[]}');
expect(record.schemaVersion, 7);
});
test('clear removes stored payload', () async {
final SharedPrefsLocalDataStore store = SharedPrefsLocalDataStore();
await store.write(rawState: '{"x":1}', schemaVersion: 1);
await store.clear();
expect(await store.read(), isNull);
});
}
@@ -0,0 +1,58 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:relationship_saver/features/local/local_repository.dart';
import 'package:relationship_saver/features/local/storage/local_data_store_in_memory.dart';
import 'package:relationship_saver/features/local/storage/local_data_store_provider.dart';
import 'package:relationship_saver/features/sync/sync_queue_repository.dart';
import 'package:relationship_saver/features/sync/sync_state.dart';
import 'package:relationship_saver/integrations/backend/models/backend_models.dart';
void main() {
test('local repository works with injected in-memory store', () async {
final InMemoryLocalDataStore store = InMemoryLocalDataStore();
final ProviderContainer container = ProviderContainer(
overrides: [
localDataStoreProvider.overrideWithValue(store),
syncQueueRepositoryProvider.overrideWith(_NoopSyncQueueRepository.new),
],
);
addTearDown(container.dispose);
final initial = await container.read(localRepositoryProvider.future);
expect(initial.people, isNotEmpty);
await container
.read(localRepositoryProvider.notifier)
.addPerson(
name: 'Injected Store Person',
relationship: 'Friend',
notes: 'stored in-memory',
tags: const <String>['in-memory'],
);
final updated = await container.read(localRepositoryProvider.future);
expect(
updated.people.any((person) => person.name == 'Injected Store Person'),
isTrue,
);
final record = await store.read();
expect(record, isNotNull);
expect(record!.rawState.contains('Injected Store Person'), isTrue);
});
}
class _NoopSyncQueueRepository extends SyncQueueRepository {
@override
Future<SyncState> build() async => SyncState.empty;
@override
Future<void> enqueue(ChangeEnvelope change) async {
return;
}
@override
Future<void> enqueueAll(Iterable<ChangeEnvelope> changes) async {
return;
}
}