[extension_google_sign_in_as_googleapis_auth] Migrate to null safety (#3642)

Migrates to NNBD.
Replaces Mockito-based fakes with test's Fake.
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/CHANGELOG.md b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/CHANGELOG.md
index 4afb1a0..5e29f34 100644
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/CHANGELOG.md
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.0.0
+
+* Migrate to null safety.
+* Fixes the requested scopes to use the `GoogleSignIn` instance's `scopes`.
+
 ## 1.0.4
 
 * Update the example app: remove the deprecated `RaisedButton` and `FlatButton` widgets.
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/lib/main.dart b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/lib/main.dart
index 597ab56..0ec62a8 100755
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/lib/main.dart
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/lib/main.dart
@@ -56,7 +56,8 @@
       _contactText = 'Loading contact info...';
     });
 
-    final peopleApi = PeopleApi(await _googleSignIn.authenticatedClient());
+    final peopleApi =
+        PeopleServiceApi(await _googleSignIn.authenticatedClient());
     final response = await peopleApi.people.connections.list(
       'people/me',
       personFields: 'names',
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/pubspec.yaml b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/pubspec.yaml
index 48dfef6..d3b428d 100755
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/pubspec.yaml
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/example/pubspec.yaml
@@ -4,7 +4,7 @@
 dependencies:
   flutter:
     sdk: flutter
-  google_sign_in: ^4.4.1
+  google_sign_in: ^5.0.0
   extension_google_sign_in_as_googleapis_auth:
     # When depending on this package from a real application you should use:
     #   extension_google_sign_in_as_googleapis_auth: ^x.y.z
@@ -12,10 +12,10 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
-  googleapis: ^0.55.0
+  googleapis: ^1.0.0
 
 dev_dependencies:
-  pedantic: ^1.8.0
+  pedantic: ^1.10.0
   integration_test:
     path: ../../../integration_test
   flutter_driver:
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/lib/extension_google_sign_in_as_googleapis_auth.dart b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/lib/extension_google_sign_in_as_googleapis_auth.dart
index eec45cc..8c8ede5 100644
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/lib/extension_google_sign_in_as_googleapis_auth.dart
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/lib/extension_google_sign_in_as_googleapis_auth.dart
@@ -15,15 +15,20 @@
 /// client that can be used with the rest of the `googleapis` libraries.
 extension GoogleApisGoogleSignInAuth on GoogleSignIn {
   /// Retrieve a `googleapis` authenticated client.
-  Future<googleapis_auth.AuthClient> authenticatedClient({
-    @visibleForTesting GoogleSignInAuthentication debugAuthentication,
-    @visibleForTesting List<String> debugScopes = const [],
+  Future<googleapis_auth.AuthClient?> authenticatedClient({
+    @visibleForTesting GoogleSignInAuthentication? debugAuthentication,
+    @visibleForTesting List<String>? debugScopes,
   }) async {
-    final auth = debugAuthentication ?? await currentUser.authentication;
+    final GoogleSignInAuthentication? auth =
+        debugAuthentication ?? await currentUser?.authentication;
+    final String? oathTokenString = auth?.accessToken;
+    if (oathTokenString == null) {
+      return null;
+    }
     final credentials = googleapis_auth.AccessCredentials(
       googleapis_auth.AccessToken(
         'Bearer',
-        auth.accessToken,
+        oathTokenString,
         // We don't know when the token expires, so we assume "never"
         DateTime.now().toUtc().add(Duration(days: 365)),
       ),
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/pubspec.yaml b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/pubspec.yaml
index 9da5f0b..7d86b67 100644
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/pubspec.yaml
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/pubspec.yaml
@@ -6,23 +6,23 @@
 
 name: extension_google_sign_in_as_googleapis_auth
 description: A bridge package between google_sign_in and googleapis_auth, to create Authenticated Clients from google_sign_in user credentials.
-version: 1.0.4
+version: 2.0.0
 homepage: https://github.com/flutter/plugins/google_sign_in/extension_google_sign_in_as_googleapis_auth
 
 dependencies:
   flutter:
     sdk: flutter
-  google_sign_in: ^4.4.1
-  googleapis_auth: ^0.2.11+1
-  meta: ^1.1.8
-  http: ^0.12.1
+  google_sign_in: ^5.0.0
+  googleapis_auth: ^1.0.0
+  meta: ^1.3.0
+  http: ^0.13.0
 
 dev_dependencies:
-  mockito: ^4.1.1
-  pedantic: ^1.9.0
+  pedantic: ^1.10.0
+  test: ^1.16.3
   flutter_test:
     sdk: flutter
 
 environment:
-  sdk: ">=2.7.0 <3.0.0"
+  sdk: ">=2.12.0-259.9.beta <3.0.0"
   flutter: ">=1.12.13+hotfix.4"
diff --git a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/test/extension_google_sign_in_as_googleapis_auth_test.dart b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/test/extension_google_sign_in_as_googleapis_auth_test.dart
index 9f86703..508f366 100644
--- a/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/test/extension_google_sign_in_as_googleapis_auth_test.dart
+++ b/packages/google_sign_in/extension_google_sign_in_as_googleapis_auth/test/extension_google_sign_in_as_googleapis_auth_test.dart
@@ -7,25 +7,25 @@
 import 'package:google_sign_in/google_sign_in.dart';
 import 'package:googleapis_auth/auth.dart' as auth;
 import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
-import 'package:mockito/mockito.dart';
 import 'package:flutter_test/flutter_test.dart';
-
-// Mocks so I don't have to prepare all the GoogleSignIn environment.
-class MockGoogleSignIn extends Mock implements GoogleSignIn {}
-
-class MockGoogleSignInAuthentication extends Mock
-    implements GoogleSignInAuthentication {}
+import 'package:test/fake.dart';
 
 const SOME_FAKE_ACCESS_TOKEN = 'this-is-something-not-null';
-const SOME_FAKE_SCOPES = ['some-scope', 'another-scope'];
+const DEBUG_FAKE_SCOPES = <String>['some-scope', 'another-scope'];
+const SIGN_IN_FAKE_SCOPES = <String>['some-scope', 'another-scope'];
+
+class FakeGoogleSignIn extends Fake implements GoogleSignIn {
+  final List<String> scopes = SIGN_IN_FAKE_SCOPES;
+}
+
+class FakeGoogleSignInAuthentication extends Fake
+    implements GoogleSignInAuthentication {
+  final String accessToken = SOME_FAKE_ACCESS_TOKEN;
+}
 
 void main() {
-  GoogleSignIn signIn = MockGoogleSignIn();
-  final authMock = MockGoogleSignInAuthentication();
-
-  setUp(() {
-    when(authMock.accessToken).thenReturn(SOME_FAKE_ACCESS_TOKEN);
-  });
+  GoogleSignIn signIn = FakeGoogleSignIn();
+  final authMock = FakeGoogleSignInAuthentication();
 
   test('authenticatedClient returns an authenticated client', () async {
     final client = await signIn.authenticatedClient(
@@ -34,13 +34,21 @@
     expect(client, isA<auth.AuthClient>());
   });
 
+  test('authenticatedClient uses GoogleSignIn scopes by default', () async {
+    final client = (await signIn.authenticatedClient(
+      debugAuthentication: authMock,
+    ))!;
+    expect(client.credentials.accessToken.data, equals(SOME_FAKE_ACCESS_TOKEN));
+    expect(client.credentials.scopes, equals(SIGN_IN_FAKE_SCOPES));
+  });
+
   test('authenticatedClient returned client contains the passed-in credentials',
       () async {
-    final client = await signIn.authenticatedClient(
+    final client = (await signIn.authenticatedClient(
       debugAuthentication: authMock,
-      debugScopes: SOME_FAKE_SCOPES,
-    );
+      debugScopes: DEBUG_FAKE_SCOPES,
+    ))!;
     expect(client.credentials.accessToken.data, equals(SOME_FAKE_ACCESS_TOKEN));
-    expect(client.credentials.scopes, equals(SOME_FAKE_SCOPES));
+    expect(client.credentials.scopes, equals(DEBUG_FAKE_SCOPES));
   });
 }