Skip to content

Commit da2f24e

Browse files
Merge pull request juliansteenbakker#881 from juliansteenbakker/test/unit-test-update
test: update test to use included mock
2 parents d584a23 + a284602 commit da2f24e

File tree

5 files changed

+157
-66
lines changed

5 files changed

+157
-66
lines changed

.github/workflows/code-coverage.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
name: 📊 Code Coverage
22

3-
on:
4-
push:
5-
branches: [master, develop]
6-
pull_request:
3+
on: [push, pull_request]
74

85
env:
96
PUB_ENVIRONMENT: bot.github

.github/workflows/code-quality.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
name: 📝 Code Quality
22

3-
on:
4-
push:
5-
branches: [master, develop]
6-
pull_request:
3+
on: [push, pull_request]
74

85
defaults:
96
run:

flutter_secure_storage/lib/flutter_secure_storage.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
library;
22

3+
import 'dart:collection';
4+
35
import 'package:flutter/foundation.dart';
46
import 'package:flutter/services.dart';
57
import 'package:flutter_secure_storage/test/test_flutter_secure_storage_platform.dart';
@@ -74,6 +76,11 @@ class FlutterSecureStorage {
7476
FlutterSecureStoragePlatform get _platform =>
7577
FlutterSecureStoragePlatform.instance;
7678

79+
/// Returns all listeners for testing purposes
80+
@visibleForTesting
81+
Map<String, List<ValueChanged<String?>>> get getListeners =>
82+
UnmodifiableMapView(_listeners);
83+
7784
/// Register [listener] for [key] with the value injected for the listener.
7885
/// The [listener] will still be called when you delete the [key] with the
7986
/// injected value as null. This listener will be added to the list of

flutter_secure_storage/test/flutter_secure_storage_mock.dart

Lines changed: 0 additions & 56 deletions
This file was deleted.

flutter_secure_storage/test/flutter_secure_storage_test.dart

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
import 'package:flutter/material.dart';
12
import 'package:flutter/services.dart';
23
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
4+
import 'package:flutter_secure_storage/test/test_flutter_secure_storage_platform.dart';
35
import 'package:flutter_secure_storage_platform_interface/flutter_secure_storage_platform_interface.dart';
46
import 'package:flutter_test/flutter_test.dart';
57
import '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

917
void 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

Comments
 (0)