From 8c3a8d5274f8b4dd0271860c9cc2049f3862e048 Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Tue, 26 Feb 2019 23:31:23 -0600 Subject: [PATCH] Finished Implementation of the google sign in provider and its tests, moved mock class definitions to the end of the file in all tests --- lib/src/resources/google_login_provider.dart | 28 --------- .../resources/google_sign_in_provider.dart | 44 ++++++++++++++ .../resources/firestore_provider_test.dart | 36 +++++------ .../google_sign_in_provider_test.dart | 59 +++++++++++++++++++ 4 files changed, 121 insertions(+), 46 deletions(-) delete mode 100644 lib/src/resources/google_login_provider.dart create mode 100644 lib/src/resources/google_sign_in_provider.dart create mode 100644 test/src/resources/google_sign_in_provider_test.dart diff --git a/lib/src/resources/google_login_provider.dart b/lib/src/resources/google_login_provider.dart deleted file mode 100644 index 0e3525f..0000000 --- a/lib/src/resources/google_login_provider.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:async'; - -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:google_sign_in/google_sign_in.dart'; - -class GoogleSignInProvider { - final GoogleSignIn _googleSignIn; - final FirebaseAuth _auth; - - GoogleSignInProvider([GoogleSignIn googleSignIn, FirebaseAuth firebaseAuth]) - : _googleSignIn = googleSignIn ?? GoogleSignIn(), - _auth = firebaseAuth ?? FirebaseAuth.instance; - - Future signIn() async { - final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); - final GoogleSignInAuthentication googleAuth = - await googleUser.authentication; - - final AuthCredential credential = GoogleAuthProvider.getCredential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - - final FirebaseUser user = await _auth.signInWithCredential(credential); - print("signed in " + user.displayName); - return user; - } -} diff --git a/lib/src/resources/google_sign_in_provider.dart b/lib/src/resources/google_sign_in_provider.dart new file mode 100644 index 0000000..bef9fc3 --- /dev/null +++ b/lib/src/resources/google_sign_in_provider.dart @@ -0,0 +1,44 @@ +import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:rxdart/rxdart.dart'; + +class GoogleSignInProvider { + final GoogleSignIn _googleSignIn; + final FirebaseAuth _auth; + + GoogleSignInProvider([GoogleSignIn googleSignIn, FirebaseAuth firebaseAuth]) + : _googleSignIn = googleSignIn ?? GoogleSignIn(), + _auth = firebaseAuth ?? FirebaseAuth.instance; + + Observable get onAuthStateChange => + Observable(_auth.onAuthStateChanged); + + Future signIn() async { + try { + final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); + final GoogleSignInAuthentication googleAuth = + await googleUser.authentication; + + final AuthCredential credential = GoogleAuthProvider.getCredential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + final FirebaseUser user = await _auth.signInWithCredential(credential); + return user; + } catch (e) { + print('Error signing in with Google: $e'); + } + return null; + } + + Future getCurrentUser() async { + return await _auth.currentUser(); + } + + Future signOut() async { + await _auth.signOut(); + } +} diff --git a/test/src/resources/firestore_provider_test.dart b/test/src/resources/firestore_provider_test.dart index ba06986..32a7e84 100644 --- a/test/src/resources/firestore_provider_test.dart +++ b/test/src/resources/firestore_provider_test.dart @@ -9,24 +9,6 @@ import 'package:do_more/src/resources/firestore_provider.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; -class MockFirestore extends Mock implements Firestore {} - -class MockCollectionReference extends Mock implements CollectionReference {} - -class MockDocumentReference extends Mock implements DocumentReference {} - -class MockDocumentSnapshot extends Mock implements DocumentSnapshot { - final Map data; - - MockDocumentSnapshot([this.data]); - - dynamic operator [](String key) => data[key]; -} - -class MockQuerySnapshot extends Mock implements QuerySnapshot {} - -class MockQuery extends Mock implements Query {} - main() { final task = TaskModel( id: '1', @@ -253,3 +235,21 @@ main() { }); }); } + +class MockFirestore extends Mock implements Firestore {} + +class MockCollectionReference extends Mock implements CollectionReference {} + +class MockDocumentReference extends Mock implements DocumentReference {} + +class MockDocumentSnapshot extends Mock implements DocumentSnapshot { + final Map data; + + MockDocumentSnapshot([this.data]); + + dynamic operator [](String key) => data[key]; +} + +class MockQuerySnapshot extends Mock implements QuerySnapshot {} + +class MockQuery extends Mock implements Query {} diff --git a/test/src/resources/google_sign_in_provider_test.dart b/test/src/resources/google_sign_in_provider_test.dart new file mode 100644 index 0000000..e7e57d0 --- /dev/null +++ b/test/src/resources/google_sign_in_provider_test.dart @@ -0,0 +1,59 @@ +import 'dart:async'; + +import 'package:do_more/src/resources/google_sign_in_provider.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:mockito/mockito.dart'; + +main() { + group('GoogleSignInProvider', () { + test('should return an instance of user', () { + final googleSignIn = MockGoogleSignIn(); + final auth = MockFirebaseAuth(); + final googleUser = MockGoogleSignInAccount(); + final googleAuth = MockGoogleSignInAuthentication(); + final user = MockFirebaseUser(); + final provider = GoogleSignInProvider(googleSignIn, auth); + + when(googleSignIn.signIn()).thenAnswer((_) => Future.value(googleUser)); + when(googleUser.authentication) + .thenAnswer((_) => Future.value(googleAuth)); + when(auth.signInWithCredential(any)) + .thenAnswer((_) => Future.value(user)); + + expect(provider.signIn(), completion(isInstanceOf())); + }); + + test('should get the current user stored in cache', () { + final auth = MockFirebaseAuth(); + final user = MockFirebaseUser(); + final provider = GoogleSignInProvider(null, auth); + + when(auth.currentUser()).thenAnswer((_) => Future.value(user)); + + expect( + provider.getCurrentUser(), completion(isInstanceOf())); + }); + + test('should sign out a user', () { + final auth = MockFirebaseAuth(); + final provider = GoogleSignInProvider(null, auth); + + when(auth.signOut()).thenAnswer((_) => Future.value()); + + expect(provider.signOut(), completes); + }); + }); +} + +class MockGoogleSignIn extends Mock implements GoogleSignIn {} + +class MockFirebaseAuth extends Mock implements FirebaseAuth {} + +class MockGoogleSignInAccount extends Mock implements GoogleSignInAccount {} + +class MockGoogleSignInAuthentication extends Mock + implements GoogleSignInAuthentication {} + +class MockFirebaseUser extends Mock implements FirebaseUser {}