From 771b0f7a6574578bd1c7d1d3c333f26173f33e92 Mon Sep 17 00:00:00 2001 From: Zsika Phillip Date: Mon, 27 Nov 2017 14:17:05 -0800 Subject: Adds Auth Result to Sign In with Custom token (#489) * Adds Auth Result to Sign In with Custom token * Addresses comomments --- Example/Auth/Sample/MainViewController.m | 46 ++++++++++++++++++ Example/Auth/Tests/FIRAuthTests.m | 55 ++++++++++++++++++++++ .../Auth/Tests/FIRVerifyCustomTokenResponseTests.m | 7 +++ 3 files changed, 108 insertions(+) (limited to 'Example/Auth') diff --git a/Example/Auth/Sample/MainViewController.m b/Example/Auth/Sample/MainViewController.m index 6980ec6..5326463 100644 --- a/Example/Auth/Sample/MainViewController.m +++ b/Example/Auth/Sample/MainViewController.m @@ -118,6 +118,12 @@ static NSString *const kSignInEmailPasswordAuthDataResultButtonText = */ static NSString *const kSignInWithCustomTokenButtonText = @"Sign In (BYOAuth)"; +/** @var kSignInWithCustomAuthResultTokenButtonText + @brief The text of the "Sign In with Custom Token (Auth Result)" button. + */ +static NSString *const kSignInWithCustomAuthResultTokenButtonText = @"Sign In with Custom Token" + " (Auth Result)"; + /** @var kSignInAnonymouslyButtonText @brief The text of the "Sign In Anonymously" button. */ @@ -722,6 +728,8 @@ typedef enum { action:^{ [weakSelf signInEmailPasswordAuthDataResult]; }], [StaticContentTableViewCell cellWithTitle:kSignInWithCustomTokenButtonText action:^{ [weakSelf signInWithCustomToken]; }], + [StaticContentTableViewCell cellWithTitle:kSignInWithCustomAuthResultTokenButtonText + action:^{ [weakSelf signInWithCustomTokenAuthResult]; }], [StaticContentTableViewCell cellWithTitle:kSignInAnonymouslyButtonText action:^{ [weakSelf signInAnonymously]; }], [StaticContentTableViewCell cellWithTitle:kSignInAnonymouslyWithAuthResultButtonText @@ -1754,6 +1762,24 @@ static NSDictionary *parseURL(NSString *urlString) { [self presentViewController:dataEntryViewController animated:YES completion:nil]; } +/** @fn signInWithCustomTokenAuthResult + @brief Signs the user in using a manually-entered custom token. + */ +- (void)signInWithCustomTokenAuthResult { + CustomTokenDataEntryViewControllerCompletion action = + ^(BOOL cancelled, NSString *_Nullable userEnteredTokenText) { + if (cancelled) { + [self log:@"CANCELLED:sign-in with custom token cancelled."]; + return; + } + + [self doSignInAndRetrieveDataWithCustomToken:userEnteredTokenText]; + }; + CustomTokenDataEntryViewController *dataEntryViewController = + [[CustomTokenDataEntryViewController alloc] initWithCompletion:action]; + [self presentViewController:dataEntryViewController animated:YES completion:nil]; +} + /** @fn signOut @brief Signs the user out. */ @@ -3070,6 +3096,26 @@ static NSDictionary *parseURL(NSString *urlString) { }]; } +- (void)doSignInAndRetrieveDataWithCustomToken:(NSString *_Nullable)userEnteredTokenText { + [[AppManager auth] signInAndRetrieveDataWithCustomToken:userEnteredTokenText + completion:^(FIRAuthDataResult *_Nullable result, + NSError *_Nullable error) { + if (error) { + [self logFailure:@"sign-in with custom token failed" error:error]; + [self showMessagePromptWithTitle:kSignInErrorAlertTitle + message:error.localizedDescription + showCancelButton:NO + completion:nil]; + return; + } + [self logSuccess:@"sign-in with custom token succeeded."]; + [self showMessagePromptWithTitle:kSignedInAlertTitle + message:result.user.displayName + showCancelButton:NO + completion:nil]; + }]; +} + - (void)updateUserInfo { [_userInfoTableViewCell updateContentsWithUser:[AppManager auth].currentUser]; [_userInMemoryInfoTableViewCell updateContentsWithUser:_userInMemory]; diff --git a/Example/Auth/Tests/FIRAuthTests.m b/Example/Auth/Tests/FIRAuthTests.m index 00a7c7a..80a9ae9 100644 --- a/Example/Auth/Tests/FIRAuthTests.m +++ b/Example/Auth/Tests/FIRAuthTests.m @@ -1248,6 +1248,61 @@ static const NSTimeInterval kWaitInterval = .5; OCMVerifyAll(_mockBackend); } +/** @fn testSignInAndRetrieveDataWithCustomTokenSuccess + @brief Tests the flow of a successful @c signInAndRetrieveDataWithCustomToken:completion: call. + */ +- (void)testSignInAndRetrieveDataWithCustomTokenSuccess { + OCMExpect([_mockBackend verifyCustomToken:[OCMArg any] callback:[OCMArg any]]) + .andCallBlock2(^(FIRVerifyCustomTokenRequest *_Nullable request, + FIRVerifyCustomTokenResponseCallback callback) { + XCTAssertEqualObjects(request.APIKey, kAPIKey); + XCTAssertEqualObjects(request.token, kCustomToken); + XCTAssertTrue(request.returnSecureToken); + dispatch_async(FIRAuthGlobalWorkQueue(), ^() { + id mockVeriyCustomTokenResponse = OCMClassMock([FIRVerifyCustomTokenResponse class]); + [self stubTokensWithMockResponse:mockVeriyCustomTokenResponse]; + callback(mockVeriyCustomTokenResponse, nil); + }); + }); + [self expectGetAccountInfo]; + XCTestExpectation *expectation = [self expectationWithDescription:@"callback"]; + [[FIRAuth auth] signOut:NULL]; + [[FIRAuth auth] signInAndRetrieveDataWithCustomToken:kCustomToken + completion:^(FIRAuthDataResult *_Nullable result, + NSError *_Nullable error) { + XCTAssertTrue([NSThread isMainThread]); + [self assertUser:result.user]; + XCTAssertFalse(result.additionalUserInfo.isNewUser); + XCTAssertNil(error); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; + [self assertUser:[FIRAuth auth].currentUser]; + OCMVerifyAll(_mockBackend); +} + +/** @fn testSignInAndRetrieveDataWithCustomTokenFailure + @brief Tests the flow of a failed @c signInAndRetrieveDataWithCustomToken:completion: call. + */ +- (void)testSignInAndRetrieveDataWithCustomTokenFailure { + OCMExpect([_mockBackend verifyCustomToken:[OCMArg any] callback:[OCMArg any]]) + .andDispatchError2([FIRAuthErrorUtils invalidCustomTokenErrorWithMessage:nil]); + XCTestExpectation *expectation = [self expectationWithDescription:@"callback"]; + [[FIRAuth auth] signOut:NULL]; + [[FIRAuth auth] signInAndRetrieveDataWithCustomToken:kCustomToken + completion:^(FIRAuthDataResult *_Nullable result, + NSError *_Nullable error) { + XCTAssertTrue([NSThread isMainThread]); + XCTAssertNil(result); + XCTAssertEqual(error.code, FIRAuthErrorCodeInvalidCustomToken); + XCTAssertNotNil(error.userInfo[NSLocalizedDescriptionKey]); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; + XCTAssertNil([FIRAuth auth].currentUser); + OCMVerifyAll(_mockBackend); +} + /** @fn testCreateUserWithEmailPasswordSuccess @brief Tests the flow of a successful @c createUserWithEmail:password:completion: call. */ diff --git a/Example/Auth/Tests/FIRVerifyCustomTokenResponseTests.m b/Example/Auth/Tests/FIRVerifyCustomTokenResponseTests.m index b1d9d97..9fe95b1 100644 --- a/Example/Auth/Tests/FIRVerifyCustomTokenResponseTests.m +++ b/Example/Auth/Tests/FIRVerifyCustomTokenResponseTests.m @@ -47,6 +47,11 @@ static NSString *const kExpiresInKey = @"expiresIn"; */ static NSString *const kRefreshTokenKey = @"refreshToken"; +/** @var kIsNewUserKey + @brief The name of the "isNewUser" property in the response. + */ +static NSString *const kIsNewUserKey = @"isNewUser"; + /** @var kTestIDToken @brief Testing ID token for verifying assertion. */ @@ -274,6 +279,7 @@ static const double kAllowedTimeDifference = 0.1; kIDTokenKey : kTestIDToken, kExpiresInKey : kTestExpiresIn, kRefreshTokenKey : kTestRefreshToken, + kIsNewUserKey : @YES, }]; XCTAssert(callbackInvoked); XCTAssertNil(RPCError); @@ -282,6 +288,7 @@ static const double kAllowedTimeDifference = 0.1; NSTimeInterval expiresIn = [RPCResponse.approximateExpirationDate timeIntervalSinceNow]; XCTAssertEqualWithAccuracy(expiresIn, [kTestExpiresIn doubleValue], kAllowedTimeDifference); XCTAssertEqualObjects(RPCResponse.refreshToken, kTestRefreshToken); + XCTAssertTrue(RPCResponse.isNewUser); } @end -- cgit v1.2.3