Home > Net >  Log in Firebase auth and get Id token in flutter tests
Log in Firebase auth and get Id token in flutter tests

Time:02-03

I would like to write some integration tests for an app that I am creating in flutter.

I would like to check the integration between frontend and backend, and in order to do so, I need to generate a valid JWT Id Token from Firebase (from tests credentials, that will be managed as secrets, but this is out of scope of this question).

Note: I know that all my libraries are up to date (the same error message is sometimes raised when some dependencies are out of date), because my login / JWT generation and retrieval do work well in the actual app when I launch it in a simulator.

I encounter an issue when trying to run the canonical way of login in and getting the id token in test.

So far, I have written my tests as follow, but they do raise an error when I try to run them:

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:firebase_auth/firebase_auth.dart' as firebase_auth;

//   some custom imports for type SingleRecipientMessageHeader, etc...

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();
  
  group('messageRepository', () {
    late final String? jwt;
    
    setUp(() async {
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.android,
      );  // <= this command raises the error!
      final instance = firebase_auth.FirebaseAuth.instance;

      await instance.signInWithEmailAndPassword(
          email: "<REDACTED>", password: "<REDACTED>");
      jwt = await instance.currentUser?.getIdToken();
    });

    tearDown(() {});

    test('message repository dummy test', () async {
      List<SingleRecipientMessageHeader> messages =
          await MessageRepository().fetchMessages(jwt!);
      ...  // the actual integration tests follow...
    });
  });
}

However, when I try to run those tests, the command flagged above raises the following error:

PlatformException(channel-error, Unable to establish connection on channel., null, null)
package:firebase_core_platform_interface/src/pigeon/messages.pigeon.dart 203:7  FirebaseCoreHostApi.initializeCore

From what I understand, when running tests, no actual platform exist, hence the connection error.

Does anyone know how I could achieve login in and getting the JWT Id token from Firebase in my test suite ?

Thanks a lot!

CodePudding user response:

I finally managed to get a jwt for my tests, by calling the Firebase API, as per the Firebase documentation:

import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

//   some custom imports for type SingleRecipientMessageHeader, etc...

void main() {
  
  group('messageRepository', () {
    late final String? jwt;

  setUp(() async {
      http.Response response = await http.post(
        Uri.parse(
            'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=<MY API KEY>'),
        headers: <String, String>{},
        body: jsonEncode(<String, String>{
          'email': '<REDACTED>',
          'password': '<REDACTED>',
          'returnSecureToken': 'true',
        }),
      );
      jwt = jsonDecode(response.body)['idToken'];
    });

    tearDown(() {});

    test('message repository dummy test', () async {
      List<SingleRecipientMessageHeader> messages =
          await MessageRepository().fetchMessages(jwt);
      expect(messages[0].headerStatus, HeaderStatus.active);
    // the actual integration tests follow...
    });
  });
}

  • Related