diff --git a/packages/firebase_data_connect/firebase_data_connect/lib/src/firebase_data_connect.dart b/packages/firebase_data_connect/firebase_data_connect/lib/src/firebase_data_connect.dart index ec731343a66c..45ec2f1815cd 100644 --- a/packages/firebase_data_connect/firebase_data_connect/lib/src/firebase_data_connect.dart +++ b/packages/firebase_data_connect/firebase_data_connect/lib/src/firebase_data_connect.dart @@ -33,7 +33,11 @@ class FirebaseDataConnect extends FirebasePluginPlatform { FirebaseDataConnect( {required this.app, required this.connectorConfig, + @Deprecated( + 'Passing an explicit instance is deprecated, internal handling is now automatic.') this.auth, + @Deprecated( + 'Passing an explicit instance is deprecated, internal handling is now automatic.') this.appCheck, CallerSDKType? sdkType, this.cacheSettings}) @@ -94,6 +98,9 @@ class FirebaseDataConnect extends FirebasePluginPlatform { } transportOptions ??= TransportOptions('firebasedataconnect.googleapis.com', null, true); + auth ??= app.getService(); + appCheck ??= app.getService(); + final rest = RestTransport( transportOptions!, options, @@ -198,7 +205,11 @@ class FirebaseDataConnect extends FirebasePluginPlatform { /// If pass in [appCheck], request session will get protected from abusing. static FirebaseDataConnect instanceFor( {FirebaseApp? app, + @Deprecated( + 'Passing an explicit instance is deprecated, internal handling is now automatic.') FirebaseAuth? auth, + @Deprecated( + 'Passing an explicit instance is deprecated, internal handling is now automatic.') FirebaseAppCheck? appCheck, CallerSDKType? sdkType, required ConnectorConfig connectorConfig, diff --git a/packages/firebase_data_connect/firebase_data_connect/test/src/cache/cache_manager_test.mocks.dart b/packages/firebase_data_connect/firebase_data_connect/test/src/cache/cache_manager_test.mocks.dart index 09f67581ad75..4f989b0bc28d 100644 --- a/packages/firebase_data_connect/firebase_data_connect/test/src/cache/cache_manager_test.mocks.dart +++ b/packages/firebase_data_connect/firebase_data_connect/test/src/cache/cache_manager_test.mocks.dart @@ -120,6 +120,16 @@ class MockFirebaseApp extends _i1.Mock implements _i3.FirebaseApp { returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + + @override + void registerService(T? service) => + super.noSuchMethod( + Invocation.method( + #registerService, + [service], + ), + returnValueForMissingStub: null, + ); } /// A class which mocks [ConnectorConfig]. diff --git a/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.dart b/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.dart index b4edc25b2a81..eabf82393de8 100644 --- a/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.dart +++ b/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.dart @@ -38,6 +38,35 @@ class MockFirebaseAuth extends Mock implements FirebaseAuth { class MockFirebaseAppCheck extends Mock implements FirebaseAppCheck {} +class DynamicMockFirebaseApp extends Mock implements FirebaseApp { + DynamicMockFirebaseApp({ + required this.name, + required this.options, + this.mockAuth, + this.mockAppCheck, + }); + + @override + final String name; + + @override + final FirebaseOptions options; + + final FirebaseAuth? mockAuth; + final FirebaseAppCheck? mockAppCheck; + + @override + T? getService() { + if (T == FirebaseAppCheck) { + return mockAppCheck as T?; + } + if (T == FirebaseAuth) { + return mockAuth as T?; + } + return null; + } +} + class MockTransportOptions extends Mock implements TransportOptions {} class MockDataConnectTransport extends Mock implements DataConnectTransport {} @@ -195,5 +224,35 @@ void main() { equals(instance), ); }); + + test( + 'checkTransport resolves dynamic service instances from registry just-in-time', + () { + FirebaseDataConnect.cachedInstances.clear(); + + final dynamicApp = DynamicMockFirebaseApp( + name: 'transportAppName', + options: const FirebaseOptions( + apiKey: 'fake_api_key', + appId: 'fake_app_id', + messagingSenderId: 'fake_messaging_sender_id', + projectId: 'fake_project_id', + ), + mockAuth: mockAuth, + mockAppCheck: mockAppCheck, + ); + + final instance = FirebaseDataConnect( + app: dynamicApp, + connectorConfig: mockConnectorConfig, + ); + + instance.checkTransport(); + + final dynamic routingTransport = instance.transport; + expect(routingTransport.rest.appCheck, equals(mockAppCheck)); + expect(routingTransport.websocket.auth, equals(mockAuth)); + expect(routingTransport.websocket.appCheck, equals(mockAppCheck)); + }); }); } diff --git a/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.mocks.dart b/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.mocks.dart index 06634cc3f1ec..23020e0b3009 100644 --- a/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.mocks.dart +++ b/packages/firebase_data_connect/firebase_data_connect/test/src/firebase_data_connect_test.mocks.dart @@ -120,6 +120,16 @@ class MockFirebaseApp extends _i1.Mock implements _i3.FirebaseApp { returnValue: _i5.Future.value(), returnValueForMissingStub: _i5.Future.value(), ) as _i5.Future); + + @override + void registerService(T? service) => + super.noSuchMethod( + Invocation.method( + #registerService, + [service], + ), + returnValueForMissingStub: null, + ); } /// A class which mocks [ConnectorConfig].