From 74cbd24ccffbab70a6354076198029df5b28d3df Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Thu, 22 Aug 2019 21:35:31 -0700 Subject: [PATCH 1/5] Formatting --- packages/firebase_auth/lib/src/id_token_result.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/firebase_auth/lib/src/id_token_result.dart b/packages/firebase_auth/lib/src/id_token_result.dart index c53e9ae5bb4d..4173f0d5de78 100644 --- a/packages/firebase_auth/lib/src/id_token_result.dart +++ b/packages/firebase_auth/lib/src/id_token_result.dart @@ -15,6 +15,14 @@ class IdTokenResult { @visibleForTesting IdTokenResult(this._data, this._app); + /// Constructs a token result from a token. + /// + /// This is useful when apps are implementing [FirebaseUser] and managing their + /// own tokens. + IdTokenResult.fromToken(String token) + : _data = {'token': token}, + _app = null; + final FirebaseApp _app; final Map _data; From 84f88183229961acc833e28f2665d9f186d5e825 Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Sun, 25 Aug 2019 06:27:34 -0700 Subject: [PATCH 2/5] Add test for implementing FirebaseUser --- packages/firebase_auth/lib/src/auth_result.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/firebase_auth/lib/src/auth_result.dart b/packages/firebase_auth/lib/src/auth_result.dart index dd003dac0791..0331ebaba7de 100644 --- a/packages/firebase_auth/lib/src/auth_result.dart +++ b/packages/firebase_auth/lib/src/auth_result.dart @@ -11,6 +11,8 @@ class AuthResult { AuthResult._(this._data, FirebaseApp app) : user = FirebaseUser._(_data['user'].cast(), app); + AuthResult.fromUser(this.user) : _data = null; + final Map _data; /// Returns the currently signed-in [FirebaseUser], or `null` if there isn't From 6c9b516ae1e4de83e6291822363b62f7882d9b7f Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Sun, 25 Aug 2019 06:28:55 -0700 Subject: [PATCH 3/5] Add more test for implementing FirebaseUser --- .../test/firebase_user_test.dart | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 packages/firebase_auth/test/firebase_user_test.dart diff --git a/packages/firebase_auth/test/firebase_user_test.dart b/packages/firebase_auth/test/firebase_user_test.dart new file mode 100755 index 000000000000..e7b35a4c9daf --- /dev/null +++ b/packages/firebase_auth/test/firebase_user_test.dart @@ -0,0 +1,112 @@ +// Copyright 2017 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 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_test/flutter_test.dart'; + +final String testDisplayName = 'testDisplayName'; +final String testToken = 'testToken'; + +class TestFirebaseUser implements FirebaseUser { + String _username; + String _password; + String _email; + String _displayName = testDisplayName; + String _token = testToken; + String _uid; + + @override + Future delete() { + return null; + } + + @override + String get displayName => _displayName; + + @override + String get email => _email; + + @override + Future getIdToken({bool refresh = false}) async { + return IdTokenResult.fromToken(_token); + } + + @override + bool get isAnonymous => false; + + @override + bool get isEmailVerified => true; + + @override + Future linkWithCredential(AuthCredential credential) async { + return AuthResult.fromUser(this); + } + + @override + FirebaseUserMetadata get metadata => null; + + @override + String get phoneNumber => 'None'; + + @override + String get photoUrl => 'None'; + + @override + List get providerData => []; + + @override + String get providerId => 'None'; + + @override + Future reauthenticateWithCredential( + AuthCredential credential) async { + return AuthResult.fromUser(this); + } + + @override + Future reload() async => null; + + @override + Future sendEmailVerification() async => null; + + @override + String get uid => _uid; + + @override + Future unlinkFromProvider(String provider) async => null; + + @override + Future updateEmail(String email) async { + _email = email; + return null; + } + + @override + Future updatePassword(String password) async { + _password = password; + return null; + } + + @override + Future updatePhoneNumberCredential(AuthCredential credential) async => + null; + + @override + Future updateProfile(UserUpdateInfo userUpdateInfo) async { + _displayName = userUpdateInfo.displayName; + return null; + } +} + +void main() { + test('Expect TestFirebaseUser can be constructed and used.', () async { + final FirebaseUser testUser = TestFirebaseUser(); + expect(testUser.displayName, testDisplayName); + expect(testUser.isAnonymous, false); + expect((await testUser.getIdToken()).token, testToken); + expect((await testUser.linkWithCredential(null)).user, testUser); + }); +} From 74bbb970fe574142a7aaf04b9795dd0e852c6e1d Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Sun, 25 Aug 2019 06:31:59 -0700 Subject: [PATCH 4/5] Add some comments --- packages/firebase_auth/lib/src/auth_result.dart | 4 ++++ packages/firebase_auth/test/firebase_user_test.dart | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/firebase_auth/lib/src/auth_result.dart b/packages/firebase_auth/lib/src/auth_result.dart index 0331ebaba7de..947258fca9d2 100644 --- a/packages/firebase_auth/lib/src/auth_result.dart +++ b/packages/firebase_auth/lib/src/auth_result.dart @@ -11,6 +11,10 @@ class AuthResult { AuthResult._(this._data, FirebaseApp app) : user = FirebaseUser._(_data['user'].cast(), app); + /// Constructs a authentication result from a user. + /// + /// This is useful when apps are implementing [FirebaseUser] and managing their + /// own auth mechanism. AuthResult.fromUser(this.user) : _data = null; final Map _data; diff --git a/packages/firebase_auth/test/firebase_user_test.dart b/packages/firebase_auth/test/firebase_user_test.dart index e7b35a4c9daf..7b5d06ccfe19 100755 --- a/packages/firebase_auth/test/firebase_user_test.dart +++ b/packages/firebase_auth/test/firebase_user_test.dart @@ -10,6 +10,10 @@ import 'package:flutter_test/flutter_test.dart'; final String testDisplayName = 'testDisplayName'; final String testToken = 'testToken'; +/// Implements an app specific [FirebaseUser] object. +/// +/// This is useful for making sure APIs used within the object are "implements" +/// friendly with no private constructors. class TestFirebaseUser implements FirebaseUser { String _username; String _password; From 683fd809c46084aa09e62b6c688250288ef353ed Mon Sep 17 00:00:00 2001 From: Mehmet Fidanboylu Date: Sun, 25 Aug 2019 06:45:48 -0700 Subject: [PATCH 5/5] Fix test and analyzer issues --- .../firebase_auth/test/firebase_user_test.dart | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/firebase_auth/test/firebase_user_test.dart b/packages/firebase_auth/test/firebase_user_test.dart index 7b5d06ccfe19..a9973d7bf7bf 100755 --- a/packages/firebase_auth/test/firebase_user_test.dart +++ b/packages/firebase_auth/test/firebase_user_test.dart @@ -11,21 +11,19 @@ final String testDisplayName = 'testDisplayName'; final String testToken = 'testToken'; /// Implements an app specific [FirebaseUser] object. -/// +/// /// This is useful for making sure APIs used within the object are "implements" /// friendly with no private constructors. class TestFirebaseUser implements FirebaseUser { - String _username; - String _password; + String _username = 'test'; + String _password = 'pwd'; String _email; String _displayName = testDisplayName; String _token = testToken; String _uid; @override - Future delete() { - return null; - } + Future delete() async => null; @override String get displayName => _displayName; @@ -39,10 +37,10 @@ class TestFirebaseUser implements FirebaseUser { } @override - bool get isAnonymous => false; + bool get isAnonymous => (_username != null); @override - bool get isEmailVerified => true; + bool get isEmailVerified => (_password != null); @override Future linkWithCredential(AuthCredential credential) async {