@@ -32,20 +32,7 @@ class MockDataConnectTransport extends Mock implements DataConnectTransport {}
32
32
33
33
class MockFirebaseDataConnect extends Mock implements FirebaseDataConnect {}
34
34
35
- class DCMockUser extends Mock implements User {
36
- int count = 0 ;
37
- List <String ?> tokens = ['invalid-token' , 'valid-token' ];
38
- @override
39
- Future <String ?> getIdToken ([bool forceRefresh = false ]) {
40
- // First return an invalid token, then return a valid token
41
- return Future .value (tokens[count++ ]);
42
- }
43
- }
44
-
45
- class MockFirebaseAuth extends Mock implements FirebaseAuth {
46
- @override
47
- User ? get currentUser => DCMockUser ();
48
- }
35
+ class MockFirebaseAuth extends Mock implements FirebaseAuth {}
49
36
50
37
class MockQueryManager extends Mock implements QueryManager {}
51
38
@@ -122,10 +109,15 @@ void main() {
122
109
late Serializer <String > serializer;
123
110
late MockClient mockHttpClient;
124
111
late Deserializer <String > deserializer;
112
+ late MockFirebaseAuth auth;
113
+ late MockUser mockUser;
125
114
126
115
setUp (() {
127
116
mockDataConnect = MockFirebaseDataConnect ();
128
- when (mockDataConnect.auth).thenReturn (MockFirebaseAuth ());
117
+ auth = MockFirebaseAuth ();
118
+ mockUser = MockUser ();
119
+ when (mockDataConnect.auth).thenReturn (auth);
120
+ when (auth.currentUser).thenReturn (mockUser);
129
121
mockHttpClient = MockClient ();
130
122
transport = RestTransport (
131
123
TransportOptions ('testhost' , 443 , true ),
@@ -142,15 +134,31 @@ void main() {
142
134
transport.setHttp (mockHttpClient);
143
135
mockDataConnect.transport = transport;
144
136
});
137
+ test ('executeQuery should gracefully handle getIdToken failures' , () async {
138
+ final deserializer = (String data) => 'Deserialized Data' ;
139
+ final mockResponseSuccess = http.Response ('{"success": true}' , 200 );
140
+ when (mockUser.getIdToken ()).thenThrow (Exception ('Auth error' ));
141
+ QueryRef ref = QueryRef (mockDataConnect, 'operation' , transport,
142
+ deserializer, QueryManager (mockDataConnect), emptySerializer, null );
143
+ when (mockHttpClient.post (any,
144
+ headers: anyNamed ('headers' ), body: anyNamed ('body' )))
145
+ .thenAnswer ((_) async => mockResponseSuccess);
146
+ await ref.execute ();
147
+ });
145
148
test (
146
149
'query should forceRefresh on ID token if the first request is unauthorized' ,
147
150
() async {
148
151
final mockResponse = http.Response ('{"error": "Unauthorized"}' , 401 );
149
152
final mockResponseSuccess = http.Response ('{"success": true}' , 200 );
150
153
final deserializer = (String data) => 'Deserialized Data' ;
151
154
int count = 0 ;
155
+ int idTokenCount = 0 ;
152
156
QueryRef ref = QueryRef (mockDataConnect, 'operation' , transport,
153
157
deserializer, QueryManager (mockDataConnect), emptySerializer, null );
158
+ when (mockUser.getIdToken ()).thenAnswer ((invocation) => [
159
+ Future .value ('invalid-token' ),
160
+ Future .value ('valid-token' )
161
+ ][idTokenCount++ ]);
154
162
155
163
when (mockHttpClient.post (any,
156
164
headers: anyNamed ('headers' ), body: anyNamed ('body' )))
0 commit comments