@@ -32,20 +32,7 @@ class MockDataConnectTransport extends Mock implements DataConnectTransport {}
3232
3333class MockFirebaseDataConnect extends Mock implements FirebaseDataConnect {}
3434
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 {}
4936
5037class MockQueryManager extends Mock implements QueryManager {}
5138
@@ -122,10 +109,15 @@ void main() {
122109 late Serializer <String > serializer;
123110 late MockClient mockHttpClient;
124111 late Deserializer <String > deserializer;
112+ late MockFirebaseAuth auth;
113+ late MockUser mockUser;
125114
126115 setUp (() {
127116 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);
129121 mockHttpClient = MockClient ();
130122 transport = RestTransport (
131123 TransportOptions ('testhost' , 443 , true ),
@@ -142,15 +134,31 @@ void main() {
142134 transport.setHttp (mockHttpClient);
143135 mockDataConnect.transport = transport;
144136 });
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+ });
145148 test (
146149 'query should forceRefresh on ID token if the first request is unauthorized' ,
147150 () async {
148151 final mockResponse = http.Response ('{"error": "Unauthorized"}' , 401 );
149152 final mockResponseSuccess = http.Response ('{"success": true}' , 200 );
150153 final deserializer = (String data) => 'Deserialized Data' ;
151154 int count = 0 ;
155+ int idTokenCount = 0 ;
152156 QueryRef ref = QueryRef (mockDataConnect, 'operation' , transport,
153157 deserializer, QueryManager (mockDataConnect), emptySerializer, null );
158+ when (mockUser.getIdToken ()).thenAnswer ((invocation) => [
159+ Future .value ('invalid-token' ),
160+ Future .value ('valid-token' )
161+ ][idTokenCount++ ]);
154162
155163 when (mockHttpClient.post (any,
156164 headers: anyNamed ('headers' ), body: anyNamed ('body' )))
0 commit comments