1+ import 'package:flutter/material.dart' ;
12import 'package:flutter/services.dart' ;
23import 'package:flutter_secure_storage/flutter_secure_storage.dart' ;
4+ import 'package:flutter_secure_storage/test/test_flutter_secure_storage_platform.dart' ;
35import 'package:flutter_secure_storage_platform_interface/flutter_secure_storage_platform_interface.dart' ;
46import 'package:flutter_test/flutter_test.dart' ;
57import 'package:mocktail/mocktail.dart' ;
8+ import 'package:plugin_platform_interface/plugin_platform_interface.dart' ;
69
7- import 'flutter_secure_storage_mock.dart' ;
10+ class MockFlutterSecureStoragePlatform extends Mock
11+ with MockPlatformInterfaceMixin
12+ implements FlutterSecureStoragePlatform {}
13+
14+ class ImplementsFlutterSecureStoragePlatform extends Mock
15+ implements FlutterSecureStoragePlatform {}
816
917void main () {
1018 TestWidgetsFlutterBinding .ensureInitialized ();
@@ -28,6 +36,7 @@ void main() {
2836
2937 setUp (() {
3038 mockPlatform = MockFlutterSecureStoragePlatform ();
39+
3140 FlutterSecureStoragePlatform .instance = mockPlatform;
3241 storage = const FlutterSecureStorage ();
3342
@@ -159,7 +168,7 @@ void main() {
159168
160169 test ('Can be extended' , () {
161170 FlutterSecureStoragePlatform .instance =
162- ExtendsFlutterSecureStoragePlatform ( );
171+ TestFlutterSecureStoragePlatform ({} );
163172 });
164173 });
165174
@@ -224,6 +233,38 @@ void main() {
224233 ).called (1 );
225234 });
226235
236+ test ('deleteAll should call platform delete all method' , () async {
237+ when (
238+ () => mockPlatform.deleteAll (
239+ options: any (named: 'options' ),
240+ ),
241+ ).thenAnswer ((_) async {});
242+
243+ await storage.deleteAll ();
244+
245+ verify (
246+ () => mockPlatform.deleteAll (
247+ options: any (named: 'options' ),
248+ ),
249+ ).called (1 );
250+ });
251+
252+ test ('readAll should call platform read all method' , () async {
253+ when (
254+ () => mockPlatform.readAll (
255+ options: any (named: 'options' ),
256+ ),
257+ ).thenAnswer ((_) async => {testKey: testValue});
258+
259+ await storage.readAll ();
260+
261+ verify (
262+ () => mockPlatform.readAll (
263+ options: any (named: 'options' ),
264+ ),
265+ ).called (1 );
266+ });
267+
227268 test ('containsKey should return true if key exists' , () async {
228269 when (
229270 () => mockPlatform.containsKey (
@@ -262,6 +303,62 @@ void main() {
262303 });
263304 });
264305
306+ group ('Test FlutterSecureStorage Methods' , () {
307+ late TestFlutterSecureStoragePlatform storagePlatform;
308+ final initialData = < String , String > {'key1' : 'value1' , 'key2' : 'value2' };
309+
310+ setUp (() {
311+ storagePlatform = TestFlutterSecureStoragePlatform (Map .from (initialData));
312+ });
313+
314+ test ('reads a value' , () async {
315+ expect (await storagePlatform.read (key: 'key1' , options: {}), 'value1' );
316+ });
317+
318+ test ('returns null for non-existent key' , () async {
319+ expect (await storagePlatform.read (key: 'key3' , options: {}), isNull);
320+ });
321+
322+ test ('writes a value' , () async {
323+ await storagePlatform.write (key: 'key3' , value: 'value3' , options: {});
324+ expect (storagePlatform.data['key3' ], 'value3' );
325+ });
326+
327+ test ('containsKey returns true for existing key' , () async {
328+ expect (
329+ await storagePlatform.containsKey (key: 'key1' , options: {}),
330+ isTrue,
331+ );
332+ });
333+
334+ test ('containsKey returns false for non-existing key' , () async {
335+ expect (
336+ await storagePlatform.containsKey (key: 'key3' , options: {}),
337+ isFalse,
338+ );
339+ });
340+
341+ test ('deletes a value' , () async {
342+ await storagePlatform.delete (key: 'key1' , options: {});
343+ expect (storagePlatform.data.containsKey ('key1' ), isFalse);
344+ });
345+
346+ test ('deleteAll clears all data' , () async {
347+ await storagePlatform.deleteAll (options: {});
348+ expect (storagePlatform.data.isEmpty, isTrue);
349+ });
350+
351+ test ('readAll returns all key-value pairs' , () async {
352+ final allData = await storagePlatform.readAll (options: {});
353+ expect (allData, equals (initialData));
354+ });
355+
356+ test ('modifying data does not affect initial data map' , () async {
357+ await storagePlatform.write (key: 'key1' , value: 'newvalue1' , options: {});
358+ expect (initialData['key1' ], 'value1' );
359+ });
360+ });
361+
265362 group ('AndroidOptions Configuration Tests' , () {
266363 test ('Default AndroidOptions should have correct default values' , () {
267364 const options = AndroidOptions .defaultOptions;
@@ -553,4 +650,53 @@ void main() {
553650 expect (defaultOptions.toMap (), constructorOptions.toMap ());
554651 });
555652 });
653+
654+ group ('Listener Management Tests' , () {
655+ late ValueChanged <String ?> listener1;
656+ late ValueChanged <String ?> listener2;
657+
658+ setUp (() {
659+ storage.unregisterAllListeners ();
660+ listener1 = (value) => debugPrint ('Listener 1: $value ' );
661+ listener2 = (value) => debugPrint ('Listener 2: $value ' );
662+ });
663+
664+ test ('Register listener adds correctly' , () {
665+ storage.registerListener (key: 'key1' , listener: listener1);
666+ expect (storage.getListeners['key1' ]? .contains (listener1), isTrue);
667+ });
668+
669+ test ('Register multiple listeners on same key' , () {
670+ storage
671+ ..registerListener (key: 'key1' , listener: listener1)
672+ ..registerListener (key: 'key1' , listener: listener2);
673+ expect (storage.getListeners['key1' ]? .length, 2 );
674+ expect (storage.getListeners['key1' ], containsAll ([listener1, listener2]));
675+ });
676+
677+ test ('Unregister listener removes specific listener' , () {
678+ storage
679+ ..registerListener (key: 'key1' , listener: listener1)
680+ ..registerListener (key: 'key1' , listener: listener2)
681+ ..unregisterListener (key: 'key1' , listener: listener1);
682+ expect (storage.getListeners['key1' ]? .contains (listener1), isFalse);
683+ expect (storage.getListeners['key1' ]? .contains (listener2), isTrue);
684+ });
685+
686+ test ('Unregister all listeners for a key' , () {
687+ storage
688+ ..registerListener (key: 'key1' , listener: listener1)
689+ ..registerListener (key: 'key1' , listener: listener2)
690+ ..unregisterAllListenersForKey (key: 'key1' );
691+ expect (storage.getListeners.containsKey ('key1' ), isFalse);
692+ });
693+
694+ test ('Unregister all listeners for all keys' , () {
695+ storage
696+ ..registerListener (key: 'key1' , listener: listener1)
697+ ..registerListener (key: 'key2' , listener: listener2)
698+ ..unregisterAllListeners ();
699+ expect (storage.getListeners.isEmpty, isTrue);
700+ });
701+ });
556702}
0 commit comments