1+ import 'package:compass_app/data/services/shared_preferences_service.dart' ;
2+ import 'package:compass_app/utils/result.dart' ;
3+ import 'package:flutter_test/flutter_test.dart' ;
4+ import 'package:mocktail/mocktail.dart' ;
5+ import 'package:shared_preferences/shared_preferences.dart' ;
6+
7+ // --- Mock ---
8+ class MockSharedPreferencesWithCache extends Mock
9+ implements SharedPreferencesWithCache {}
10+
11+ void main () {
12+ late MockSharedPreferencesWithCache mockPrefs;
13+ late SharedPreferencesService sut;
14+
15+ setUp (() {
16+ mockPrefs = MockSharedPreferencesWithCache ();
17+ sut = SharedPreferencesService (mockPrefs);
18+ });
19+
20+ group ('fetchToken' , () {
21+ test ('returns ok with token when prefs has a stored value' , () async {
22+ when (() => mockPrefs.getString ('TOKEN' )).thenReturn ('my-token' );
23+
24+ final result = await sut.fetchToken ();
25+
26+ expect (result, isA <Ok <String ?>>());
27+ expect ((result as Ok ).value, 'my-token' );
28+ });
29+
30+ test ('returns ok with null when no token is stored' , () async {
31+ when (() => mockPrefs.getString ('TOKEN' )).thenReturn (null );
32+
33+ final result = await sut.fetchToken ();
34+
35+ expect (result, isA <Ok <String ?>>());
36+ expect ((result as Ok ).value, isNull);
37+ });
38+
39+ test ('returns error when getString throws an Exception' , () async {
40+ when (() => mockPrefs.getString ('TOKEN' ))
41+ .thenThrow (Exception ('read error' ));
42+
43+ final result = await sut.fetchToken ();
44+
45+ expect (result, isA <Error <String ?>>());
46+ });
47+ });
48+
49+ group ('saveToken' , () {
50+ test ('calls setString and returns ok when token is not null' , () async {
51+ when (() => mockPrefs.setString ('TOKEN' , 'new-token' ))
52+ .thenAnswer ((_) async {});
53+
54+ final result = await sut.saveToken ('new-token' );
55+
56+ expect (result, isA <Ok <void >>());
57+ verify (() => mockPrefs.setString ('TOKEN' , 'new-token' )).called (1 );
58+ verifyNever (() => mockPrefs.remove (any ()));
59+ });
60+
61+ test ('calls remove and returns ok when token is null' , () async {
62+ when (() => mockPrefs.remove ('TOKEN' )).thenAnswer ((_) async {});
63+
64+ final result = await sut.saveToken (null );
65+
66+ expect (result, isA <Ok <void >>());
67+ verify (() => mockPrefs.remove ('TOKEN' )).called (1 );
68+ verifyNever (() => mockPrefs.setString (any (), any ()));
69+ });
70+
71+ test ('returns error when setString throws an Exception' , () async {
72+ when (() => mockPrefs.setString ('TOKEN' , any ()))
73+ .thenThrow (Exception ('write error' ));
74+
75+ final result = await sut.saveToken ('bad-token' );
76+
77+ expect (result, isA <Error <void >>());
78+ });
79+
80+ test ('returns error when remove throws an Exception' , () async {
81+ when (() => mockPrefs.remove ('TOKEN' ))
82+ .thenThrow (Exception ('remove error' ));
83+
84+ final result = await sut.saveToken (null );
85+
86+ expect (result, isA <Error <void >>());
87+ });
88+ });
89+ }
0 commit comments