Migrate sync queue persistence to store adapters

This commit is contained in:
Rijad Zuzo
2026-02-15 19:38:46 +01:00
parent 1502360051
commit add0105e6b
13 changed files with 293 additions and 18 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/sync/storage/sync_state_store.dart';
import 'package:relationship_saver/features/sync/storage/sync_state_store_hive.dart';
import 'package:relationship_saver/features/sync/storage/sync_state_store_provider.dart';
import 'package:relationship_saver/features/sync/storage/sync_state_store_shared_prefs.dart';
import 'package:relationship_saver/features/sync/sync_queue_repository.dart';
import 'package:relationship_saver/integrations/backend/models/backend_models.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
setUp(() {
SharedPreferences.setMockInitialValues(<String, Object>{});
});
test(
'migrates legacy shared prefs sync queue payload into hive store',
() async {
final SyncStateRecord legacyRecord = SyncStateRecord(
rawState: jsonEncode(<String, dynamic>{
'cursor': 'legacy-cursor',
'pendingChanges': <Map<String, dynamic>>[
ChangeEnvelope(
schemaVersion: 1,
entityType: 'person',
entityId: 'legacy-person',
op: ChangeOperation.upsert,
modifiedAt: DateTime(2026, 2, 15, 10).toUtc(),
clientMutationId: 'legacy-cm-1',
payload: const <String, dynamic>{'name': 'Legacy'},
).toJson(),
],
'lastSyncAt': null,
'lastAttemptAt': null,
'lastError': null,
'lastRejected': <Map<String, dynamic>>[],
}),
);
final SharedPrefsSyncStateStore legacyStore = SharedPrefsSyncStateStore();
await legacyStore.write(rawState: legacyRecord.rawState);
final _FakeHiveSyncStore hiveStore = _FakeHiveSyncStore();
final ProviderContainer container = ProviderContainer(
overrides: [syncStateStoreProvider.overrideWithValue(hiveStore)],
);
addTearDown(container.dispose);
final state = await container.read(syncQueueRepositoryProvider.future);
expect(state.cursor, 'legacy-cursor');
expect(state.pendingChanges.length, 1);
expect(state.pendingChanges.first.clientMutationId, 'legacy-cm-1');
final SyncStateRecord? migrated = await hiveStore.read();
expect(migrated, isNotNull);
final SyncStateRecord? legacyAfter = await legacyStore.read();
expect(legacyAfter, isNull);
},
);
}
class _FakeHiveSyncStore extends HiveSyncStateStore {
SyncStateRecord? _record;
@override
Future<void> clear() async {
_record = null;
}
@override
Future<SyncStateRecord?> read() async => _record;
@override
Future<void> write({required String rawState}) async {
_record = SyncStateRecord(rawState: rawState);
}
}