diff --git a/modules/ensemble/lib/framework/data_context.dart b/modules/ensemble/lib/framework/data_context.dart index 5a34dfa67..d964e69ac 100644 --- a/modules/ensemble/lib/framework/data_context.dart +++ b/modules/ensemble/lib/framework/data_context.dart @@ -739,6 +739,13 @@ class RemoteConfigInvokable with Invokable { Map setters() => {}; } +/// Keys for which `ensemble.storage.clear()` dispatches a [StorageBindingSource] +/// update after entries are removed from public storage (all keys except the +/// `enc_` encrypted prefix). +@visibleForTesting +List ensembleStorageClearDispatchKeys(Iterable allKeys) => + allKeys.where((key) => !key.startsWith('enc_')).toList(); + /// Singleton handling user storage class EnsembleStorage with Invokable { static final EnsembleStorage _instance = EnsembleStorage._internal(); @@ -791,10 +798,8 @@ class EnsembleStorage with Invokable { } void clear() { - final keys = StorageManager() - .getKeys() - .where((key) => !key.startsWith('enc_')) - .toList(); + final keys = + ensembleStorageClearDispatchKeys(StorageManager().getKeys()); StorageManager().clearPublicStorage(); for (final key in keys) { ScreenController().dispatchStorageChanges(context, key, null); diff --git a/modules/ensemble/test/ensemble_storage_clear_test.dart b/modules/ensemble/test/ensemble_storage_clear_test.dart new file mode 100644 index 000000000..62e8ce97a --- /dev/null +++ b/modules/ensemble/test/ensemble_storage_clear_test.dart @@ -0,0 +1,25 @@ +import 'package:ensemble/framework/data_context.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('ensembleStorageClearDispatchKeys', () { + test('excludes enc_ prefix and preserves order of remaining keys', () { + expect( + ensembleStorageClearDispatchKeys( + ['session', 'enc_token', 'theme', 'enc_other']), + ['session', 'theme'], + ); + }); + + test('treats only the enc_ prefix as encrypted storage namespace', () { + expect( + ensembleStorageClearDispatchKeys(['enc_legacy', 'enc2', 'normal']), + ['enc2', 'normal'], + ); + }); + + test('empty input yields empty list', () { + expect(ensembleStorageClearDispatchKeys([]), isEmpty); + }); + }); +}