source/UberRidesTests/APIManagerTests.swift (386 lines of code) (raw):

// // APIManagerTests.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 offset = 1 let limit = 25 let requestID = "request1234" let placeID = Place.home struct ExpectedEndpoint { static let GetProducts = "https://sandbox-api.uber.com/v1.2/products?latitude=\(pickupLat)&longitude=\(pickupLong)" static let GetProduct = "https://sandbox-api.uber.com/v1.2/products/\(productID)?" static let GetPriceEstimates = "https://sandbox-api.uber.com/v1.2/estimates/price?start_latitude=\(pickupLat)&start_longitude=\(pickupLong)&end_latitude=\(dropoffLat)&end_longitude=\(dropoffLong)" static let GetTimeEstimates = "https://sandbox-api.uber.com/v1.2/estimates/time?start_latitude=\(pickupLat)&start_longitude=\(pickupLong)" static let GetTimeEstimatesAllParams = "https://sandbox-api.uber.com/v1.2/estimates/time?start_latitude=\(pickupLat)&start_longitude=\(pickupLong)&product_id=\(productID)" static let GetHistory = "https://sandbox-api.uber.com/v1.2/history?" static let GetHistoryWithOffset = "https://sandbox-api.uber.com/v1.2/history?offset=\(offset)" static let GetHistoryWithLimit = "https://sandbox-api.uber.com/v1.2/history?limit=\(limit)" static let GetHistoryWithAllParameters = "https://sandbox-api.uber.com/v1.2/history?offset=\(offset)&limit=\(limit)" static let GetUserProfile = "https://sandbox-api.uber.com/v1.2/me?" static let PostRequest = "https://sandbox-api.uber.com/v1.2/requests?" static let GetCurrentRequest = "https://sandbox-api.uber.com/v1.2/requests/current?" static let GetRequestByID = "https://sandbox-api.uber.com/v1.2/requests/\(requestID)?" static let PostRequestEstimate = "https://sandbox-api.uber.com/v1.2/requests/estimate?" static let GetPlace = "https://sandbox-api.uber.com/v1.2/places/\(placeID)?" static let PutPlace = "https://sandbox-api.uber.com/v1.2/places/\(placeID)?" static let DeleteCurrentRequest = "https://sandbox-api.uber.com/v1.2/requests/current?" static let PatchCurrentRequest = "https://sandbox-api.uber.com/v1.2/requests/current?" static let PatchRequestByID = "https://sandbox-api.uber.com/v1.2/requests/\(requestID)?" static let DeleteRequestByID = "https://sandbox-api.uber.com/v1.2/requests/\(requestID)?" static let GetPaymentMethods = "https://sandbox-api.uber.com/v1.2/payment-methods?" static let GetRideReceipt = "https://sandbox-api.uber.com/v1.2/requests/\(requestID)/receipt?" static let GetRideMap = "https://sandbox-api.uber.com/v1.2/requests/\(requestID)/map?" } class APIManagerTests: XCTestCase { override func setUp() { super.setUp() Configuration.restoreDefaults() Configuration.shared.isSandbox = true } override func tearDown() { Configuration.restoreDefaults() super.tearDown() } /** Helper function to build a NSURLRequest from an UberAPI endpoint enum. - parameter endpoint: Endpoint that conforms to UberAPI. - returns: URLRequest with URL and UberHTTPMethod set. */ func buildRequestForEndpoint(_ endpoint: APIEndpoint) -> URLRequest { let request = Request(session: nil, endpoint: endpoint) XCTAssertNotNil(request, "Unable to create request") request?.prepare() return request!.urlRequest } /** Tests the GET /v1/products endpoint. */ func testGetAllProducts() { let request = buildRequestForEndpoint(Products.getAll(location: CLLocation(latitude: pickupLat, longitude: pickupLong))) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetProducts) } else { XCTAssert(false) } } /** Tests the GET /v1/products/{product_id} endpoint. */ func testGetProduct() { let request = buildRequestForEndpoint(Products.getProduct(productID: productID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetProduct) } else { XCTAssert(false) } } /** Tests the GET /v1.2/estimates/price endpoint. */ func testGetPriceEstimates() { let request = buildRequestForEndpoint(Estimates.price(startLocation: CLLocation(latitude: pickupLat, longitude: pickupLong), endLocation: CLLocation(latitude: dropoffLat, longitude: dropoffLong))) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetPriceEstimates) } else { XCTAssert(false) } } /** Tests the GET /v1.2/estimates/time endpoint with only latitude and longitude. */ func testGetTimeEstimates() { let request = buildRequestForEndpoint(Estimates.time(location: CLLocation(latitude: pickupLat, longitude: pickupLong), productID: nil)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetTimeEstimates) } else { XCTAssert(false) } } /** Tests the GET /v1.2/estimates/time endpoint with optional parameters. */ func testGetTimeEstimatesWithOptionalParameters() { let request = buildRequestForEndpoint(Estimates.time(location: CLLocation(latitude: pickupLat, longitude: pickupLong), productID: productID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetTimeEstimatesAllParams) } else { XCTAssert(false) } } /** Tests the GET /v1.2/history endpoint without optional parameters. */ func testGetHistory() { let request = buildRequestForEndpoint(History.get(offset: nil, limit: nil)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetHistory) } else { XCTAssert(false) } } /** Tests the GET /v1.2/history endpoint with optional offset and limit parameters. */ func testGetHistoryWithAllParameters() { let request = buildRequestForEndpoint(History.get(offset: offset, limit: limit)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetHistoryWithAllParameters) } else { XCTAssert(false) } } /** Tests the GET /v1.2/history endpoint with offset parameter and no limit parameter. */ func testGetHistoryWithOffsetParameter() { let request = buildRequestForEndpoint(History.get(offset: offset, limit: nil)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetHistoryWithOffset) } else { XCTAssert(false) } } /** Tests the GET /v1.2/history endpoint with limit parameter and no offset parameter. */ func testGetHistoryWithLimitParameter() { let request = buildRequestForEndpoint(History.get(offset: nil, limit: limit)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetHistoryWithLimit) } else { XCTAssert(false) } } /** Tests the GET /v1/me endpoint. */ func testGetUserProfile() { let request = buildRequestForEndpoint(Me.userProfile) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetUserProfile) } else { XCTAssert(false) } } /** Test building ride request data with all parameters. */ func testRequestBuilderAllParameters() { let pickupLocation = CLLocation(latitude: pickupLat, longitude: pickupLong) let dropoffLocation = CLLocation(latitude: dropoffLat, longitude: dropoffLong) let builder = RideParametersBuilder() builder.pickupLocation = pickupLocation builder.pickupNickname = pickupNickname builder.pickupAddress = pickupAddress builder.dropoffLocation = dropoffLocation builder.dropoffNickname = dropoffNickname builder.dropoffAddress = dropoffAddress builder.productID = productID builder.surgeConfirmationID = surgeConfirm builder.paymentMethod = paymentMethod let rideParameters = builder.build() guard let data = RideRequestDataBuilder(rideParameters: rideParameters).build() else { XCTAssert(false) return } var dict: Dictionary<String, Any>? do { dict = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? Dictionary<String, Any> } catch { XCTAssert(false) } if let dictionary = dict { XCTAssertEqual(dictionary["product_id"] as? String, productID) XCTAssertEqual(dictionary["start_latitude"] as? Double, pickupLat) XCTAssertEqual(dictionary["start_longitude"] as? Double, pickupLong) XCTAssertEqual(dictionary["start_nickname"] as? String, pickupNickname) XCTAssertEqual(dictionary["start_address"] as? String, pickupAddress) XCTAssertEqual(dictionary["end_latitude"] as? Double, dropoffLat) XCTAssertEqual(dictionary["end_longitude"] as? Double, dropoffLong) XCTAssertEqual(dictionary["end_nickname"] as? String, dropoffNickname) XCTAssertEqual(dictionary["end_address"] as? String, dropoffAddress) XCTAssertEqual(dictionary["payment_method_id"] as? String, paymentMethod) XCTAssertEqual(dictionary["surge_confirmation_id"] as? String, surgeConfirm) } else { XCTAssert(false) } } /** Test the POST /v1/requests endpoint. */ func testPostRequest() { let builder = RideParametersBuilder() builder.pickupPlaceID = Place.home builder.productID = productID let rideParameters = builder.build() let request = buildRequestForEndpoint(Requests.make(rideParameters: rideParameters)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.post.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.PostRequest) } else { XCTAssert(false) } XCTAssertNotNil(request.httpBody) XCTAssertEqual(request.allHTTPHeaderFields!["Content-Type"], "application/json") } /** Test the GET /v1/requests/current endpoint. */ func testGetCurrentRequest() { let request = buildRequestForEndpoint(Requests.getCurrent) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetCurrentRequest) } else { XCTAssert(false) } } /** Tests the GET /v1/requests/{request_id} endpoint. */ func testGetRequestByID() { let request = buildRequestForEndpoint(Requests.getRequest(requestID: requestID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetRequestByID) } else { XCTAssert(false) } } /** Tests the POST /v1/requests/estimate endpoint. */ func testPostRequestEstimate() { let builder = RideParametersBuilder() builder.pickupPlaceID = Place.home let request = buildRequestForEndpoint(Requests.estimate(rideParameters: builder.build())) XCTAssertEqual(request.httpMethod, "POST") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.PostRequestEstimate) } XCTAssertNotNil(request.httpBody) } /** Tests the GET /v1/payment-methods endpoint. */ func testGetPaymentMethods() { let request = buildRequestForEndpoint(Payment.getMethods) XCTAssertEqual(request.httpMethod, "GET") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetPaymentMethods) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) } /** Tests the GET /v1/places/{place_id} endpoint. */ func testGetPlace() { let placeID = Place.home let request = buildRequestForEndpoint(Places.getPlace(placeID: placeID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetPlace) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) } /** Tests the PUT /v1/places/{place_id} endpoint. */ func testPutPlace() { let testAddress = "testAddress" let placeID = Place.home let request = buildRequestForEndpoint(Places.putPlace(placeID: placeID, address: testAddress)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.put.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.PutPlace) } else { XCTAssert(false) } if let headers = request.allHTTPHeaderFields { XCTAssertEqual(headers["Content-Type"], "application/json") } else { XCTAssert(false) } XCTAssertNotNil(request.httpBody) var dictionary: NSDictionary? do { dictionary = try JSONSerialization.jsonObject(with: request.httpBody!, options: .mutableContainers) as? NSDictionary } catch { XCTAssert(false) } guard let body = dictionary else { XCTAssert(false) return } XCTAssertEqual(body["address"] as? String, testAddress) } /** Tests the PATCH /v1/requests/curent endpoint. */ func testPatchCurrentRequest() { let builder = RideParametersBuilder() builder.pickupPlaceID = Place.home let rideParams = builder.build() let request = buildRequestForEndpoint(Requests.patchCurrent(rideParameters: rideParams)) XCTAssertEqual(request.httpMethod, "PATCH") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.PatchCurrentRequest) } else { XCTAssert(false) } if let headers = request.allHTTPHeaderFields { XCTAssertEqual(headers["Content-Type"], "application/json") } else { XCTAssert(false) } guard let data = request.httpBody else { XCTAssert(false) return } var dict: NSDictionary? do { dict = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary } catch { XCTAssert(false) } guard let dictionary = dict else { XCTAssert(false) return } XCTAssertEqual(dictionary["start_place_id"] as? String, Place.home) } /** Tests the PATCH /v1/requests/{request_id} endpoint. */ func testPatchRequestByID() { let builder = RideParametersBuilder() builder.pickupPlaceID = Place.home let rideParams = builder.build() let request = buildRequestForEndpoint(Requests.patchRequest(requestID: requestID, rideParameters: rideParams)) XCTAssertEqual(request.httpMethod, "PATCH") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.PatchRequestByID) } else { XCTAssert(false) } if let headers = request.allHTTPHeaderFields { XCTAssertEqual(headers["Content-Type"], "application/json") } else { XCTAssert(false) } guard let data = request.httpBody else { XCTAssert(false) return } var dict: NSDictionary? do { dict = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary } catch { XCTAssert(false) } guard let dictionary = dict else { XCTAssert(false) return } XCTAssertEqual(dictionary["start_place_id"] as? String, Place.home) } /** Tests the DELETE /v1/requests/current endpoint. */ func testDeleteCurrent() { let request = buildRequestForEndpoint(Requests.deleteCurrent) XCTAssertEqual(request.httpMethod, "DELETE") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.DeleteCurrentRequest) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) } /** Tests the DELETE /v1/requests/{request_id} endpoint. */ func testDeleteRequestByID() { let request = buildRequestForEndpoint(Requests.deleteRequest(requestID: requestID)) XCTAssertEqual(request.httpMethod, "DELETE") if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.DeleteRequestByID) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) } /** Tests the GET /v1/requests/{request_id}/receipt endpoint. */ func testGetRideReceipt() { let request = buildRequestForEndpoint(Requests.rideReceipt(requestID: requestID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetRideReceipt) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) if let headers = request.allHTTPHeaderFields { XCTAssertEqual(headers["Content-Type"], "application/json") } else { XCTAssert(false) } } /** Tests the GET /v1/request/{request_id}/map endpoint. */ func testGetRideMap() { let request = buildRequestForEndpoint(Requests.rideMap(requestID: requestID)) XCTAssertEqual(request.httpMethod, UberHTTPMethod.get.rawValue) if let url = request.url { XCTAssertEqual(url.absoluteString, ExpectedEndpoint.GetRideMap) } else { XCTAssert(false) } XCTAssertNil(request.httpBody) if let headers = request.allHTTPHeaderFields { XCTAssertEqual(headers["Content-Type"], "application/json") } else { XCTAssert(false) } } }