From 687f0a174d36e32223699b57e0aab92751f63dde Mon Sep 17 00:00:00 2001 From: Dan Reynolds Date: Fri, 8 Nov 2024 09:32:39 -0500 Subject: [PATCH] add encrypted test --- example/lib/main.dart | 4 +- .../indexed_db_persistor.dart | 8 +- test/models/test_indexed_db_persistor.dart | 12 ++- .../native/persistor/file_persistor_test.dart | 2 +- .../encrypted_indexed_db_persistor_test.dart | 97 +++++++++++++++++++ .../persistor/indexed_db_persistor_test.dart | 8 +- 6 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 test/web/persistor/encrypted_indexed_db_persistor_test.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index 07cd0a7..f7a86cf 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -10,7 +10,9 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); Loon.configure( - persistor: Persistor.current(), + persistor: Persistor.current( + settings: const PersistorSettings(encrypted: true), + ), enableLogging: true, ); diff --git a/lib/persistor/indexed_db_persistor/indexed_db_persistor.dart b/lib/persistor/indexed_db_persistor/indexed_db_persistor.dart index f844503..435de33 100644 --- a/lib/persistor/indexed_db_persistor/indexed_db_persistor.dart +++ b/lib/persistor/indexed_db_persistor/indexed_db_persistor.dart @@ -103,9 +103,9 @@ class IndexedDBPersistor extends Persistor { return objectStore.getAllKeys(); }); final initialStoreNames = List.from(result) - .where((name) => - name != DataStoreResolver.name && - !name.endsWith(DataStoreEncrypter.encryptedName)) + .where((name) => name != DataStoreResolver.name) + .map((name) => + name.replaceAll(':${DataStoreEncrypter.encryptedName}', '')) .toSet(); _manager = DataStoreManager( @@ -116,7 +116,7 @@ class IndexedDBPersistor extends Persistor { initialStoreNames: initialStoreNames, factory: (name, encrypted) => DataStore( IndexedDBDataStoreConfig( - encrypted ? '${name}_${DataStoreEncrypter.encryptedName}' : name, + encrypted ? '$name:${DataStoreEncrypter.encryptedName}' : name, encrypted: encrypted, encrypter: encrypter, runTransaction: runTransaction, diff --git a/test/models/test_indexed_db_persistor.dart b/test/models/test_indexed_db_persistor.dart index 39d5f89..5d1a946 100644 --- a/test/models/test_indexed_db_persistor.dart +++ b/test/models/test_indexed_db_persistor.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:js_interop'; import 'package:loon/loon.dart'; +import 'package:loon/persistor/data_store_encrypter.dart'; import 'package:loon/persistor/indexed_db_persistor/indexed_db_persistor.dart'; import '../utils.dart'; @@ -45,9 +46,16 @@ class TestIndexedDBPersistor extends IndexedDBPersistor { }, ); - Future getStore(String storeName, [bool encrypted = false]) async { + Future getStore( + String storeName, { + bool encrypted = false, + }) async { final result = await runTransaction('Get', (objectStore) { - return objectStore.get(storeName.toJS); + final objectStoreName = encrypted + ? '$storeName:${DataStoreEncrypter.encryptedName}' + : storeName; + + return objectStore.get(objectStoreName.toJS); }); if (result == null) { diff --git a/test/native/persistor/file_persistor_test.dart b/test/native/persistor/file_persistor_test.dart index e141e2f..26b2f06 100644 --- a/test/native/persistor/file_persistor_test.dart +++ b/test/native/persistor/file_persistor_test.dart @@ -48,7 +48,7 @@ void main() { await Loon.clearAll(); }); - group('Plaintext FilePersistor', () { + group('FilePersistor', () { group( 'persist', () { diff --git a/test/web/persistor/encrypted_indexed_db_persistor_test.dart b/test/web/persistor/encrypted_indexed_db_persistor_test.dart new file mode 100644 index 0000000..07dd2ac --- /dev/null +++ b/test/web/persistor/encrypted_indexed_db_persistor_test.dart @@ -0,0 +1,97 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:loon/loon.dart'; +import '../../models/test_indexed_db_persistor.dart'; +import '../../models/test_user_model.dart'; +import '../../utils.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late PersistorCompleter completer; + late TestIndexedDBPersistor persistor; + + setUp(() { + completer = TestIndexedDBPersistor.completer = PersistorCompleter(); + persistor = TestIndexedDBPersistor( + settings: const PersistorSettings(encrypted: true), + ); + }); + + tearDown(() async { + await Loon.clearAll(); + }); + + group('Encrypted IndexedDBPersistor', () { + test( + 'Persists encrypted data', + () async { + final userCollection = Loon.collection( + 'users', + fromJson: TestUserModel.fromJson, + toJson: (user) => user.toJson(), + persistorSettings: const PersistorSettings(encrypted: false), + ); + final encryptedUsersCollection = Loon.collection( + 'users', + fromJson: TestUserModel.fromJson, + toJson: (user) => user.toJson(), + persistorSettings: const PersistorSettings(encrypted: true), + ); + + userCollection.doc('1').create(TestUserModel('User 1')); + encryptedUsersCollection.doc('2').create(TestUserModel('User 2')); + + await completer.onSync; + + expect(await persistor.getStore('__store__'), { + "": { + "users": { + "__values": { + '1': {'name': 'User 1'}, + }, + }, + } + }); + + expect(await persistor.getStore('__store__', encrypted: true), { + "": { + "users": { + "__values": { + '2': {'name': 'User 2'}, + }, + }, + } + }); + + Loon.configure(persistor: null); + await Loon.clearAll(); + + expect(userCollection.exists(), false); + expect(encryptedUsersCollection.exists(), false); + + // Reinitialize the persistor ahead of hydration. + Loon.configure( + persistor: TestIndexedDBPersistor( + settings: const PersistorSettings(encrypted: true), + ), + ); + + await Loon.hydrate(); + + expect( + userCollection.get(), + [ + DocumentSnapshot( + doc: userCollection.doc('1'), + data: TestUserModel('User 1'), + ), + DocumentSnapshot( + doc: userCollection.doc('2'), + data: TestUserModel('User 2'), + ), + ], + ); + }, + ); + }); +} diff --git a/test/web/persistor/indexed_db_persistor_test.dart b/test/web/persistor/indexed_db_persistor_test.dart index f152972..bf8572c 100644 --- a/test/web/persistor/indexed_db_persistor_test.dart +++ b/test/web/persistor/indexed_db_persistor_test.dart @@ -174,10 +174,10 @@ void main() { Loon.configure(persistor: null); await Loon.clearAll(); - expect(userCollection.get().isEmpty, true); - expect(friendsCollection.get().isEmpty, true); - expect(userFriendsCollection.get().isEmpty, true); - expect(currentUserDoc.get(), null); + expect(userCollection.exists(), false); + expect(friendsCollection.exists(), false); + expect(userFriendsCollection.exists(), false); + expect(currentUserDoc.exists(), false); // Then reinitialize a new persistor so that it reads the persisted data on hydration. Loon.configure(persistor: TestIndexedDBPersistor());