source/UberRidesTests/RequestDeeplinkTests.swift (196 lines of code) (raw):

// // RequestDeeplinkTests.swift // UberRidesTests // // Copyright © 2015 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 CoreLocation import UberCore @testable import UberRides let clientID = "clientID1234" let serverToken = "serverToken1234" let redirectURI = "http://localhost:1234/" let productID = "productID1234" let pickupLat = 37.770 let pickupLong = -122.466 let dropoffLat = 37.791 let dropoffLong = -122.405 let pickupNickname = "California Academy of Science" let pickupAddress = "55 Music Concourse Drive, San Francisco" let dropoffNickname = "Pier 39" let dropoffAddress = "Beach Street & The Embarcadero, San Francisco" let surgeConfirm = "surgeConfirm" let paymentMethod = "paymentMethod" struct ExpectedDeeplink { static let uberScheme = "uber://?" static let clientIDQuery = "client_id=\(clientID)" static let productIDQuery = "product_id=\(productID)" static let setPickupAction = "action=setPickup" static let defaultPickupQuery = "pickup=my_location" static let pickupLatQuery = "pickup[latitude]=\(pickupLat)" static let pickupLongQuery = "pickup[longitude]=\(pickupLong)" static let pickupNicknameQuery = "pickup[nickname]=\(pickupNickname)" static let pickupAddressQuery = "pickup[formatted_address]=\(pickupAddress)" static let dropoffLatQuery = "dropoff[latitude]=\(dropoffLat)" static let dropoffLongQuery = "dropoff[longitude]=\(dropoffLong)" static let dropoffNicknameQuery = "dropoff[nickname]=\(dropoffNickname)" static let dropoffAddressQuery = "dropoff[formatted_address]=\(dropoffAddress)" } class UberRidesDeeplinkTests: XCTestCase { private var versionNumber: String? private var expectedDeeplinkUserAgent: String? private var expectedButtonUserAgent: String? let timeout: Double = 2 override func setUp() { super.setUp() Configuration.plistName = "testInfo" Configuration.restoreDefaults() Configuration.shared.clientID = clientID Configuration.shared.isSandbox = true versionNumber = Bundle(for: RideParameters.self).object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String expectedDeeplinkUserAgent = "rides-ios-v\(versionNumber!)-deeplink" expectedButtonUserAgent = "rides-ios-v\(versionNumber!)-button" } override func tearDown() { Configuration.restoreDefaults() super.tearDown() } /** Test to build an UberDeeplink with no PickupLatLng and assign user's current location as default */ func testBuildDeeplinkWithClientIDHasDefaultParameters() { let deeplink = RequestDeeplink() let uri = deeplink.url.absoluteString XCTAssertTrue(uri.contains(ExpectedDeeplink.uberScheme)) let components = URLComponents(string: uri) XCTAssertEqual(components?.queryItems?.count, 4) let query = components?.query XCTAssertTrue(query!.contains(ExpectedDeeplink.clientIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.setPickupAction)) XCTAssertTrue(query!.contains(ExpectedDeeplink.defaultPickupQuery)) XCTAssertTrue(query!.contains(expectedDeeplinkUserAgent!)) } /** Test to build an UberDeeplink with a Pickup Latitude and Longitude. */ func testBuildDeeplinkWithPickupLatLng() { let location = CLLocation(latitude: pickupLat, longitude: pickupLong) let builder = RideParametersBuilder() builder.pickupLocation = location let rideParams = builder.build() let deeplink = RequestDeeplink(rideParameters: rideParams) let components = URLComponents(url: deeplink.url, resolvingAgainstBaseURL: false) XCTAssertEqual(components?.queryItems?.count, 5) let query = components?.query XCTAssertTrue(query!.contains(ExpectedDeeplink.clientIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.setPickupAction)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLatQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLongQuery)) XCTAssertTrue(query!.contains(expectedDeeplinkUserAgent!)) } /** Test to build an UberDeeplink with all optional Pickup Parameters. */ func testBuildDeeplinkWithAllPickupParameters() { let location = CLLocation(latitude: pickupLat, longitude: pickupLong) let builder = RideParametersBuilder() builder.pickupLocation = location builder.pickupNickname = pickupNickname builder.pickupAddress = pickupAddress let rideParams = builder.build() let deeplink = RequestDeeplink(rideParameters: rideParams) let components = URLComponents(url: deeplink.url, resolvingAgainstBaseURL: false) XCTAssertEqual(components?.queryItems?.count, 7) let query = components?.query XCTAssertTrue(query!.contains(ExpectedDeeplink.clientIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.setPickupAction)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLatQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLongQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupNicknameQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupAddressQuery)) XCTAssertTrue(query!.contains(expectedDeeplinkUserAgent!)) } /** Test to build an UberDeeplink with only Dropoff Parameters (set default Pickup Parameters). */ func testBuildDeeplinkWithoutPickupParameters() { let location = CLLocation(latitude: dropoffLat, longitude: dropoffLong) let builder = RideParametersBuilder() builder.dropoffLocation = location let rideParams = builder.build() let deeplink = RequestDeeplink(rideParameters: rideParams) let components = URLComponents(url: deeplink.url, resolvingAgainstBaseURL: false) XCTAssertEqual(components?.queryItems?.count, 6) let query = components?.query XCTAssertTrue(query!.contains(ExpectedDeeplink.clientIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.setPickupAction)) XCTAssertTrue(query!.contains(ExpectedDeeplink.defaultPickupQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffLatQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffLongQuery)) XCTAssertTrue(query!.contains(expectedDeeplinkUserAgent!)) } /** Test to build an UberDeeplink with all possible query parameters. */ func testBuildDeeplinkWithAllParameters() { let pickupLocation = CLLocation(latitude: pickupLat, longitude: pickupLong) let dropoffLocation = CLLocation(latitude: dropoffLat, longitude: dropoffLong) let builder = RideParametersBuilder() builder.pickupLocation = pickupLocation builder.dropoffLocation = dropoffLocation builder.productID = productID builder.pickupNickname = pickupNickname builder.pickupAddress = pickupAddress builder.dropoffNickname = dropoffNickname builder.dropoffAddress = dropoffAddress let rideParams = builder.build() let deeplink = RequestDeeplink(rideParameters: rideParams) let components = URLComponents(url: deeplink.url, resolvingAgainstBaseURL: false) XCTAssertEqual(components?.queryItems?.count, 12) let query = components?.query XCTAssertTrue(query!.contains(ExpectedDeeplink.clientIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.productIDQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.setPickupAction)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLatQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupLongQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupNicknameQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.pickupAddressQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffLatQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffLongQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffNicknameQuery)) XCTAssertTrue(query!.contains(ExpectedDeeplink.dropoffAddressQuery)) XCTAssertTrue(query!.contains(expectedDeeplinkUserAgent!)) } func testDeeplinkDefaultSource() { let expectation = self.expectation(description: "Test Deeplink source parameter") let expectationClosure: (URL?) -> (Bool) = { url in expectation.fulfill() guard let url = url, let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let items = components.queryItems else { XCTAssert(false) return false } 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(RequestDeeplink.sourceString)) break } } } XCTAssert(foundUserAgent) return false } let deeplink = RequestDeeplinkMock(rideParameters: RideParametersBuilder().build(), testClosure: expectationClosure) deeplink.execute() waitForExpectations(timeout: timeout, handler: { error in XCTAssertNil(error) }) } func testRequestDeeplinkFallbackAppStore() { let deeplink = RequestDeeplink() XCTAssertEqual(deeplink.fallbackURLs.count, 3) XCTAssertEqual(deeplink.fallbackURLs[0].scheme, "uber-enterprise") XCTAssertEqual(deeplink.fallbackURLs[1].scheme, "uber-nightly") XCTAssertEqual(deeplink.fallbackURLs[2].scheme, "https") XCTAssertEqual(deeplink.fallbackURLs[2].host, "m.uber.com") XCTAssertEqual(deeplink.fallbackURLs[2].path, "/sign-up") } func testRequestDeeplinkFallbackDefaultsMuber() { let deeplink = RequestDeeplink(rideParameters: RideParametersBuilder().build(), fallbackType: .mobileWeb) XCTAssertEqual(deeplink.fallbackURLs.count, 3) XCTAssertEqual(deeplink.fallbackURLs[0].scheme, "uber-enterprise") XCTAssertEqual(deeplink.fallbackURLs[1].scheme, "uber-nightly") XCTAssertEqual(deeplink.fallbackURLs[2].scheme, "https") XCTAssertEqual(deeplink.fallbackURLs[2].host, "m.uber.com") XCTAssertEqual(deeplink.fallbackURLs[2].path, "") } func testRequestDeeplinkFallbackNone() { let deeplink = RequestDeeplink(rideParameters: RideParametersBuilder().build(), fallbackType: .none) XCTAssertEqual(deeplink.fallbackURLs.count, 2) XCTAssertEqual(deeplink.fallbackURLs[0].scheme, "uber-enterprise") XCTAssertEqual(deeplink.fallbackURLs[1].scheme, "uber-nightly") } }