source/UberCoreTests/DeeplinkManagerTests.swift (101 lines of code) (raw):
//
// DeeplinkManagerTests.swift
// UberCoreTests
//
// Created by Edward Jiang on 12/5/17.
// Copyright © 2017 Uber. All rights reserved.
//
import XCTest
@testable import UberCore
class DeeplinkManagerTests: XCTestCase {
private var deeplinkManager: DeeplinkManager!
private var urlOpener: URLOpeningMock!
private var testDeeplink: TestDeeplink!
override func setUp() {
super.setUp()
deeplinkManager = DeeplinkManager()
urlOpener = URLOpeningMock()
urlOpener.canOpenURLHandler = { _ in true }
deeplinkManager.urlOpener = urlOpener
testDeeplink = TestDeeplink()
}
func testDeeplinkOpensFirstURL() {
let expectCallback = self.expectation(description: "Callback is run")
urlOpener.openURLHandler = { url, completionHandler in
completionHandler?(true) // All URLS can open
}
openDeeplink(testDeeplink) { error in
XCTAssertNil(error)
expectCallback.fulfill()
}
XCTAssertEqual(urlOpener.openURLCallCount, 1)
self.waitForExpectations(timeout: 0.5, handler: nil)
}
func testDeeplinkOpensSecondURL() {
let expectCorrectURLScheme = self.expectation(description: "We need to open up the app2 URL scheme")
let expectCallback = self.expectation(description: "Callback is run")
urlOpener.openURLHandler = { url, completionHandler in
if url.scheme == "app2" {
expectCorrectURLScheme.fulfill()
}
completionHandler?(url.scheme == "app2")
}
openDeeplink(testDeeplink) { error in
XCTAssertNil(error)
expectCallback.fulfill()
}
XCTAssertEqual(urlOpener.openURLCallCount, 2)
self.waitForExpectations(timeout: 0.5, handler: nil)
}
func testDeeplinkErrorsWhenNoFallbacks() {
let expectCallback = self.expectation(description: "Callback is run")
urlOpener.openURLHandler = { url, completionHandler in
completionHandler?(false)
}
openDeeplink(testDeeplink) { error in
let expectedError = DeeplinkErrorFactory.errorForType(DeeplinkErrorType.unableToFollow)
XCTAssertNotNil(error)
XCTAssertEqual(error, expectedError)
expectCallback.fulfill()
}
XCTAssertEqual(urlOpener.openURLCallCount, 4)
self.waitForExpectations(timeout: 0.5, handler: nil)
}
func testDeeplinkOpensURLWhenIOSPromptsPermission() {
let expectCallback = self.expectation(description: "Callback is run")
urlOpener.openURLHandler = { url, completionHandler in
completionHandler?(true) // All URLS can open
}
openDeeplinkWithSuccessfulPrompt(testDeeplink) { error in
XCTAssertNil(error)
expectCallback.fulfill()
}
XCTAssertEqual(urlOpener.openURLCallCount, 1)
self.waitForExpectations(timeout: 0.5, handler: nil)
}
private func openDeeplink(_ deeplink: Deeplinking, completion: @escaping DeeplinkCompletionHandler) {
deeplinkManager.open(deeplink, completion: completion)
NotificationCenter.default.post(Notification(name: Notification.Name.UIApplicationDidEnterBackground))
}
private func openDeeplinkWithSuccessfulPrompt(_ deeplink: Deeplinking, completion: @escaping DeeplinkCompletionHandler) {
deeplinkManager.open(deeplink, completion: completion)
NotificationCenter.default.post(Notification(name: Notification.Name.UIApplicationWillResignActive))
NotificationCenter.default.post(Notification(name: Notification.Name.UIApplicationDidBecomeActive))
NotificationCenter.default.post(Notification(name: Notification.Name.UIApplicationDidEnterBackground))
}
}
private class TestDeeplink: Deeplinking {
func execute(completion: DeeplinkCompletionHandler?) {}
var url: URL = URL(string: "app1://test")!
var fallbackURLs: [URL] = [URL(string: "app2://test")!,
URL(string: "app3://test")!,
URL(string: "https://test")!]
}
private class URLOpeningMock: URLOpening {
var canOpenURLCallCount = 0
var canOpenURLHandler: ((URL) -> Bool)?
func canOpenURL(_ url: URL) -> Bool {
canOpenURLCallCount += 1
return canOpenURLHandler?(url) ?? false
}
var openURLCallCount = 0
var openURLHandler: ((URL, ((Bool) -> Void)?) -> Void)?
func open(_ url: URL,
completionHandler: ((Bool) -> Void)?) {
openURLCallCount += 1
openURLHandler?(url, completionHandler)
}
}