| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /*
- * Copyright 2019 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #import <XCTest/XCTest.h>
- #import "FIRAuthApiTestsBase.h"
- /** Facebook app access token that will be used for Facebook Graph API, which is different from
- * account access token.
- */
- static NSString *const kFacebookAppAccessToken = KFACEBOOK_APP_ACCESS_TOKEN;
- /** Facebook app ID that will be used for Facebook Graph API. */
- static NSString *const kFacebookAppID = KFACEBOOK_APP_ID;
- static NSString *const kFacebookGraphApiAuthority = @"graph.facebook.com";
- static NSString *const kFacebookTestAccountName = KFACEBOOK_USER_NAME;
- @interface FacebookAuthTests : FIRAuthApiTestsBase
- @end
- @implementation FacebookAuthTests
- // TODO(#10752) - Update and fix the Facebook login Sample app and tests.
- - (void)SKIPtestSignInWithFaceboook {
- FIRAuth *auth = [FIRAuth auth];
- if (!auth) {
- XCTFail(@"Could not obtain auth object.");
- }
- NSDictionary *userInfoDict = [self createFacebookTestingAccount];
- NSString *facebookAccessToken = userInfoDict[@"access_token"];
- NSLog(@"Facebook testing account access token is: %@", facebookAccessToken);
- NSString *facebookAccountId = userInfoDict[@"id"];
- NSLog(@"Facebook testing account id is: %@", facebookAccountId);
- FIRAuthCredential *credential =
- [FIRFacebookAuthProvider credentialWithAccessToken:facebookAccessToken];
- XCTestExpectation *expectation = [self expectationWithDescription:@"Facebook sign-in finished."];
- [auth signInWithCredential:credential
- completion:^(FIRAuthDataResult *result, NSError *error) {
- if (error) {
- NSLog(@"Facebook sign in error: %@", error);
- }
- [expectation fulfill];
- }];
- [self waitForExpectationsWithTimeout:kExpectationsTimeout
- handler:^(NSError *error) {
- if (error != nil) {
- XCTFail(@"Failed to wait for expectations "
- @"in Facebook sign in. Error: %@",
- error.localizedDescription);
- }
- }];
- XCTAssertEqualObjects(auth.currentUser.displayName, kFacebookTestAccountName);
- // Clean up the created Firebase/Facebook user for future runs.
- [self deleteCurrentUser];
- [self deleteFacebookTestingAccountbyId:facebookAccountId];
- }
- // TODO(#10752) - Update and fix the Facebook login Sample app and tests.
- - (void)SKIPtestLinkAnonymousAccountToFacebookAccount {
- FIRAuth *auth = [FIRAuth auth];
- if (!auth) {
- XCTFail(@"Could not obtain auth object.");
- }
- [self signInAnonymously];
- NSDictionary *userInfoDict = [self createFacebookTestingAccount];
- NSString *facebookAccessToken = userInfoDict[@"access_token"];
- NSLog(@"Facebook testing account access token is: %@", facebookAccessToken);
- NSString *facebookAccountId = userInfoDict[@"id"];
- NSLog(@"Facebook testing account id is: %@", facebookAccountId);
- FIRAuthCredential *credential =
- [FIRFacebookAuthProvider credentialWithAccessToken:facebookAccessToken];
- XCTestExpectation *expectation = [self expectationWithDescription:@"Facebook linking finished."];
- [auth.currentUser linkWithCredential:credential
- completion:^(FIRAuthDataResult *result, NSError *error) {
- if (error) {
- NSLog(@"Link to Facebook error: %@", error);
- }
- [expectation fulfill];
- }];
- [self waitForExpectationsWithTimeout:kExpectationsTimeout
- handler:^(NSError *error) {
- if (error != nil) {
- XCTFail(@"Failed to wait for expectations "
- @"in linking to Facebook. Error: %@",
- error.localizedDescription);
- }
- }];
- NSArray<id<FIRUserInfo>> *providerData = auth.currentUser.providerData;
- XCTAssertEqual([providerData count], 1);
- XCTAssertEqualObjects([providerData[0] providerID], @"facebook.com");
- // Clean up the created Firebase/Facebook user for future runs.
- [self deleteCurrentUser];
- [self deleteFacebookTestingAccountbyId:facebookAccountId];
- }
- /** Creates a Facebook testing account using Facebook Graph API and return a dictionary that
- * constains "id", "access_token", "login_url", "email" and "password" of the created account.
- */
- - (NSDictionary *)createFacebookTestingAccount {
- // Build the URL.
- NSString *urltoCreateTestUser =
- [NSString stringWithFormat:@"https://%@/%@/accounts/test-users", kFacebookGraphApiAuthority,
- kFacebookAppID];
- // Build the POST request.
- NSString *bodyString =
- [NSString stringWithFormat:@"installed=true&name=%@&permissions=read_stream&access_token=%@",
- kFacebookTestAccountName, kFacebookAppAccessToken];
- NSData *postData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
- GTMSessionFetcherService *service = [[GTMSessionFetcherService alloc] init];
- GTMSessionFetcher *fetcher = [service fetcherWithURLString:urltoCreateTestUser];
- fetcher.bodyData = postData;
- [fetcher setRequestValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
- XCTestExpectation *expectation =
- [self expectationWithDescription:@"Creating Facebook account finished."];
- __block NSData *data = nil;
- [fetcher beginFetchWithCompletionHandler:^(NSData *receivedData, NSError *error) {
- if (error) {
- NSLog(@"Creating Facebook account finished with error: %@", error);
- return;
- }
- data = receivedData;
- [expectation fulfill];
- }];
- [self waitForExpectationsWithTimeout:kExpectationsTimeout
- handler:^(NSError *error) {
- if (error != nil) {
- XCTFail(@"Failed to wait for expectations "
- @"in creating Facebook account. Error: %@",
- error.localizedDescription);
- }
- }];
- // Parses the access token from the JSON data.
- NSDictionary *userInfoDict = [NSJSONSerialization JSONObjectWithData:data
- options:kNilOptions
- error:nil];
- return userInfoDict;
- }
- /** Delete a Facebook testing account by account Id using Facebook Graph API. */
- - (void)deleteFacebookTestingAccountbyId:(NSString *)accountId {
- // Build the URL.
- NSString *urltoDeleteTestUser =
- [NSString stringWithFormat:@"https://%@/%@", kFacebookGraphApiAuthority, accountId];
- // Build the POST request.
- NSString *bodyString =
- [NSString stringWithFormat:@"method=delete&access_token=%@", kFacebookAppAccessToken];
- NSData *postData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
- GTMSessionFetcherService *service = [[GTMSessionFetcherService alloc] init];
- GTMSessionFetcher *fetcher = [service fetcherWithURLString:urltoDeleteTestUser];
- fetcher.bodyData = postData;
- [fetcher setRequestValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
- XCTestExpectation *expectation =
- [self expectationWithDescription:@"Deleting Facebook account finished."];
- [fetcher beginFetchWithCompletionHandler:^(NSData *receivedData, NSError *error) {
- NSString *deleteResult = [[NSString alloc] initWithData:receivedData
- encoding:NSUTF8StringEncoding];
- NSLog(@"The result of deleting Facebook account is: %@", deleteResult);
- if (error) {
- NSLog(@"Deleting Facebook account finished with error: %@", error);
- }
- [expectation fulfill];
- }];
- [self waitForExpectationsWithTimeout:kExpectationsTimeout
- handler:^(NSError *error) {
- if (error != nil) {
- XCTFail(@"Failed to wait for expectations "
- @"in deleting Facebook account. Error: %@",
- error.localizedDescription);
- }
- }];
- }
- @end
|