diff options
author | Zsika Phillip <protocol86@users.noreply.github.com> | 2017-09-01 13:38:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-01 13:38:12 -0700 |
commit | 36c20d92b7a1f4ac5cb950df61d381ee60be9670 (patch) | |
tree | aff9aa101a52b54ce04357766ef1d3c3c9b380f6 /Example | |
parent | 0ce42970fcc94116700c9e6914bc97ce4dd73d00 (diff) |
Add FirAuthUrlPresenter (#222)
* Adds FIRAuthURLPResenter and FIRAuthUIDelegate
Diffstat (limited to 'Example')
-rw-r--r-- | Example/Auth/Tests/FIRAuthURLPresenterTests.m | 183 | ||||
-rw-r--r-- | Example/Firebase.xcodeproj/project.pbxproj | 4 |
2 files changed, 187 insertions, 0 deletions
diff --git a/Example/Auth/Tests/FIRAuthURLPresenterTests.m b/Example/Auth/Tests/FIRAuthURLPresenterTests.m new file mode 100644 index 0000000..602c54a --- /dev/null +++ b/Example/Auth/Tests/FIRAuthURLPresenterTests.m @@ -0,0 +1,183 @@ +/* + * Copyright 2017 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 <Foundation/Foundation.h> +#import <SafariServices/SafariServices.h> +#import <XCTest/XCTest.h> + +#import "FIRAuthURLPresenter.h" +#import "FIRAuthUIDelegate.h" +#import <OCMock/OCMock.h> + +/** @var kExpectationTimeout + @brief The maximum time waiting for expectations to fulfill. + */ +static NSTimeInterval kExpectationTimeout = 1; + +@interface FIRAuthDefaultUIDelegate : NSObject <FIRAuthUIDelegate> +/** @fn defaultUIDelegate + @brief Returns a default FIRAuthUIDelegate object. + @return The default FIRAuthUIDelegate object. + */ ++ (id<FIRAuthUIDelegate>)defaultUIDelegate; +@end + +@interface FIRAuthURLPresenterTests : XCTestCase + +@end + +@implementation FIRAuthURLPresenterTests + +/** @fn testFIRAuthURLPresenterNonNilUIDelegate + @brief Tests @c FIRAuthURLPresenter class showing UI with a non-nil UIDelegate. + */ +- (void)testFIRAuthURLPresenterNonNilUIDelegate { + id mockUIDelegate = OCMProtocolMock(@protocol(FIRAuthUIDelegate)); + NSURL *presenterURL = [NSURL URLWithString:@"https://presenter.url"]; + FIRAuthURLPresenter *presenter = [[FIRAuthURLPresenter alloc] init]; + + if ([SFSafariViewController class]) { + XCTestExpectation *callbackMatcherExpectation = + [self expectationWithDescription:@"callbackMatcher callback"]; + FIRAuthURLCallbackMatcher callbackMatcher = ^BOOL(NSURL *_Nonnull callbackURL) { + XCTAssertEqualObjects(callbackURL, presenterURL); + [callbackMatcherExpectation fulfill]; + return YES; + }; + + XCTestExpectation *completionBlockExpectation = + [self expectationWithDescription:@"completion callback"]; + FIRAuthURLPresentationCompletion completionBlock = ^(NSURL *_Nullable callbackURL, + NSError *_Nullable error) { + XCTAssertEqualObjects(callbackURL, presenterURL); + XCTAssertNil(error); + [completionBlockExpectation fulfill]; + }; + + id presenterArg = [OCMArg isKindOfClass:[SFSafariViewController class]]; + OCMExpect([mockUIDelegate presentViewController:presenterArg + animated:YES + completion:nil]).andDo(^(NSInvocation *invocation) { + __unsafe_unretained id unretainedArgument; + // Indices 0 and 1 indicate the hidden arguments self and _cmd. + // `presentViewController` is at index 2. + [invocation getArgument:&unretainedArgument atIndex:2]; + + SFSafariViewController *viewController = unretainedArgument; + XCTAssertEqual(viewController.delegate, presenter); + XCTAssertTrue([viewController isKindOfClass:[SFSafariViewController class]]); + }); + [presenter presentURL:presenterURL + UIDelegate:mockUIDelegate + callbackMatcher:callbackMatcher + completion:completionBlock]; + OCMVerifyAll(mockUIDelegate); + OCMExpect([mockUIDelegate dismissViewControllerAnimated:OCMOCK_ANY + completion:OCMOCK_ANY]). + andDo(^(NSInvocation *invocation) { + __unsafe_unretained id unretainedArgument; + // Indices 0 and 1 indicate the hidden arguments self and _cmd. + // `completion` is at index 3. + [invocation getArgument:&unretainedArgument atIndex:3]; + void (^finishBlock)() = unretainedArgument; + finishBlock(); + }); + [presenter canHandleURL:presenterURL]; + [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; + OCMVerifyAll(mockUIDelegate); + } +} + +/** @fn testFIRAuthURLPresenterNilUIDelegate + @brief Tests @c FIRAuthURLPresenter class showing UI with a nil UIDelegate. + */ +- (void)testFIRAuthURLPresenterNilUIDelegate { + NSURL *presenterURL = [NSURL URLWithString:@"https://presenter.url"]; + FIRAuthURLPresenter *presenter = [[FIRAuthURLPresenter alloc] init]; + + if ([SFSafariViewController class]) { + XCTestExpectation *callbackMatcherExpectation = + [self expectationWithDescription:@"callbackMatcher callback"]; + FIRAuthURLCallbackMatcher callbackMatcher = ^BOOL(NSURL *_Nonnull callbackURL) { + XCTAssertEqualObjects(callbackURL, presenterURL); + [callbackMatcherExpectation fulfill]; + return YES; + }; + XCTestExpectation *completionBlockExpectation = + [self expectationWithDescription:@"completion callback"]; + FIRAuthURLPresentationCompletion completionBlock = ^(NSURL *_Nullable callbackURL, + NSError *_Nullable error) { + XCTAssertEqualObjects(callbackURL, presenterURL); + XCTAssertNil(error); + [completionBlockExpectation fulfill]; + }; + + id mockUIDelegate = OCMProtocolMock(@protocol(FIRAuthUIDelegate)); + + // Swizzle default UIDelegate + Method method = class_getClassMethod([FIRAuthDefaultUIDelegate class], + @selector(defaultUIDelegate)); + __block IMP originalImplementation; + IMP newImplmentation = imp_implementationWithBlock(^id(id object) { + return mockUIDelegate; + }); + originalImplementation = method_setImplementation(method, newImplmentation); + if ([SFSafariViewController class]) { + id presenterArg = [OCMArg isKindOfClass:[SFSafariViewController class]]; + OCMExpect([mockUIDelegate presentViewController:presenterArg + animated:[OCMArg any] + completion:[OCMArg any]]). + andDo(^(NSInvocation *invocation) { + __unsafe_unretained id unretainedArgument; + // Indices 0 and 1 indicate the hidden arguments self and _cmd. + // `presentViewController` is at index 2. + [invocation getArgument:&unretainedArgument atIndex:2]; + SFSafariViewController *viewController = unretainedArgument; + XCTAssertEqual(viewController.delegate, presenter); + XCTAssertTrue([viewController isKindOfClass:[SFSafariViewController class]]); + }); + } + [presenter presentURL:presenterURL + UIDelegate:nil + callbackMatcher:callbackMatcher + completion:completionBlock]; + OCMVerifyAll(mockUIDelegate); + + OCMExpect([mockUIDelegate dismissViewControllerAnimated:OCMOCK_ANY + completion:OCMOCK_ANY]). + andDo(^(NSInvocation *invocation) { + __unsafe_unretained id unretainedArgument; + // Indices 0 and 1 indicate the hidden arguments self and _cmd. + // `completion` is at index 3. + [invocation getArgument:&unretainedArgument atIndex:3]; + void (^finishBlock)() = unretainedArgument; + finishBlock(); + }); + [presenter canHandleURL:presenterURL]; + [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; + OCMVerifyAll(mockUIDelegate); + // Unswizzle. + imp_removeBlock(method_setImplementation(method, originalImplementation)); + } +} + +#pragma mark - Method Swizzling + ++ (id)mockDefaultUIDelegate { + return OCMProtocolMock(@protocol(FIRAuthUIDelegate)); +} + +@end diff --git a/Example/Firebase.xcodeproj/project.pbxproj b/Example/Firebase.xcodeproj/project.pbxproj index 5658767..e07302d 100644 --- a/Example/Firebase.xcodeproj/project.pbxproj +++ b/Example/Firebase.xcodeproj/project.pbxproj @@ -104,6 +104,7 @@ 79A15731AA31012CD937CF3A /* Pods_Core_Example_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CAD129FFEC477E1129AE6AA1 /* Pods_Core_Example_iOS.framework */; }; 7A02646DEF386689CCFB9011 /* Pods_Core_Tests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE6C9DD139E1FD21DC0F1082 /* Pods_Core_Tests_iOS.framework */; }; 7AE9A7433F2BD9A52022AC71 /* Pods_Messaging_Tests_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F902A29FA956ADD762F6921 /* Pods_Messaging_Tests_iOS.framework */; }; + 7E9485421F578AC4005A3939 /* FIRAuthURLPresenterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E94853F1F578A9D005A3939 /* FIRAuthURLPresenterTests.m */; }; 960665EC1C5F7A0E843A354F /* Pods_Database_Tests_macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 97768125F45377F35CA86EDC /* Pods_Database_Tests_macOS.framework */; }; AFAF36F51EC28C25004BDEE5 /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; }; AFAF36F61EC28C25004BDEE5 /* Shared.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AFAF36F41EC28C25004BDEE5 /* Shared.xcassets */; }; @@ -739,6 +740,7 @@ 6F7376F39846E902979416D4 /* Pods_Database_Example_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Database_Example_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6FAA689FDCBD3261300292D5 /* Pods-Database_IntegrationTests_macOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Database_IntegrationTests_macOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Database_IntegrationTests_macOS/Pods-Database_IntegrationTests_macOS.debug.xcconfig"; sourceTree = "<group>"; }; 73B480AA654FC97FA72C6293 /* Pods_Storage_Example_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Storage_Example_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E94853F1F578A9D005A3939 /* FIRAuthURLPresenterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRAuthURLPresenterTests.m; sourceTree = "<group>"; }; 81E83B5ABAE219234F213B27 /* Pods_Database_Tests_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Database_Tests_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8496034D8156555C5FCF8F14 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; }; 862CC98282A6123508E8CA49 /* Pods-Database_Example_macOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Database_Example_macOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Database_Example_macOS/Pods-Database_Example_macOS.release.xcconfig"; sourceTree = "<group>"; }; @@ -1690,6 +1692,7 @@ DE9314F91E86C6FF0083EDBF /* Tests */ = { isa = PBXGroup; children = ( + 7E94853F1F578A9D005A3939 /* FIRAuthURLPresenterTests.m */, DE750DB51EB3DD4000A75E47 /* FIRAuthAPNSTokenManagerTests.m */, DE750DB61EB3DD4000A75E47 /* FIRAuthAPNSTokenTests.m */, DE750DB71EB3DD4000A75E47 /* FIRAuthAppCredentialManagerTests.m */, @@ -4187,6 +4190,7 @@ D9B0D4201F578F7200A567C2 /* FIRGetProjectConfigResponseTests.m in Sources */, DE9315711E86C71C0083EDBF /* FIRSetAccountInfoResponseTests.m in Sources */, DE93155F1E86C71C0083EDBF /* FIRAuthTests.m in Sources */, + 7E9485421F578AC4005A3939 /* FIRAuthURLPresenterTests.m in Sources */, DE750DBD1EB3DD5B00A75E47 /* FIRAuthAPNSTokenTests.m in Sources */, DE0E5BBE1EA7D93500FAA825 /* FIRAuthAppDelegateProxyTests.m in Sources */, DE0E5BBC1EA7D92E00FAA825 /* FIRVerifyClientResponseTests.m in Sources */, |