Skip to content

Commit

Permalink
add encrypted test
Browse files Browse the repository at this point in the history
  • Loading branch information
danReynolds committed Nov 8, 2024
1 parent 9d36f35 commit 687f0a1
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 12 deletions.
4 changes: 3 additions & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized();

Loon.configure(
persistor: Persistor.current(),
persistor: Persistor.current(
settings: const PersistorSettings(encrypted: true),
),
enableLogging: true,
);

Expand Down
8 changes: 4 additions & 4 deletions lib/persistor/indexed_db_persistor/indexed_db_persistor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,9 @@ class IndexedDBPersistor extends Persistor {
return objectStore.getAllKeys();
});
final initialStoreNames = List<String>.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(
Expand All @@ -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,
Expand Down
12 changes: 10 additions & 2 deletions test/models/test_indexed_db_persistor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -45,9 +46,16 @@ class TestIndexedDBPersistor extends IndexedDBPersistor {
},
);

Future<Map?> getStore(String storeName, [bool encrypted = false]) async {
Future<Map?> 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) {
Expand Down
2 changes: 1 addition & 1 deletion test/native/persistor/file_persistor_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ void main() {
await Loon.clearAll();
});

group('Plaintext FilePersistor', () {
group('FilePersistor', () {
group(
'persist',
() {
Expand Down
97 changes: 97 additions & 0 deletions test/web/persistor/encrypted_indexed_db_persistor_test.dart
Original file line number Diff line number Diff line change
@@ -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<TestUserModel>(
'users',
fromJson: TestUserModel.fromJson,
toJson: (user) => user.toJson(),
persistorSettings: const PersistorSettings(encrypted: false),
);
final encryptedUsersCollection = Loon.collection<TestUserModel>(
'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'),
),
],
);
},
);
});
}
8 changes: 4 additions & 4 deletions test/web/persistor/indexed_db_persistor_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down

0 comments on commit 687f0a1

Please sign in to comment.