aboutsummaryrefslogtreecommitdiffhomepage
path: root/Example
diff options
context:
space:
mode:
authorGravatar Zsika Phillip <protocol86@users.noreply.github.com>2017-09-01 13:38:12 -0700
committerGravatar GitHub <noreply@github.com>2017-09-01 13:38:12 -0700
commit36c20d92b7a1f4ac5cb950df61d381ee60be9670 (patch)
treeaff9aa101a52b54ce04357766ef1d3c3c9b380f6 /Example
parent0ce42970fcc94116700c9e6914bc97ce4dd73d00 (diff)
Add FirAuthUrlPresenter (#222)
* Adds FIRAuthURLPResenter and FIRAuthUIDelegate
Diffstat (limited to 'Example')
-rw-r--r--Example/Auth/Tests/FIRAuthURLPresenterTests.m183
-rw-r--r--Example/Firebase.xcodeproj/project.pbxproj4
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 */,