source/UberRidesTests/RideRequestViewControllerTests.swift (179 lines of code) (raw):
//
// RideRequestViewControllerTests.swift
// UberRides
//
// 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 CoreLocation
import WebKit
@testable import UberCore
@testable import UberRides
class RideRequestViewControllerTests: XCTestCase {
private let timeout: Double = 2
private let testIdentifier = "testAccessTokenIdentifier"
override func setUp() {
super.setUp()
Configuration.plistName = "testInfo"
Configuration.restoreDefaults()
Configuration.shared.isSandbox = true
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
override func tearDown() {
Configuration.restoreDefaults()
super.tearDown()
}
func testAccessTokenMissing_whenNoAccessToken_loginFailed() {
var expectation = false
let expectationClosure: (RideRequestViewController, NSError) -> () = {vc, error in
XCTAssertEqual(error.code, RideRequestViewErrorType.accessTokenMissing.rawValue)
XCTAssertEqual(error.domain, RideRequestViewErrorFactory.errorDomain)
expectation = true
}
let loginManager = LoginManager(loginType: .implicit)
let rideRequestVC = RideRequestViewController(rideParameters: RideParametersBuilder().build(), loginManager: loginManager)
let rideRequestVCDelegateMock = RideRequestViewControllerDelegateMock(testClosure: expectationClosure)
rideRequestVC.delegate = rideRequestVCDelegateMock
XCTAssertNotNil(rideRequestVC.view)
rideRequestVC.load()
loginManager.loginCompletion(accessToken: nil, error: UberAuthenticationErrorFactory.errorForType(ridesAuthenticationErrorType: .unableToSaveAccessToken))
XCTAssertTrue(expectation)
}
func testRideRequestViewLoads_withValidAccessToken() {
var expectation = false
let expectationClosure: () -> () = {
expectation = true
}
let testToken = AccessToken(tokenString: "testTokenString")
_ = TokenManager.save(accessToken: testToken, tokenIdentifier: testIdentifier)
defer {
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestVC = RideRequestViewController(rideParameters: RideParametersBuilder().build(), loginManager: loginManager)
rideRequestVC.rideRequestView = RideRequestViewMock(rideRequestView: rideRequestVC.rideRequestView, testClosure: expectationClosure)
XCTAssertNotNil(rideRequestVC.view)
rideRequestVC.load()
XCTAssertFalse(rideRequestVC.rideRequestView.isHidden)
XCTAssertTrue(expectation)
}
func testLoginViewLoads_whenNoAccessToken() {
_ = TokenManager.deleteToken(identifier: testIdentifier)
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .native)
let rideRequestVC = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager)
XCTAssertNotNil(rideRequestVC.view)
rideRequestVC.load()
XCTAssert(loginManager.loggingIn)
}
func testWidgetLoads_whenLoginSuccess() {
let testToken = AccessToken(tokenString: "test")
_ = TokenManager.deleteToken(identifier: testIdentifier)
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .native)
let rideRequestVC = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager)
XCTAssertNotNil(rideRequestVC.view)
rideRequestVC.load()
loginManager.loginCompletion(accessToken: testToken, error: nil)
XCTAssertFalse(rideRequestVC.rideRequestView.isHidden)
XCTAssertEqual(rideRequestVC.rideRequestView.accessToken, testToken)
}
func testRequestUsesCorrectSource_whenPresented() {
var expectation = false
let expectationClosure: (URLRequest) -> () = { request in
expectation = true
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(RideRequestViewController.sourceString))
break
}
}
}
XCTAssert(foundUserAgent)
}
let testToken = AccessToken(tokenString: "testTokenString")
_ = TokenManager.save(accessToken: testToken, tokenIdentifier: testIdentifier)
defer {
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestVC = RideRequestViewController(rideParameters: RideParametersBuilder().build(), loginManager: loginManager)
XCTAssertNotNil(rideRequestVC.view)
let webViewMock = WebViewMock(frame: CGRect.zero, configuration: WKWebViewConfiguration(), testClosure: expectationClosure)
rideRequestVC.rideRequestView.webView = webViewMock
rideRequestVC.load()
XCTAssertFalse(rideRequestVC.rideRequestView.isHidden)
XCTAssertTrue(expectation)
}
func testPresentNetworkErrorAlert_whenValidAccessToken_whenNetworkError() {
var expectation = false
let networkClosure: () -> () = {
expectation = true
}
let testToken = AccessToken(tokenString: "testTokenString")
_ = TokenManager.save(accessToken: testToken, tokenIdentifier: testIdentifier)
defer {
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestViewControllerMock = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager, loadClosure: nil, networkClosure: networkClosure, presentViewControllerClosure: nil)
(rideRequestViewControllerMock as RideRequestViewDelegate).rideRequestView(rideRequestViewControllerMock.rideRequestView, didReceiveError: RideRequestViewErrorFactory.errorForType(.networkError))
XCTAssertTrue(expectation)
}
func testPresentNetworkErrorAlert_whenNoAccessToken_whenNetworkError() {
var expectation = false
let networkClosure: () -> () = {
expectation = true
}
_ = TokenManager.deleteToken(identifier: testIdentifier)
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestViewControllerMock = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager, loadClosure: nil, networkClosure: networkClosure, presentViewControllerClosure: nil)
(rideRequestViewControllerMock as RideRequestViewDelegate).rideRequestView(rideRequestViewControllerMock.rideRequestView, didReceiveError: RideRequestViewErrorFactory.errorForType(.networkError))
XCTAssertTrue(expectation)
}
func testPresentNetworkErrorAlert_cancelsLoads_presentsAlertView() {
var expectation = false
var requestViewExpectation = false
let presentViewControllerClosure: ((UIViewController, Bool, (() -> Void)?) -> ()) = { (viewController, flag, completion) in
expectation = true
XCTAssertTrue(type(of: viewController) == UIAlertController.self)
}
let testToken = AccessToken(tokenString: "testTokenString")
_ = TokenManager.save(accessToken: testToken, tokenIdentifier: testIdentifier)
defer {
_ = TokenManager.deleteToken(identifier: testIdentifier)
}
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestViewControllerMock = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager, loadClosure: nil, networkClosure: nil, presentViewControllerClosure: presentViewControllerClosure)
let requestViewMock = RideRequestViewMock(rideRequestView: rideRequestViewControllerMock.rideRequestView) { () -> () in
requestViewExpectation = true
}
rideRequestViewControllerMock.rideRequestView = requestViewMock
(rideRequestViewControllerMock as RideRequestViewDelegate).rideRequestView(rideRequestViewControllerMock.rideRequestView, didReceiveError: RideRequestViewErrorFactory.errorForType(.networkError))
XCTAssertTrue(expectation)
XCTAssertTrue(requestViewExpectation)
}
func testPresentNotSupportedErrorAlert_whenNotSupportedError() {
var expectation = false
let notSupportedClosure: () -> () = {
expectation = true
}
_ = TokenManager.deleteToken(identifier: testIdentifier)
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestViewControllerMock = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager, notSupportedClosure: notSupportedClosure)
(rideRequestViewControllerMock as RideRequestViewDelegate).rideRequestView(rideRequestViewControllerMock.rideRequestView, didReceiveError: RideRequestViewErrorFactory.errorForType(.notSupported))
XCTAssertTrue(expectation)
}
func testPresentNotSupportedErrorAlert_presentsAlertView() {
var expectation = false
let presentViewControllerClosure: ((UIViewController, Bool, (() -> Void)?) -> ()) = { (viewController, flag, completion) in
expectation = true
XCTAssertTrue(type(of: viewController) == UIAlertController.self)
}
_ = TokenManager.deleteToken(identifier: testIdentifier)
let loginManager = LoginManager(accessTokenIdentifier: testIdentifier, keychainAccessGroup: Configuration.shared.defaultKeychainAccessGroup, loginType: .implicit)
let rideRequestViewControllerMock = RideRequestViewControllerMock(rideParameters: RideParametersBuilder().build(), loginManager: loginManager, presentViewControllerClosure: presentViewControllerClosure)
(rideRequestViewControllerMock as RideRequestViewDelegate).rideRequestView(rideRequestViewControllerMock.rideRequestView, didReceiveError: RideRequestViewErrorFactory.errorForType(.notSupported))
XCTAssertTrue(expectation)
}
}