ensureLiveFirebaseAuthForTest function

void ensureLiveFirebaseAuthForTest()

Bridges Firebase Auth user token pigeon calls for code paths that still use FirebaseAuth after LiveSignInWithCustomToken has established a session.

Implementation

void ensureLiveFirebaseAuthForTest() {
  if (_firebaseAuthBridgeInstalled) return;
  TestWidgetsFlutterBinding.ensureInitialized();

  final messenger =
      TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger;
  final codec = FirebaseAuthHostApi.pigeonChannelCodec;

  void registerHandler(
    String channelName,
    Future<List<Object?>> Function(List<Object?> args) handler,
  ) {
    messenger.setMockDecodedMessageHandler<Object?>(
      BasicMessageChannel<Object?>(channelName, codec),
      (Object? message) async {
        final args = (message! as List<Object?>);
        try {
          return await handler(args);
        } on PlatformException catch (error) {
          return <Object?>[error.code, error.message, error.details];
        } catch (error) {
          return <Object?>['error', error.toString(), null];
        }
      },
    );
  }

  registerHandler(
    'dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerIdTokenListener',
    (args) async {
      final app = _decodeApp(args[0]);
      final channel = 'ensemble_test_runner/auth/id-token/${app.appName}';
      _mockEventChannel(channel);
      return <Object?>[channel];
    },
  );

  registerHandler(
    'dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.registerAuthStateListener',
    (args) async {
      final app = _decodeApp(args[0]);
      final channel = 'ensemble_test_runner/auth/auth-state/${app.appName}';
      _mockEventChannel(channel);
      return <Object?>[channel];
    },
  );

  registerHandler(
    'dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthHostApi.signOut',
    (args) async {
      final app = _decodeApp(args[0]);
      _sessionsByApp.remove(app.appName);
      return <Object?>[];
    },
  );

  registerHandler(
    'dev.flutter.pigeon.firebase_auth_platform_interface.FirebaseAuthUserHostApi.getIdToken',
    (args) async {
      final app = _decodeApp(args[0]);
      final session = _sessionForApp(app);
      return <Object?>[
        PigeonIdTokenResult(
          token: session.idToken,
          expirationTimestamp: session.expiresAtMs,
          authTimestamp: DateTime.now().millisecondsSinceEpoch,
          issuedAtTimestamp: DateTime.now().millisecondsSinceEpoch,
          signInProvider: 'custom',
        ),
      ];
    },
  );

  _firebaseAuthBridgeInstalled = true;
}