| // Copyright (c) 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/foundation.dart'; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/widgets.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:google_sign_in/google_sign_in.dart'; |
| import 'package:mockito/mockito.dart'; |
| import 'package:test/test.dart' as test; |
| |
| import 'package:app_flutter/service/google_authentication.dart'; |
| import 'package:app_flutter/sign_in_button.dart'; |
| import 'package:app_flutter/state/flutter_build.dart'; |
| |
| import 'utils/fake_google_account.dart'; |
| |
| void main() { |
| GoogleSignInService mockAuthService; |
| |
| setUp(() { |
| mockAuthService = MockGoogleSignInService(); |
| }); |
| |
| tearDown(() { |
| clearInteractions(mockAuthService); |
| |
| // Image.Network caches images which must be cleared. |
| PaintingBinding.instance.imageCache.clear(); |
| }); |
| |
| testWidgets('shows sign in when not authenticated', |
| (WidgetTester tester) async { |
| when(mockAuthService.isAuthenticated) |
| .thenAnswer((_) async => Future<bool>.value(false)); |
| |
| await tester.pumpWidget( |
| Directionality( |
| textDirection: TextDirection.ltr, |
| child: SignInButton( |
| authService: mockAuthService, |
| ), |
| ), |
| ); |
| await tester.pump(); |
| |
| expect(find.byType(GoogleUserCircleAvatar), findsNothing); |
| expect(find.text('Sign in'), findsOneWidget); |
| }); |
| |
| testWidgets('calls sign in on tap when not authenticated', |
| (WidgetTester tester) async { |
| when(mockAuthService.isAuthenticated) |
| .thenAnswer((_) async => Future<bool>.value(false)); |
| |
| await tester.pumpWidget( |
| Directionality( |
| textDirection: TextDirection.ltr, |
| child: SignInButton( |
| authService: mockAuthService, |
| ), |
| ), |
| ); |
| await tester.pump(); |
| |
| verifyNever(mockAuthService.signIn()); |
| |
| await tester.tap(find.text('Sign in')); |
| await tester.pump(); |
| |
| verify(mockAuthService.signIn()).called(1); |
| }); |
| |
| testWidgets('shows avatar when authenticated', (WidgetTester tester) async { |
| when(mockAuthService.isAuthenticated) |
| .thenAnswer((_) async => Future<bool>.value(true)); |
| |
| final GoogleSignInAccount user = FakeGoogleSignInAccount(); |
| when(mockAuthService.user).thenReturn(user); |
| |
| await tester.pumpWidget( |
| MaterialApp( |
| home: AppBar( |
| leading: SignInButton( |
| authService: mockAuthService, |
| ), |
| ), |
| ), |
| ); |
| await tester.pump(); |
| // TODO(chillers): Remove this web check once issue is resolved. https://github.com/flutter/flutter/issues/44370 |
| if (!kIsWeb) { |
| expect(tester.takeException(), |
| const test.TypeMatcher<NetworkImageLoadException>()); |
| } |
| |
| expect(find.text('Sign in'), findsNothing); |
| expect(find.byType(Image), findsOneWidget); |
| }); |
| |
| testWidgets('calls sign out on tap when authenticated', |
| (WidgetTester tester) async { |
| when(mockAuthService.isAuthenticated) |
| .thenAnswer((_) async => Future<bool>.value(true)); |
| |
| final GoogleSignInAccount user = FakeGoogleSignInAccount(); |
| when(mockAuthService.user).thenReturn(user); |
| |
| await tester.pumpWidget( |
| MaterialApp( |
| home: AppBar( |
| leading: SignInButton( |
| authService: mockAuthService, |
| ), |
| ), |
| ), |
| ); |
| await tester.pump(); |
| if (!kIsWeb) { |
| expect(tester.takeException(), |
| const test.TypeMatcher<NetworkImageLoadException>()); |
| } |
| |
| await tester.tap(find.byType(Image)); |
| await tester.pumpAndSettle(); |
| |
| verifyNever(mockAuthService.signOut()); |
| |
| await tester.tap(find.text('Log out')); |
| |
| verify(mockAuthService.signOut()).called(1); |
| }); |
| } |
| |
| class MockFlutterBuildState extends Mock implements FlutterBuildState {} |
| |
| class MockGoogleSignInService extends Mock implements GoogleSignInService {} |