Merge branch 'g-login' into experiment
This commit is contained in:
commit
e357a0892e
3 changed files with 103 additions and 28 deletions
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
||||||
|
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
import 'package:google_sign_in/google_sign_in.dart';
|
import 'package:google_sign_in/google_sign_in.dart';
|
||||||
|
import 'package:rxdart/rxdart.dart';
|
||||||
|
|
||||||
class GoogleSignInProvider {
|
class GoogleSignInProvider {
|
||||||
final GoogleSignIn _googleSignIn;
|
final GoogleSignIn _googleSignIn;
|
||||||
|
|
@ -11,18 +12,33 @@ class GoogleSignInProvider {
|
||||||
: _googleSignIn = googleSignIn ?? GoogleSignIn(),
|
: _googleSignIn = googleSignIn ?? GoogleSignIn(),
|
||||||
_auth = firebaseAuth ?? FirebaseAuth.instance;
|
_auth = firebaseAuth ?? FirebaseAuth.instance;
|
||||||
|
|
||||||
|
Observable<FirebaseUser> get onAuthStateChange =>
|
||||||
|
Observable(_auth.onAuthStateChanged);
|
||||||
|
|
||||||
Future<FirebaseUser> signIn() async {
|
Future<FirebaseUser> signIn() async {
|
||||||
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
|
try {
|
||||||
final GoogleSignInAuthentication googleAuth =
|
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
|
||||||
await googleUser.authentication;
|
final GoogleSignInAuthentication googleAuth =
|
||||||
|
await googleUser.authentication;
|
||||||
|
|
||||||
final AuthCredential credential = GoogleAuthProvider.getCredential(
|
final AuthCredential credential = GoogleAuthProvider.getCredential(
|
||||||
accessToken: googleAuth.accessToken,
|
accessToken: googleAuth.accessToken,
|
||||||
idToken: googleAuth.idToken,
|
idToken: googleAuth.idToken,
|
||||||
);
|
);
|
||||||
|
|
||||||
final FirebaseUser user = await _auth.signInWithCredential(credential);
|
final FirebaseUser user = await _auth.signInWithCredential(credential);
|
||||||
print("signed in " + user.displayName);
|
return user;
|
||||||
return user;
|
} catch (e) {
|
||||||
|
print('Error signing in with Google: $e');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<FirebaseUser> getCurrentUser() async {
|
||||||
|
return await _auth.currentUser();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> signOut() async {
|
||||||
|
await _auth.signOut();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,24 +9,6 @@ import 'package:do_more/src/resources/firestore_provider.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:mockito/mockito.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<String, dynamic> data;
|
|
||||||
|
|
||||||
MockDocumentSnapshot([this.data]);
|
|
||||||
|
|
||||||
dynamic operator [](String key) => data[key];
|
|
||||||
}
|
|
||||||
|
|
||||||
class MockQuerySnapshot extends Mock implements QuerySnapshot {}
|
|
||||||
|
|
||||||
class MockQuery extends Mock implements Query {}
|
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
final task = TaskModel(
|
final task = TaskModel(
|
||||||
id: '1',
|
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<String, dynamic> data;
|
||||||
|
|
||||||
|
MockDocumentSnapshot([this.data]);
|
||||||
|
|
||||||
|
dynamic operator [](String key) => data[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MockQuerySnapshot extends Mock implements QuerySnapshot {}
|
||||||
|
|
||||||
|
class MockQuery extends Mock implements Query {}
|
||||||
|
|
|
||||||
59
test/src/resources/google_sign_in_provider_test.dart
Normal file
59
test/src/resources/google_sign_in_provider_test.dart
Normal file
|
|
@ -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<FirebaseUser>()));
|
||||||
|
});
|
||||||
|
|
||||||
|
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<FirebaseUser>()));
|
||||||
|
});
|
||||||
|
|
||||||
|
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 {}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue