source/UberRidesTests/RideRequestViewTests.swift (153 lines of code) (raw):
//
// RideRequestViewTests.swift
// UberRides
//
// Copyright © 2016 Uber Technologies, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import XCTest
import WebKit
import UberCore
@testable import UberRides
class RideRequestViewTests: XCTestCase {
var testExpectation: XCTestExpectation!
var error: NSError?
let timeout: TimeInterval = 10
override func setUp() {
super.setUp()
Configuration.plistName = "testInfo"
Configuration.restoreDefaults()
Configuration.shared.isSandbox = true
}
override func tearDown() {
Configuration.restoreDefaults()
super.tearDown()
}
/**
Test that access token expiration is routed to delegate.
*/
func testAccessTokenExpired() {
testExpectation = expectation(description: "access token expired delegate call")
let view = RideRequestView(rideParameters: RideParametersBuilder().build())
view.delegate = self
let request = URLRequest(url: URL(string: "uberConnect://oauth#error=unauthorized")!)
view.webView.load(request)
waitForExpectations(timeout: timeout, handler: { error in
XCTAssertNil(error)
})
}
/**
Test the an unknown error message is routed to delegate.
*/
func testUnkownError() {
testExpectation = expectation(description: "unknown error delegate call")
let view = RideRequestView()
view.delegate = self
let request = URLRequest(url: URL(string: "uberConnect://oauth#error=on_fire")!)
view.webView.load(request)
waitForExpectations(timeout: timeout, handler: { error in
XCTAssertNil(error)
XCTAssertNotNil(self.error)
XCTAssertEqual(self.error?.code, RideRequestViewErrorType.unknown.rawValue)
XCTAssertEqual(self.error?.domain, RideRequestViewErrorFactory.errorDomain)
})
}
/**
Test that no exception is thrown for authorization if custom access token is passed.
*/
func testAuthorizeWithCustomAccessToken() {
let token = AccessToken(tokenString: "accessToken1234")
let view = RideRequestView(rideParameters: RideParametersBuilder().build(), accessToken: token, frame: CGRect.zero)
XCTAssertNotNil(view.accessToken)
XCTAssertEqual(view.accessToken, token)
}
/**
Test that authorization passes with token in token manager.
*/
func testAuthorizeWithTokenManagerAccessToken() {
let token = AccessToken(tokenString: "accessToken1234")
_ = TokenManager.save(accessToken: token)
let view = RideRequestView()
XCTAssertNotNil(view.accessToken)
XCTAssertEqual(view.accessToken?.tokenString, TokenManager.fetchToken()?.tokenString)
_ = TokenManager.deleteToken()
}
/**
Test that load is successful when access token is set after initialization.
*/
func testAuthorizeWithTokenSetAfterInitialization() {
let token = AccessToken(tokenString: "accessToken1234")
let view = RideRequestView()
view.accessToken = token
XCTAssertNotNil(view.accessToken)
}
/**
Test that exception is thrown without passing in custom access token (and none in TokenManager).
*/
func testAuthorizeFailsWithoutAccessToken() {
testExpectation = expectation(description: "access token missing delegate call")
let view = RideRequestView()
view.delegate = self
_ = TokenManager.deleteToken()
view.load()
waitForExpectations(timeout: timeout, handler: { error in
XCTAssertEqual(self.error?.code, RideRequestViewErrorType.accessTokenMissing.rawValue)
XCTAssertEqual(self.error?.domain, RideRequestViewErrorFactory.errorDomain)
XCTAssertNil(error)
})
}
func testRequestUsesCorrectSource_whenPresented() {
testExpectation = expectation(description: "Test RideRequestView source call")
let expectationClosure: (URLRequest) -> () = { request in
self.testExpectation.fulfill()
guard let url = request.url, let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let items = components.queryItems else {
XCTAssert(false)
return
}
XCTAssertTrue(items.count > 0)
var foundUserAgent = false
for item in items {
if (item.name == "user-agent") {
if let value = item.value {
foundUserAgent = true
XCTAssertTrue(value.contains(RideRequestView.sourceString))
break
}
}
}
XCTAssert(foundUserAgent)
}
let testIdentifier = "testAccessTokenIdentifier"
_ = TokenManager.deleteToken(identifier: testIdentifier)
let testToken = AccessToken(tokenString: "testTokenString")
_ = TokenManager.save(accessToken: testToken, tokenIdentifier: testIdentifier)
defer {
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
let rideRequestView = RideRequestView(rideParameters: RideParametersBuilder().build(), accessToken: TokenManager.fetchToken(identifier: testIdentifier), frame: CGRect.zero)
XCTAssertNotNil(rideRequestView)
let webViewMock = WebViewMock(frame: CGRect.zero, configuration: WKWebViewConfiguration(), testClosure: expectationClosure)
rideRequestView.webView.scrollView.delegate = nil
rideRequestView.webView = webViewMock
rideRequestView.load()
waitForExpectations(timeout: timeout, handler: { error in
XCTAssertNil(error)
})
}
func testNotSupportedDelegateCalled_whenTel() {
testExpectation = expectation(description: "Delegate called")
let cancelRequestExpectation = expectation(description: "Request was cancelled")
let rideRequestView = RideRequestView(rideParameters: RideParametersBuilder().build(), accessToken:nil, frame:CGRect.zero)
rideRequestView.delegate = self
let telURLString = "tel:5555555555"
guard let telURL = URL(string: telURLString) else {
XCTAssert(false)
return
}
let telURLRequest = URLRequest(url: telURL)
let navigationActionMock = WKNavigationActionMock(urlRequest: telURLRequest)
if let delegate = rideRequestView.webView.navigationDelegate {
delegate.webView!(rideRequestView.webView, decidePolicyFor: navigationActionMock, decisionHandler: { (policy: WKNavigationActionPolicy) -> Void in
XCTAssertEqual(policy, WKNavigationActionPolicy.cancel)
cancelRequestExpectation.fulfill()
})
waitForExpectations(timeout: timeout, handler: { error in
XCTAssertNotNil(self.error)
XCTAssertEqual(self.error?.code, RideRequestViewErrorType.notSupported.rawValue)
})
} else {
XCTAssert(false)
}
}
}
private class WKNavigationActionMock : WKNavigationAction {
override var request: URLRequest {
return backingRequest
}
var backingRequest: URLRequest
init(urlRequest: URLRequest) {
backingRequest = urlRequest
super.init()
}
}
extension RideRequestViewTests: RideRequestViewDelegate {
func rideRequestView(_ rideRequestView: RideRequestView, didReceiveError error: NSError) {
self.error = error
testExpectation.fulfill()
}
}