Skip to content

Commit

Permalink
improve Facebook and Twitter provider unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
yramanchuk committed Sep 30, 2016
1 parent 67eb93f commit aab3230
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 39 deletions.
8 changes: 7 additions & 1 deletion FirebaseFacebookAuthUI/FIRFacebookAuthUI.m
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,13 @@ - (void)configureProvider {
@"https://developers.facebook.com/docs/ios/getting-started"];
}

_loginManager = [[FBSDKLoginManager alloc] init];
_loginManager = [self createLoginManger];
}

#pragma mark - Private methods

- (FBSDKLoginManager *)createLoginManger {
return [[FBSDKLoginManager alloc] init];
}

@end
6 changes: 6 additions & 0 deletions FirebaseFacebookAuthUITests/FIRFacebookAuthUITest.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
#import <FirebaseFacebookAuthUI/FirebaseFacebookAuthUI.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

@interface FIRFacebookAuthUI (Testing)
- (FBSDKLoginManager *)createLoginManger;
+ (NSBundle *)frameworkBundle;
- (void)configureProvider;
@end

@interface FIRFacebookAuthUITest : FIRFacebookAuthUI
- (void)configureLoginManager:(FBSDKLoginManagerLoginResult *)result withError:(NSError *)error;

Expand Down
9 changes: 2 additions & 7 deletions FirebaseFacebookAuthUITests/FIRFacebookAuthUITest.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,10 @@ - (void)logInWithReadPermissions:(NSArray *)permissions
@end



@implementation FIRFacebookAuthUITest

- (instancetype)initWithPermissions:(NSArray *)permissions {
if (self = [super initWithPermissions:permissions]) {
_loginManager = [[FBSDKLoginManagerTest alloc] init];
}

return self;
- (FBSDKLoginManager *)createLoginManger {
return [[FBSDKLoginManagerTest alloc] init];
}

+ (NSBundle *)frameworkBundle {
Expand Down
61 changes: 52 additions & 9 deletions FirebaseFacebookAuthUITests/FirebaseFacebookAuthUITests.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#import <FirebaseAuthUI/FirebaseAuthUI.h>
#import <FirebaseAuth/FirebaseAuth.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <OCMock/OCMock.h>

@interface FirebaseFacebookAuthUITests : XCTestCase
@property (nonatomic, strong) FIRFacebookAuthUITest *provider;
Expand All @@ -32,7 +33,12 @@ - (void)setUp {
self.provider = [[FIRFacebookAuthUITest alloc] init];
}

- (void)testItExists {
- (void)tearDown {
self.provider = nil;
[super tearDown];
}

- (void)testProviderValidity {
XCTAssertNotNil(self.provider);
XCTAssertNotNil(self.provider.icon);
XCTAssertNotNil(self.provider.signInLabel);
Expand All @@ -51,12 +57,13 @@ - (void)testSuccessfullLogin {
FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:testToken
permissions:@[]
declinedPermissions:@[]
appID:@""
userID:@""
appID:@"testAppId"
userID:@"testUserId"
expirationDate:nil
refreshDate:nil];
id mockToken = OCMPartialMock(token);

FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:token
FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:mockToken
isCancelled:NO
grantedPermissions:nil
declinedPermissions:nil];
Expand All @@ -72,16 +79,28 @@ - (void)testSuccessfullLogin {
FIRAuthCredential *expectedCredential = [FIRFacebookAuthProvider credentialWithAccessToken:testToken];
XCTAssertEqualObjects(credential.provider, expectedCredential.provider);
XCTAssertNil(self.provider.idToken);
//TODO: test access token validity

//verify that we are using token from server
OCMVerify([mockToken tokenString]);

[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:0.2 handler:^(NSError * _Nullable error) {
[self waitForExpectationsWithTimeout:0.1 handler:^(NSError * _Nullable error) {
XCTAssertNil(error);
}];
}

- (void)testCancelLogin {
FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:nil
NSString *testToken = @"fakeToken";
FBSDKAccessToken *token = [[FBSDKAccessToken alloc] initWithTokenString:testToken
permissions:@[]
declinedPermissions:@[]
appID:@"testAppId"
userID:@"testUserId"
expirationDate:nil
refreshDate:nil];
id mockToken = OCMPartialMock(token);
FBSDKLoginManagerLoginResult *result = [[FBSDKLoginManagerLoginResult alloc] initWithToken:mockToken
isCancelled:YES
grantedPermissions:nil
declinedPermissions:nil];
Expand All @@ -96,9 +115,13 @@ - (void)testCancelLogin {
XCTAssertEqual(error.code, FIRAuthUIErrorCodeUserCancelledSignIn);
XCTAssertNil(credential);
XCTAssertNil(self.provider.idToken);

//verify that we are not using token from server if user canceled request
OCMReject([mockToken tokenString]);

[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:0.2 handler:^(NSError * _Nullable error) {
[self waitForExpectationsWithTimeout:0.1 handler:^(NSError * _Nullable error) {
XCTAssertNil(error);
}];
}
Expand All @@ -119,9 +142,29 @@ - (void)testErrorLogin {
XCTAssertNil(self.provider.idToken);
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:0.2 handler:^(NSError * _Nullable error) {
[self waitForExpectationsWithTimeout:0.1 handler:^(NSError * _Nullable error) {
XCTAssertNil(error);
}];
}

- (void)testSignOut {

// used to make possible initialization of FIRFacebookAuthUI
id mockProviderClass = OCMClassMock([FIRFacebookAuthUI class]);
OCMStub(ClassMethod([mockProviderClass frameworkBundle])).andReturn([NSBundle bundleForClass:[self class]]);

id mockProvider = OCMPartialMock([[FIRFacebookAuthUI alloc] init]);
id mockFacebookManager = OCMClassMock([FBSDKLoginManager class]);

// stub login manager
OCMStub(ClassMethod([mockProvider frameworkBundle])).andReturn([NSBundle bundleForClass:[self class]]);
OCMStub([mockProvider createLoginManger]).andReturn(mockFacebookManager);
[mockProvider configureProvider];

[mockProvider signOut];

OCMVerify([mockFacebookManager logOut]);

}

@end
4 changes: 2 additions & 2 deletions FirebaseTwitterAuthUI/FIRTwitterAuthUI.m
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ - (void)signInWithEmail:(nullable NSString *)email
presentingViewController:(nullable UIViewController *)presentingViewController
completion:(nullable FIRAuthProviderSignInCompletionBlock)completion {

[[self getTwitterManager]
logInWithCompletion:^(TWTRSession * _Nullable session, NSError * _Nullable error) {
[[self getTwitterManager] logInWithViewController:presentingViewController
completion:^(TWTRSession * _Nullable session, NSError * _Nullable error) {
if (session) {
FIRAuthCredential *credential =
[FIRTwitterAuthProvider credentialWithToken:session.authToken
Expand Down
47 changes: 29 additions & 18 deletions FirebaseTwitterAuthUITests/FirebaseTwitterAuthUITests.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ - (void)setUp {
self.provider = [[FIRTwitterAuthUI alloc] init];
}

- (void)tearDown {
self.provider = nil;
[super tearDown];
}

- (void)testProviderValidity {
XCTAssertNotNil(self.provider);
XCTAssertNotNil(self.provider.icon);
Expand All @@ -48,77 +53,83 @@ - (void)testProviderValidity {
XCTAssertNotNil(self.provider.providerID);
XCTAssertNotNil(self.provider.shortName);
XCTAssertTrue(self.provider.signInLabel.length != 0);
XCTAssertNil(self.provider.accessToken);
XCTAssertNil(self.provider.idToken);
}


- (void)testSuccessfullLogin {
XCTAssertNotNil(self.provider);
XCTAssertNil(self.provider.accessToken);

id mockerProvider = OCMPartialMock(self.provider);
id mockedProvider = OCMPartialMock(self.provider);
id mockedTwitterManager = OCMPartialMock([Twitter sharedInstance]);

NSString *testToken = @"authToken";
NSString *testSecret = @"secret";
TWTRSession *session = [[TWTRSession alloc] initWithAuthToken:testToken
authTokenSecret:testSecret
userName:@"tsetUser"
userID:@"userID"];
authTokenSecret:testSecret
userName:@"testUser"
userID:@"userID"];
id mockSession = OCMPartialMock(session);

OCMStub([mockerProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedTwitterManager logInWithCompletion:([OCMArg invokeBlockWithArgs:session, [NSNull null], nil])]);
OCMStub([mockedProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedTwitterManager logInWithViewController:nil completion:([OCMArg invokeBlockWithArgs:mockSession, [NSNull null], nil])]);


XCTestExpectation *expectation = [self expectationWithDescription:@"logged in"];
[mockerProvider signInWithEmail:nil
[mockedProvider signInWithEmail:nil
presentingViewController:nil
completion:^(FIRAuthCredential * _Nullable credential, NSError * _Nullable error) {
XCTAssertNil(error);
XCTAssertNotNil(credential);
FIRAuthCredential *expectedCredential = [FIRTwitterAuthProvider credentialWithToken:testToken secret:testSecret];
XCTAssertEqualObjects(credential.provider, expectedCredential.provider);
//TODO: test access token validity

//verify that we are using token from server
OCMVerify([mockSession authToken]);
OCMVerify([mockSession authTokenSecret]);

[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:0.1 handler:^(NSError * _Nullable error) {
XCTAssertNil(error);
}];

OCMVerify([mockerProvider getTwitterManager]);
OCMVerify([mockedProvider getTwitterManager]);
}

- (void)testErrorLogin {
XCTAssertNotNil(self.provider);
XCTAssertNil(self.provider.accessToken);

id mockerProvider = OCMPartialMock(self.provider);
id mockedProvider = OCMPartialMock(self.provider);
id mockedTwitterManager = OCMPartialMock([Twitter sharedInstance]);

NSError *loginError = [NSError errorWithDomain:@"errorDomain" code:777 userInfo:nil];

OCMStub([mockerProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedTwitterManager logInWithCompletion:([OCMArg invokeBlockWithArgs:[NSNull null], loginError, nil])]);
OCMStub([mockedProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedTwitterManager logInWithViewController:nil completion:([OCMArg invokeBlockWithArgs:[NSNull null], loginError, nil])]);


XCTestExpectation *expectation = [self expectationWithDescription:@"logged in"];
[mockerProvider signInWithEmail:nil
[mockedProvider signInWithEmail:nil
presentingViewController:nil
completion:^(FIRAuthCredential * _Nullable credential, NSError * _Nullable error) {
XCTAssertNil(credential);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.userInfo[NSUnderlyingErrorKey], loginError);
//TODO: test access token validity
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:0.1 handler:^(NSError * _Nullable error) {
XCTAssertNil(error);
}];

OCMVerify([mockerProvider getTwitterManager]);
OCMVerify([mockedProvider getTwitterManager]);
}

- (void)testSignOut {
id mockerProvider = OCMPartialMock(self.provider);
id mockedProvider = OCMPartialMock(self.provider);
id mockedTwitterManager = OCMPartialMock([Twitter sharedInstance]);

id mockedSessionStore = OCMClassMock([TWTRSessionStore class]);
Expand All @@ -128,10 +139,10 @@ - (void)testSignOut {
OCMStub([mockedTwitterClient userID]).andReturn(testClientId);
OCMStub(ClassMethod([mockedTwitterClient clientWithCurrentUser])).andReturn(mockedTwitterClient);

OCMStub([mockerProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedProvider getTwitterManager]).andReturn(mockedTwitterManager);
OCMStub([mockedTwitterManager sessionStore]).andReturn(mockedSessionStore);

[mockerProvider signOut];
[mockedProvider signOut];
//verify we are calling sign out method
OCMVerify([mockedSessionStore logOutUserID:testClientId]);
}
Expand Down
4 changes: 2 additions & 2 deletions Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ target 'FirebaseFacebookAuthUI' do

target 'FirebaseFacebookAuthUITests' do
inherit! :search_paths
pod 'OCMock'
end
end

Expand All @@ -46,6 +47,7 @@ target 'FirebaseGoogleAuthUI' do

target 'FirebaseGoogleAuthUITests' do
inherit! :search_paths
pod 'OCMock'
end
end

Expand All @@ -56,8 +58,6 @@ target 'FirebaseTwitterAuthUI' do
target 'FirebaseTwitterAuthUITests' do
inherit! :search_paths
pod 'OCMock'
# pod 'TwitterKit', '~> 2.4'
# pod 'Firebase/Auth'
end
end

Expand Down

0 comments on commit aab3230

Please sign in to comment.