diff --git a/lib/src/resources/google_sign_in_provider.dart b/lib/src/resources/google_sign_in_provider.dart index 0e3525f..bef9fc3 100644 --- a/lib/src/resources/google_sign_in_provider.dart +++ b/lib/src/resources/google_sign_in_provider.dart @@ -2,6 +2,7 @@ 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; @@ -11,18 +12,33 @@ class GoogleSignInProvider { : _googleSignIn = googleSignIn ?? GoogleSignIn(), _auth = firebaseAuth ?? FirebaseAuth.instance; + Observable get onAuthStateChange => + Observable(_auth.onAuthStateChanged); + Future signIn() async { - final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); - final GoogleSignInAuthentication googleAuth = - await googleUser.authentication; + 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 AuthCredential credential = GoogleAuthProvider.getCredential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); - final FirebaseUser user = await _auth.signInWithCredential(credential); - print("signed in " + user.displayName); - return user; + 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 {}