Skip to content

Commit b020479

Browse files
committed
🎨 update getAll method to return empty map for empty allowList and improve test cases
1 parent 3bd5fe7 commit b020479

File tree

10 files changed

+30
-51
lines changed

10 files changed

+30
-51
lines changed

packages/hyper_secure_storage/lib/src/backend.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class SecureStorageBackend extends StorageBackend {
5656
@override
5757
Future<int?> getInt(String key) async => int.tryParse(await storage.read(key: key) ?? '');
5858

59+
/// This returns empty map if allowList is empty.
5960
@override
6061
Future<Map<String, dynamic>> getAll(Set<String> allowList) async {
6162
final Map<String, String> all = await storage.readAll();
@@ -80,9 +81,12 @@ class SecureStorageBackend extends StorageBackend {
8081
/// 1. [bool] if the value is "true" or "false" (case-insensitive)
8182
/// 2. [int] if the value is a valid integer
8283
/// 3. [double] if the value is a valid decimal number
83-
/// 4. [Map] or [List] if the value is valid JSON
8484
/// 5. [String] as fallback for all other cases
8585
///
86+
/// CAUTION: This method does not attempt to parse complex types like JSON
87+
/// or DateTime to avoid ambiguity and potential data loss. It focuses on
88+
/// primitive types only.
89+
///
8690
/// This is an internal utility method used by [getAll] for automatic type
8791
/// inference.
8892
Object? _parseValue(String value) => bool.tryParse(value) ?? int.tryParse(value) ?? double.tryParse(value) ?? value;

packages/hyper_secure_storage/test/secure_storage_backend_test.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,12 @@ void main() {
218218
expect(data.containsKey('key4'), false);
219219
});
220220

221-
test('getAll with empty allowList returns all data', () async {
221+
test('getAll with empty allowList returns no data', () async {
222222
await backend.setString('key1', 'value1');
223223
await backend.setInt('key2', 42);
224224

225225
final data = await backend.getAll({});
226-
expect(data, {
227-
'key1': 'value1',
228-
'key2': 42,
229-
});
226+
expect(data, isEmpty);
230227
});
231228

232229
test('getAll with non-existent keys in allowList', () async {
@@ -235,15 +232,6 @@ void main() {
235232
final data = await backend.getAll({'key1', 'nonExistent'});
236233
expect(data, {'key1': 'value1'});
237234
});
238-
239-
test('getAll parses JSON values correctly', () async {
240-
await backend.setJson('json', {'name': 'test', 'value': 42});
241-
await backend.setStringList('list', ['a', 'b', 'c']);
242-
243-
final data = await backend.getAll(await backend.getKeys());
244-
expect(data['json'], {'name': 'test', 'value': 42});
245-
expect(data['list'], ['a', 'b', 'c']);
246-
});
247235
});
248236

249237
group('deletion operations', () {
@@ -416,7 +404,7 @@ void main() {
416404
test('handles JSON arrays in getAll', () async {
417405
await backend.setString('array', '[1,2,3]');
418406
final data = await backend.getAll(await backend.getKeys());
419-
expect(data['array'], [1, 2, 3]);
407+
expect(data['array'], '[1,2,3]');
420408
});
421409

422410
test('handles complex nested JSON', () async {

packages/hyper_storage/lib/src/api/serializable_container.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,9 @@ abstract class SerializableStorageContainer<E> extends StorageContainer implemen
497497
@override
498498
Future<Map<String, E>> getAll([Iterable<String>? allowList]) async {
499499
validateKeys(allowList);
500-
final keys = allowList?.map(encodeKey) ?? await getEncodedKeys();
500+
final keys = allowList?.map(encodeKey).toSet() ?? await getEncodedKeys();
501501
if (keys.isEmpty) return {};
502-
final Map<String, dynamic> allData = await backend.getAll(keys.toSet());
502+
final Map<String, dynamic> allData = await backend.getAll(keys);
503503
return <String, E>{
504504
for (final MapEntry(:key, :value) in allData.entries) decodeKey(key): deserialize(value.toString()),
505505
};

packages/hyper_storage/lib/src/hyper_storage_container.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ final class HyperStorageContainer extends StorageContainer with ItemHolderMixin,
118118
@override
119119
Future<Map<String, dynamic>> getAll([Iterable<String>? allowList]) async {
120120
validateKeys(allowList);
121-
allowList ??= await getEncodedKeys();
122-
if (allowList.isEmpty) return {};
123-
final map = await backend.getAll(allowList.map(encodeKey).toSet());
121+
final keys = allowList?.map(encodeKey).toSet() ?? await getEncodedKeys();
122+
if (keys.isEmpty) return {};
123+
final map = await backend.getAll(keys);
124124
return {for (final entry in map.entries) decodeKey(entry.key): entry.value};
125125
}
126126

packages/hyper_storage/lib/src/in_memory_backend.dart

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,10 @@ class InMemoryBackend extends StorageBackend {
7575
Future<void> setAll(Map<String, dynamic> values) async => _data.addAll(values);
7676

7777
@override
78-
Future<Map<String, dynamic>> getAll([Iterable<String>? allowList]) async {
79-
if (allowList != null) {
80-
if (allowList.isEmpty) return {};
81-
final data = <String, dynamic>{..._data};
82-
data.removeWhere((key, value) => !allowList.contains(key));
83-
return data;
84-
}
85-
return <String, dynamic>{..._data};
78+
Future<Map<String, dynamic>> getAll(Set<String> allowList) async {
79+
if (allowList.isEmpty) return {};
80+
final data = <String, dynamic>{..._data};
81+
return data..removeWhere((key, value) => !allowList.contains(key));
8682
}
8783

8884
@override

packages/hyper_storage/lib/src/storage_base.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ abstract class _HyperStorageImpl extends BaseStorage
9090
}
9191

9292
@override
93-
Future<Map<String, dynamic>> getAll([Iterable<String>? allowList]) {
93+
Future<Map<String, dynamic>> getAll([Iterable<String>? allowList]) async {
9494
_validateKeys(allowList);
95-
if (allowList == null || allowList.isEmpty) return Future.value(<String, dynamic>{});
96-
return backend.getAll(allowList.toSet());
95+
if (allowList != null && allowList.isEmpty) return Future.value(<String, dynamic>{});
96+
return backend.getAll(allowList?.toSet() ?? await getKeys());
9797
}
9898

9999
@override

packages/hyper_storage/test/in_memory_backend_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,22 +205,22 @@ void main() {
205205
await backend.setString('key1', 'value1');
206206
await backend.setInt('key2', 42);
207207

208-
final all = await backend.getAll();
209-
expect(all, {'key1': 'value1', 'key2': 42});
208+
final all = await backend.getAll({});
209+
expect(all, isEmpty);
210210
});
211211

212212
test('getAll filters by allowList', () async {
213213
await backend.setString('key1', 'value1');
214214
await backend.setString('key2', 'value2');
215215
await backend.setString('key3', 'value3');
216216

217-
final filtered = await backend.getAll(['key1', 'key3']);
217+
final filtered = await backend.getAll({'key1', 'key3'});
218218
expect(filtered, {'key1': 'value1', 'key3': 'value3'});
219219
});
220220

221221
test('getAll with empty allowList returns empty map', () async {
222222
await backend.setString('key1', 'value1');
223-
final filtered = await backend.getAll([]);
223+
final filtered = await backend.getAll({});
224224
expect(filtered, isEmpty);
225225
});
226226
});

packages/hyper_storage_hive/test/hive_backend_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,12 @@ void main() {
255255
expect(data.containsKey('key4'), false);
256256
});
257257

258-
test('getAll with empty allowList returns all data', () async {
258+
test('getAll with empty allowList returns no data', () async {
259259
await backend.setString('key1', 'value1');
260260
await backend.setInt('key2', 42);
261261

262262
final data = await backend.getAll({});
263-
expect(data, {
264-
'key1': 'value1',
265-
'key2': 42,
266-
});
263+
expect(data, isEmpty);
267264
});
268265

269266
test('getAll with non-existent keys in allowList', () async {

packages/hyper_storage_hive/test/lazy_hive_backend_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,12 @@ void main() {
255255
expect(data.containsKey('key4'), false);
256256
});
257257

258-
test('getAll with empty allowList returns all data', () async {
258+
test('getAll with empty allowList returns no data', () async {
259259
await backend.setString('key1', 'value1');
260260
await backend.setInt('key2', 42);
261261

262262
final data = await backend.getAll({});
263-
expect(data, {
264-
'key1': 'value1',
265-
'key2': 42,
266-
});
263+
expect(data, isEmpty);
267264
});
268265

269266
test('getAll with non-existent keys in allowList', () async {

packages/hyper_storage_shared_preferences/test/shared_preferences_backend_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,12 @@ void main() {
216216
expect(data.containsKey('key4'), false);
217217
});
218218

219-
test('getAll with empty allowList returns all data', () async {
219+
test('getAll with empty allowList returns no data', () async {
220220
await backend.setString('key1', 'value1');
221221
await backend.setInt('key2', 42);
222222

223223
final data = await backend.getAll({});
224-
expect(data, {
225-
'key1': 'value1',
226-
'key2': 42,
227-
});
224+
expect(data, isEmpty);
228225
});
229226

230227
test('getAll with non-existent keys in allowList', () async {

0 commit comments

Comments
 (0)