diff --git a/Example/Tests/BaseNetwork/Core/AuthenticationTests.swift b/Example/Tests/BaseNetwork/Core/AuthenticationTests.swift index 0ede5185..d67494a2 100644 --- a/Example/Tests/BaseNetwork/Core/AuthenticationTests.swift +++ b/Example/Tests/BaseNetwork/Core/AuthenticationTests.swift @@ -57,7 +57,7 @@ class AuthenticationTestCase: BaseTestCase { class BasicAuthenticationTestCase: AuthenticationTestCase { override func setUp() { super.setUp() - urlString = "https://mockbin.com/" + urlString = "https://httpbin.org/" } func skipped_testHTTPBasicAuthenticationWithInvalidCredentials() { @@ -111,7 +111,7 @@ class BasicAuthenticationTestCase: AuthenticationTestCase { func testHiddenHTTPBasicAuthentication() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation = self.expectation(description: "\(urlString) 200") var headers: CLDNHTTPHeaders? @@ -147,7 +147,7 @@ class HTTPDigestAuthenticationTestCase: AuthenticationTestCase { override func setUp() { super.setUp() - urlString = "https://mockbin.com/" + urlString = "https://httpbin.org/" } func skipped_testHTTPDigestAuthenticationWithInvalidCredentials() { diff --git a/Example/Tests/BaseNetwork/Core/RequestTests.swift b/Example/Tests/BaseNetwork/Core/RequestTests.swift index 701d60ab..94c3294d 100644 --- a/Example/Tests/BaseNetwork/Core/RequestTests.swift +++ b/Example/Tests/BaseNetwork/Core/RequestTests.swift @@ -28,7 +28,7 @@ import XCTest class RequestInitializationTestCase: BaseTestCase { func testRequestClassMethodWithMethodAndURL() { // Given - let urlString = "http://mockbin.com/" + let urlString = "http://httpbin.org/" // When let request = CLDNSessionManager.default.request(urlString) @@ -42,7 +42,7 @@ class RequestInitializationTestCase: BaseTestCase { func testRequestClassMethodWithMethodAndURLAndParameters() { // Given - let urlString = "http://mockbin.com/get" + let urlString = "http://httpbin.org/get" // When let request = CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]) @@ -57,7 +57,7 @@ class RequestInitializationTestCase: BaseTestCase { func testRequestClassMethodWithMethodURLParametersAndHeaders() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let headers = ["Authorization": "123456"] // When @@ -99,7 +99,7 @@ class RequestSubclassRequestPropertyTestCase: BaseTestCase { func testDataRequestHasURLRequest() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" // When let request = sessionManager.request(urlString) @@ -113,7 +113,7 @@ class RequestSubclassRequestPropertyTestCase: BaseTestCase { func testUploadDataRequestHasURLRequest() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" // When let request = sessionManager.upload(Data(), to: urlString) @@ -127,7 +127,7 @@ class RequestSubclassRequestPropertyTestCase: BaseTestCase { func testUploadFileRequestHasURLRequest() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let imageURL = url(forResource: "rainbow", withExtension: "jpg") // When @@ -142,7 +142,7 @@ class RequestSubclassRequestPropertyTestCase: BaseTestCase { func testUploadStreamRequestHasURLRequest() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let imageURL = url(forResource: "rainbow", withExtension: "jpg") let imageStream = InputStream(url: imageURL)! @@ -162,7 +162,7 @@ class RequestSubclassRequestPropertyTestCase: BaseTestCase { class RequestResponseTestCase: BaseTestCase { func testRequestResponse() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "GET request should succeed: \(urlString)") @@ -187,7 +187,7 @@ class RequestResponseTestCase: BaseTestCase { func testRequestResponseWithProgress() { // Given let randomBytes = 4 * 1024 * 1024 - let urlString = "https://mockbin.com/bytes/\(randomBytes)" + let urlString = "https://httpbin.org/bytes/\(randomBytes)" let expectation = self.expectation(description: "Bytes download progress should be reported: \(urlString)") @@ -229,7 +229,7 @@ class RequestResponseTestCase: BaseTestCase { func testRequestResponseWithStream() { // Given let randomBytes = 4 * 1024 * 1024 - let urlString = "https://mockbin.com/bytes/\(randomBytes)" + let urlString = "https://httpbin.org/bytes/\(randomBytes)" let expectation = self.expectation(description: "Bytes download progress should be reported: \(urlString)") @@ -275,7 +275,7 @@ class RequestResponseTestCase: BaseTestCase { func testPOSTRequestWithUnicodeParameters() { // Given - let urlString = "https://mockbin.com/request" + let urlString = "https://httpbin.org/post" let parameters = [ "french": "français", "japanese": "日本語", @@ -300,7 +300,7 @@ class RequestResponseTestCase: BaseTestCase { XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) - if let json = response?.result.value as? [String: Any], let form = ((response?.result.value as? [String: Any])?["postData"] as? [String: Any])?["params"] as? [String: String] { + if let json = response?.result.value as? [String: Any], let form = json["form"] as? [String: String] { XCTAssertEqual(form["french"], parameters["french"]) XCTAssertEqual(form["japanese"], parameters["japanese"]) XCTAssertEqual(form["arabic"], parameters["arabic"]) @@ -312,7 +312,7 @@ class RequestResponseTestCase: BaseTestCase { func testPOSTRequestWithBase64EncodedImages() { // Given - let urlString = "https://mockbin.com/request" + let urlString = "https://httpbin.org/post" let pngBase64EncodedString: String = { let URL = url(forResource: "unicorn", withExtension: "png") @@ -353,7 +353,7 @@ class RequestResponseTestCase: BaseTestCase { XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - if let json = response?.result.value as? [String: Any], let form = ((response?.result.value as? [String: Any])?["postData"] as? [String: Any])?["params"] as? [String: String] { + if let json = response?.result.value as? [String: Any], let form = json["form"] as? [String: String] { XCTAssertEqual(form["email"], parameters["email"]) XCTAssertEqual(form["png_image"], parameters["png_image"]) XCTAssertEqual(form["jpeg_image"], parameters["jpeg_image"]) @@ -388,7 +388,7 @@ extension CLDNRequest { class RequestExtensionTestCase: BaseTestCase { func testThatRequestExtensionHasAccessToTaskDelegateQueue() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "GET request should succeed: \(urlString)") var responses: [String] = [] @@ -425,7 +425,7 @@ class RequestExtensionTestCase: BaseTestCase { class RequestDescriptionTestCase: BaseTestCase { func testRequestDescription() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let request = CLDNSessionManager.default.request(urlString) let initialRequestDescription = request.description @@ -445,8 +445,8 @@ class RequestDescriptionTestCase: BaseTestCase { waitForExpectations(timeout: timeout, handler: nil) // Then - XCTAssertEqual(initialRequestDescription, "GET https://mockbin.com/get") - XCTAssertEqual(finalRequestDescription, "GET https://mockbin.com/get (\(response?.statusCode ?? -1))") + XCTAssertEqual(initialRequestDescription, "GET https://httpbin.org/get") + XCTAssertEqual(finalRequestDescription, "GET https://httpbin.org/get (\(response?.statusCode ?? -1))") } } @@ -501,7 +501,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testGETRequestDebugDescription() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" // When let request = manager.request(urlString) @@ -515,7 +515,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testGETRequestWithJSONHeaderDebugDescription() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" // When let headers: [String: String] = [ "X-Custom-Header": "{\"key\": \"value\"}" ] @@ -527,7 +527,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testGETRequestWithDuplicateHeadersDebugDescription() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" // When let headers = [ "Accept-Language": "en-GB" ] @@ -547,7 +547,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testPOSTRequestDebugDescription() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" // When let request = manager.request(urlString, method: .post) @@ -561,7 +561,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testPOSTRequestWithJSONParametersDebugDescription() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let parameters = [ "foo": "bar", @@ -588,7 +588,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testPOSTRequestWithCookieDebugDescription() { // Given - let urlString = "https://mockbin.com/request" + let urlString = "https://httpbin.org/post" let properties = [ HTTPCookiePropertyKey.domain: "httpbin.org", @@ -608,12 +608,12 @@ class RequestDebugDescriptionTestCase: BaseTestCase { XCTAssertEqual(components[0..<3], ["$", "curl", "-v"]) XCTAssertEqual(components[3..<5], ["-X", "POST"]) XCTAssertEqual(components.last, "\"\(urlString)\"") - XCTAssertEqual(components[5..<6], ["\"https://mockbin.com/request\""]) + XCTAssertEqual(components[5..<6], ["-b"]) } func testPOSTRequestWithCookiesDisabledDebugDescription() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let properties = [ HTTPCookiePropertyKey.domain: "httpbin.org", @@ -636,7 +636,7 @@ class RequestDebugDescriptionTestCase: BaseTestCase { func testMultipartFormDataRequestWithDuplicateHeadersDebugDescription() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let japaneseData = "日本語".data(using: .utf8, allowLossyConversion: false)! let expectation = self.expectation(description: "multipart form data encoding should succeed") diff --git a/Example/Tests/BaseNetwork/Core/ResponseTests.swift b/Example/Tests/BaseNetwork/Core/ResponseTests.swift index 6b6fe005..6b9de9d8 100644 --- a/Example/Tests/BaseNetwork/Core/ResponseTests.swift +++ b/Example/Tests/BaseNetwork/Core/ResponseTests.swift @@ -28,53 +28,53 @@ import XCTest class ResponseTestCase: BaseTestCase { func testThatResponseReturnsSuccessResultWithValidData() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDefaultDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatResponseReturnsFailureResultWithOptionalDataAndError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDefaultDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.error) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -88,54 +88,54 @@ class ResponseTestCase: BaseTestCase { class ResponseDataTestCase: BaseTestCase { func testThatResponseDataReturnsSuccessResultWithValidData() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseData { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatResponseDataReturnsFailureResultWithOptionalDataAndError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseData { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -149,54 +149,54 @@ class ResponseDataTestCase: BaseTestCase { class ResponseStringTestCase: BaseTestCase { func testThatResponseStringReturnsSuccessResultWithValidString() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseString { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseString { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -210,89 +210,89 @@ class ResponseStringTestCase: BaseTestCase { class ResponseJSONTestCase: BaseTestCase { func testThatResponseJSONReturnsSuccessResultWithValidJSON() { // Given - let urlString = "https://mockbin.com/status/200" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func skipped_testThatResponseJSONReturnsSuccessResultForGETRequest() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } - + if let responseDictionary = response?.result.value as? [String: Any], let args = responseDictionary["args"] as? [String: String] @@ -302,38 +302,38 @@ class ResponseJSONTestCase: BaseTestCase { XCTFail("args should not be nil") } } - + func testThatResponseJSONReturnsSuccessResultForPOSTRequest() { // Given - let urlString = "https://mockbin.com/request" + let urlString = "https://httpbin.org/post" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, method: .post, parameters: ["foo": "bar"]).responseJSON { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } - + if let responseDictionary = response?.result.value as? [String: Any], - let form = ((response?.result.value as? [String: Any])?["postData"] as? [String: Any])?["params"] as? [String: String] + let form = responseDictionary["form"] as? [String: String] { XCTAssertEqual(form, ["foo": "bar"], "form should match parameters") } else { @@ -347,58 +347,58 @@ class ResponseJSONTestCase: BaseTestCase { class ResponseMapTestCase: BaseTestCase { func skipped_testThatMapTransformsSuccessValue() { // Given - let urlString = "https://mockbin.com/header/foo" + let urlString = "https://httpbin.org/header/foo" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in response = resp.flatMap { json in // json["args"]["foo"] is "bar": use this invariant to test the map function return ((json as? [String: Any])?["args"] as? [String: Any])?["foo"] as? String ?? "invalid" } - + expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) XCTAssertEqual(response?.result.value, "bar") - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatMapPreservesFailureError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseData { resp in response = resp.map { _ in "ignored" } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -412,97 +412,97 @@ class ResponseMapTestCase: BaseTestCase { class ResponseFlatMapTestCase: BaseTestCase { func skipped_testThatFlatMapTransformsSuccessValue() { // Given - let urlString = "https://mockbin.com/header/foo" + let urlString = "https://httpbin.org/header/foo" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in response = resp.flatMap { json in // json["args"]["foo"] is "bar": use this invariant to test the flatMap function return ((json as? [String: Any])?["args"] as? [String: Any])?["foo"] as? String ?? "invalid" } - + expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) XCTAssertEqual(response?.result.value, "bar") - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatFlatMapCatchesTransformationError() { // Given struct TransformError: Error {} - - let urlString = "https://mockbin.com/get" + + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseData { resp in response = resp.flatMap { json in throw TransformError() } - + expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + if let error = response?.result.error { XCTAssertTrue(error is TransformError) } else { XCTFail("flatMap should catch the transformation error") } - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatFlatMapPreservesFailureError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail with 404") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString, parameters: ["foo": "bar"]).responseData { resp in response = resp.flatMap { _ in "ignored" } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -519,7 +519,7 @@ enum TestError: Error { enum TransformationError: Error { case error - + func alwaysFails() throws -> TestError { throw TransformationError.error } @@ -530,55 +530,55 @@ class ResponseMapErrorTestCase: BaseTestCase { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should not succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString).responseJSON { resp in response = resp.mapError { error in return TestError.error(error: error) } - + expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) guard let error = response?.error as? TestError, case .error = error else { XCTFail(); return } - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatMapErrorPreservesSuccessValue() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString).responseData { resp in response = resp.mapError { TestError.error(error: $0) } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics @@ -592,88 +592,88 @@ class ResponseMapErrorTestCase: BaseTestCase { class ResponseFlatMapErrorTestCase: BaseTestCase { func testThatFlatMapErrorPreservesSuccessValue() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation = self.expectation(description: "request should succeed") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString).responseData { resp in response = resp.flatMapError { TestError.error(error: $0) } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatFlatMapErrorCatchesTransformationError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString).responseData { resp in response = resp.flatMapError { _ in try TransformationError.error.alwaysFails() } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) - + if let error = response?.result.error { XCTAssertTrue(error is TransformationError) } else { XCTFail("flatMapError should catch the transformation error") } - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics XCTAssertNotNil(metrics) } } - + func testThatFlatMapErrorTransformsError() { // Given let urlString = "https://invalid-url-here.org/this/does/not/exist" let expectation = self.expectation(description: "request should fail") - + var response: CLDNDataResponse? - + // When CLDNSessionManager.default.request(urlString).responseData { resp in response = resp.flatMapError { TestError.error(error: $0) } expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isFailure, true) guard let error = response?.error as? TestError, case .error = error else { XCTFail(); return } - + var metrics: AnyObject? = nil if #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) { metrics = response?.metrics diff --git a/Example/Tests/BaseNetwork/Core/SessionDelegateTests.swift b/Example/Tests/BaseNetwork/Core/SessionDelegateTests.swift index c80d5d40..6a5088a9 100644 --- a/Example/Tests/BaseNetwork/Core/SessionDelegateTests.swift +++ b/Example/Tests/BaseNetwork/Core/SessionDelegateTests.swift @@ -26,71 +26,71 @@ import Foundation import XCTest class SessionDelegateTestCase: BaseTestCase { - + // prevents redundant call to redirect testing, currently there an issue with httpbin // https://github.com/postmanlabs/httpbin/issues/617 lazy var allowDelegateTest: Bool = { return ProcessInfo.processInfo.arguments.contains("TEST_REDIRECT") }() - + var manager: CLDNSessionManager! - + // MARK: - setup and teardown - + override func setUp() { super.setUp() manager = CLDNSessionManager(configuration: .ephemeral) } - + // MARK: - Tests - Session Invalidation - + func testThatSessionDidBecomeInvalidWithErrorClosureIsCalledWhenSet() { - + // Given let expectation = self.expectation(description: "Override closure should be called") - + var overrideClosureCalled = false var invalidationError: Error? - + manager.delegate.sessionDidBecomeInvalidWithError = { _, error in overrideClosureCalled = true invalidationError = error - + expectation.fulfill() } - + // When manager.session.invalidateAndCancel() waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertTrue(overrideClosureCalled) XCTAssertNil(invalidationError) } - + // MARK: - Tests - Session Challenges - + func testThatSessionDidReceiveChallengeClosureIsCalledWhenSet() { if #available(iOS 9.0, *) { // Given let expectation = self.expectation(description: "Override closure should be called") - + var overrideClosureCalled = false var response: HTTPURLResponse? - + manager.delegate.sessionDidReceiveChallenge = { session, challenge in overrideClosureCalled = true return (.performDefaultHandling, nil) } - + // When - manager.request("https://mockbin.com/").responseJSON { closureResponse in + manager.request("https://httpbin.org/").responseJSON { closureResponse in response = closureResponse.response expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertTrue(overrideClosureCalled) XCTAssertEqual(response?.statusCode, 200) @@ -101,28 +101,28 @@ class SessionDelegateTestCase: BaseTestCase { // still the same. Until we find a better solution, we'll need to disable this test on iOS 8.x. } } - + func testThatSessionDidReceiveChallengeWithCompletionClosureIsCalledWhenSet() { if #available(iOS 9.0, *) { // Given let expectation = self.expectation(description: "Override closure should be called") - + var overrideClosureCalled = false var response: HTTPURLResponse? - + manager.delegate.sessionDidReceiveChallengeWithCompletion = { session, challenge, completion in overrideClosureCalled = true completion(.performDefaultHandling, nil) } - + // When - manager.request("https://mockbin.com/").responseJSON { closureResponse in + manager.request("https://httpbin.org/").responseJSON { closureResponse in response = closureResponse.response expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertTrue(overrideClosureCalled) XCTAssertEqual(response?.statusCode, 200) @@ -133,338 +133,338 @@ class SessionDelegateTestCase: BaseTestCase { // still the same. Until we find a better solution, we'll need to disable this test on iOS 8.x. } } - + // MARK: - Tests - Redirects - + func testThatRequestWillPerformHTTPRedirectionByDefault() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectURLString = "https://www.apple.com/" - let urlString = "https://mockbin.com/redirect-to?url=\(redirectURLString)" - + let urlString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)") - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) XCTAssertEqual(response?.response?.statusCode, 200) } - + func testThatRequestWillPerformRedirectionMultipleTimesByDefault() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given - let redirectURLString = "https://mockbin.com/get" - let urlString = "https://mockbin.com/redirect/5" - + let redirectURLString = "https://httpbin.org/get" + let urlString = "https://httpbin.org/redirect/5" + let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)") - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) XCTAssertEqual(response?.response?.statusCode, 200) } - + func testThatTaskOverrideClosureCanPerformHTTPRedirection() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectURLString = "https://www.apple.com/" - let urlString = "https://mockbin.com/redirect-to?url=\(redirectURLString)" - + let urlString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)") let callbackExpectation = self.expectation(description: "Redirect callback should be made") let delegate: CLDNSessionDelegate = manager.delegate - + delegate.taskWillPerformHTTPRedirection = { _, _, _, request in callbackExpectation.fulfill() return request } - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) XCTAssertEqual(response?.response?.statusCode, 200) } - + func testThatTaskOverrideClosureWithCompletionCanPerformHTTPRedirection() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectURLString = "https://www.apple.com/" - let urlString = "https://mockbin.com/redirect-to?url=\(redirectURLString)" - + let urlString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)") let callbackExpectation = self.expectation(description: "Redirect callback should be made") let delegate: CLDNSessionDelegate = manager.delegate - + delegate.taskWillPerformHTTPRedirectionWithCompletion = { _, _, _, request, completion in completion(request) callbackExpectation.fulfill() } - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) XCTAssertEqual(response?.response?.statusCode, 200) } - + func testThatTaskOverrideClosureCanCancelHTTPRedirection() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectURLString = "https://www.apple.com" - let urlString = "https://mockbin.com/redirect-to?url=\(redirectURLString)" - + let urlString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let expectation = self.expectation(description: "Request should not redirect to \(redirectURLString)") let callbackExpectation = self.expectation(description: "Redirect callback should be made") let delegate: CLDNSessionDelegate = manager.delegate - + delegate.taskWillPerformHTTPRedirectionWithCompletion = { _, _, _, _, completion in callbackExpectation.fulfill() completion(nil) } - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, urlString) XCTAssertEqual(response?.response?.statusCode, 302) } - + func testThatTaskOverrideClosureWithCompletionCanCancelHTTPRedirection() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectURLString = "https://www.apple.com" - let urlString = "https://mockbin.com/redirect-to?url=\(redirectURLString)" - + let urlString = "https://httpbin.org/redirect-to?url=\(redirectURLString)" + let expectation = self.expectation(description: "Request should not redirect to \(redirectURLString)") let callbackExpectation = self.expectation(description: "Redirect callback should be made") let delegate: CLDNSessionDelegate = manager.delegate - + delegate.taskWillPerformHTTPRedirection = { _, _, _, _ in callbackExpectation.fulfill() return nil } - + var response: CLDNDefaultDataResponse? - + // When manager.request(urlString) .response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertNil(response?.error) - + XCTAssertEqual(response?.response?.url?.absoluteString, urlString) XCTAssertEqual(response?.response?.statusCode, 302) } - + func testThatTaskOverrideClosureIsCalledMultipleTimesForMultipleHTTPRedirects() throws { - + try XCTSkipUnless(allowDelegateTest, "prevents the test from running, currently there's an issue with the remote server used") - + // Given let redirectCount = 5 - let redirectURLString = "https://mockbin.com/get" - let urlString = "https://mockbin.com/redirect/\(redirectCount)" - + let redirectURLString = "https://httpbin.org/get" + let urlString = "https://httpbin.org/redirect/\(redirectCount)" + let expectation = self.expectation(description: "Request should redirect to \(redirectURLString)") let delegate: CLDNSessionDelegate = manager.delegate var redirectExpectations = [XCTestExpectation]() for index in 0..? - + // When manager.request(urlString, headers: headers) .responseJSON { closureResponse in response = closureResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response?.request) XCTAssertNotNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.result.isSuccess, true) - + if let json = response?.result.value as? [String: Any], let headers = json["headers"] as? [String: String] { XCTAssertEqual(headers["Authorization"], "1234") XCTAssertEqual(headers["Custom-Header"], "foobar") } } - + // MARK: - Tests - Data Task Responses - + func testThatDataTaskDidReceiveResponseClosureIsCalledWhenSet() { // Given let expectation = self.expectation(description: "Override closure should be called") - + var overrideClosureCalled = false var response: HTTPURLResponse? - + manager.delegate.dataTaskDidReceiveResponse = { session, task, response in overrideClosureCalled = true return .allow } - + // When - manager.request("https://mockbin.com/").responseJSON { closureResponse in + manager.request("https://httpbin.org/").responseJSON { closureResponse in response = closureResponse.response expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertTrue(overrideClosureCalled) XCTAssertEqual(response?.statusCode, 200) } - + func testThatDataTaskDidReceiveResponseWithCompletionClosureIsCalledWhenSet() { // Given let expectation = self.expectation(description: "Override closure should be called") - + var overrideClosureCalled = false var response: HTTPURLResponse? - + manager.delegate.dataTaskDidReceiveResponseWithCompletion = { session, task, response, completion in overrideClosureCalled = true completion(.allow) } - + // When - manager.request("https://mockbin.com/").responseJSON { closureResponse in + manager.request("https://httpbin.org/").responseJSON { closureResponse in response = closureResponse.response expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertTrue(overrideClosureCalled) XCTAssertEqual(response?.statusCode, 200) diff --git a/Example/Tests/BaseNetwork/Core/SessionManagerTests.swift b/Example/Tests/BaseNetwork/Core/SessionManagerTests.swift index 36279abc..7547a831 100644 --- a/Example/Tests/BaseNetwork/Core/SessionManagerTests.swift +++ b/Example/Tests/BaseNetwork/Core/SessionManagerTests.swift @@ -26,59 +26,59 @@ import Foundation import XCTest class SessionManagerTestCase: BaseTestCase { - + // MARK: Helper Types - + private class HTTPMethodAdapter: CLDNRequestAdapter { let method: CLDNHTTPMethod let throwsError: Bool - + init(method: CLDNHTTPMethod, throwsError: Bool = false) { self.method = method self.throwsError = throwsError } - + func CLDN_Adapt(_ urlRequest: URLRequest) throws -> URLRequest { guard !throwsError else { throw CLDNError.invalidURL(url: "") } - + var urlRequest = urlRequest urlRequest.httpMethod = method.rawValue - + return urlRequest } } - + private class RequestHandler: CLDNRequestAdapter, CLDNRequestRetrier { var adaptedCount = 0 var retryCount = 0 var retryErrors: [Error] = [] - + var shouldApplyAuthorizationHeader = false var throwsErrorOnSecondAdapt = false - + func CLDN_Adapt(_ urlRequest: URLRequest) throws -> URLRequest { if throwsErrorOnSecondAdapt && adaptedCount == 1 { throwsErrorOnSecondAdapt = false throw CLDNError.invalidURL(url: "") } - + var urlRequest = urlRequest - + adaptedCount += 1 - + if shouldApplyAuthorizationHeader && adaptedCount > 1 { if let header = CLDNRequest.authorizationHeader(user: "user", password: "password") { urlRequest.setValue(header.value, forHTTPHeaderField: header.key) } } - + return urlRequest } - + func CLDN_Should(_ manager: CLDNSessionManager, retry request: CLDNRequest, with error: Error, completion: @escaping CLDNRequestRetryCompletion) { retryCount += 1 retryErrors.append(error) - + if retryCount < 2 { completion(true, 0.0) } else { @@ -86,60 +86,60 @@ class SessionManagerTestCase: BaseTestCase { } } } - + private class UploadHandler: CLDNRequestAdapter, CLDNRequestRetrier { var adaptedCount = 0 var retryCount = 0 var retryErrors: [Error] = [] - + func CLDN_Adapt(_ urlRequest: URLRequest) throws -> URLRequest { adaptedCount += 1 - + if adaptedCount == 1 { throw CLDNError.invalidURL(url: "") } - + return urlRequest } - + func CLDN_Should(_ manager: CLDNSessionManager, retry request: CLDNRequest, with error: Error, completion: @escaping CLDNRequestRetryCompletion) { retryCount += 1 retryErrors.append(error) - + completion(true, 0.0) } } - + // prevents the test from running, currently there's an issue when Travis CI runs this test lazy var allowManagerTest: Bool = { return ProcessInfo.processInfo.arguments.contains("TEST_SESSION_MANAGER") }() // MARK: Tests - Initialization - + func testInitializerWithDefaultArguments() { // Given, When let manager = CLDNSessionManager() - + // Then XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil") XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate") } - + func testInitializerWithSpecifiedArguments() { // Given let configuration = URLSessionConfiguration.default let delegate = CLDNSessionDelegate() - + // When let manager = CLDNSessionManager( configuration: configuration, delegate: delegate) - + // Then XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil") XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate") } - + func testThatFailableInitializerSucceedsWithDefaultArguments() { // Given let delegate = CLDNSessionDelegate() @@ -147,10 +147,10 @@ class SessionManagerTestCase: BaseTestCase { let configuration = URLSessionConfiguration.default return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil) }() - + // When let manager = CLDNSessionManager(session: session, delegate: delegate) - + // Then if let manager = manager { XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate") @@ -158,7 +158,7 @@ class SessionManagerTestCase: BaseTestCase { XCTFail("manager should not be nil") } } - + func testThatFailableInitializerSucceedsWithSpecifiedArguments() { // Given let delegate = CLDNSessionDelegate() @@ -166,10 +166,10 @@ class SessionManagerTestCase: BaseTestCase { let configuration = URLSessionConfiguration.default return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil) }() - + // When let manager = CLDNSessionManager(session: session, delegate: delegate) - + // Then if let manager = manager { XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate") @@ -177,7 +177,7 @@ class SessionManagerTestCase: BaseTestCase { XCTFail("manager should not be nil") } } - + func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() { // Given let delegate = CLDNSessionDelegate() @@ -185,14 +185,14 @@ class SessionManagerTestCase: BaseTestCase { let configuration = URLSessionConfiguration.default return URLSession(configuration: configuration, delegate: CLDNSessionDelegate(), delegateQueue: nil) }() - + // When let manager = CLDNSessionManager(session: session, delegate: delegate) - + // Then XCTAssertNil(manager, "manager should be nil") } - + func testThatFailableInitializerFailsWhenSessionDelegateIsNil() { // Given let delegate = CLDNSessionDelegate() @@ -200,76 +200,76 @@ class SessionManagerTestCase: BaseTestCase { let configuration = URLSessionConfiguration.default return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil) }() - + // When let manager = CLDNSessionManager(session: session, delegate: delegate) - + // Then XCTAssertNil(manager, "manager should be nil") } - + // MARK: Tests - Default HTTP Headers - + func testDefaultUserAgentHeader() { // Given, When let userAgent = CLDNSessionManager.defaultHTTPHeaders["User-Agent"] - + // Then let osNameVersion: String = { let version = ProcessInfo.processInfo.operatingSystemVersion let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" - + let osName: String = { - #if os(iOS) - return "iOS" - #elseif os(watchOS) - return "watchOS" - #elseif os(tvOS) - return "tvOS" - #elseif os(macOS) - return "OS X" - #elseif os(Linux) - return "Linux" - #else - return "Unknown" - #endif +#if os(iOS) + return "iOS" +#elseif os(watchOS) + return "watchOS" +#elseif os(tvOS) + return "tvOS" +#elseif os(macOS) + return "OS X" +#elseif os(Linux) + return "Linux" +#else + return "Unknown" +#endif }() - + return "\(osName) \(versionString)" }() - + let cloudinaryVersion: String = { guard let afInfo = Bundle(for: CLDNSessionManager.self).infoDictionary, let build = afInfo["CFBundleShortVersionString"] else { return "Unknown" } - + return "Cloudinary/\(build)" }() let info = Bundle.main.infoDictionary let executable = info?[kCFBundleExecutableKey as String] as? String ?? "Unknown" let appVersion = info?["CFBundleShortVersionString"] as? String ?? "Unknown" - - + + XCTAssertTrue(userAgent?.contains(cloudinaryVersion) == true) XCTAssertTrue(userAgent?.contains(osNameVersion) == true) XCTAssertTrue(userAgent?.contains("\(executable)/\(appVersion)") == true) } - + // MARK: Tests - Start Requests Immediately - + func testSetStartRequestsImmediatelyToFalseAndResumeRequest() { // Given let manager = CLDNSessionManager() manager.startRequestsImmediately = false - - let url = URL(string: "https://mockbin.com/")! + + let url = URL(string: "https://httpbin.org/")! let urlRequest = URLRequest(url: url) - + let expectation = self.expectation(description: "\(url)") - + var response: HTTPURLResponse? - + // When manager.request(urlRequest) .response { resp in @@ -277,249 +277,249 @@ class SessionManagerTestCase: BaseTestCase { expectation.fulfill() } .resume() - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotNil(response, "response should not be nil") XCTAssertTrue(response?.statusCode == 200, "response status code should be 200") } - + // MARK: Tests - Deinitialization - + func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() { // Given var manager: CLDNSessionManager? = CLDNSessionManager() manager?.startRequestsImmediately = false - - let url = URL(string: "https://mockbin.com/get")! + + let url = URL(string: "https://httpbin.org/get")! let urlRequest = URLRequest(url: url) - + // When let request = manager?.request(urlRequest) manager = nil - + // Then XCTAssertTrue(request?.task?.state == .suspended, "request task state should be '.Suspended'") XCTAssertNil(manager, "manager should be nil") } - + func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() { // Given var manager: CLDNSessionManager? = CLDNSessionManager() manager!.startRequestsImmediately = false - - let url = URL(string: "https://mockbin.com/")! + + let url = URL(string: "https://httpbin.org/")! let urlRequest = URLRequest(url: url) - + // When let request = manager!.request(urlRequest) request.cancel() manager = nil - + // Then let state = request.task?.state XCTAssertTrue(state == .canceling || state == .completed, "state should be .Canceling or .Completed") XCTAssertNil(manager, "manager should be nil") } - + // MARK: Tests - Bad Requests - + func skipped_testThatDataRequestWithInvalidURLStringThrowsResponseHandlerError() { // Given let sessionManager = CLDNSessionManager() let expectation = self.expectation(description: "CLDNRequest should fail with error") - + var response: CLDNDefaultDataResponse? - + // When - sessionManager.request("https://mockbin.com/get/äëïöü").response { resp in + sessionManager.request("https://httpbin.org/get/äëïöü").response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.data?.count, 0) XCTAssertNotNil(response?.error) - + if let error = response?.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError) - XCTAssertEqual(error.urlConvertible as? String, "https://mockbin.com/get/äëïöü") + XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü") } else { XCTFail("error should not be nil") } } - + func skipped_testThatUploadDataRequestWithInvalidURLStringThrowsResponseHandlerError() { // Given let sessionManager = CLDNSessionManager() let expectation = self.expectation(description: "Upload should fail with error") - + var response: CLDNDefaultDataResponse? - + // When - sessionManager.upload(Data(), to: "https://mockbin.com/").response { resp in + sessionManager.upload(Data(), to: "https://httpbin.org/").response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.data?.count, 0) XCTAssertNotNil(response?.error) - + if let error = response?.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError) - XCTAssertEqual(error.urlConvertible as? String, "https://mockbin.com/get/äëïöü") + XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü") } else { XCTFail("error should not be nil") } } - + func skipped_testThatUploadFileRequestWithInvalidURLStringThrowsResponseHandlerError() { // Given let sessionManager = CLDNSessionManager() let expectation = self.expectation(description: "Upload should fail with error") - + var response: CLDNDefaultDataResponse? - + // When - sessionManager.upload(URL(fileURLWithPath: "/invalid"), to: "https://mockbin.com/get/äëïöü").response { resp in + sessionManager.upload(URL(fileURLWithPath: "/invalid"), to: "https://httpbin.org/get/äëïöü").response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.data?.count, 0) XCTAssertNotNil(response?.error) - + if let error = response?.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError) - XCTAssertEqual(error.urlConvertible as? String, "https://mockbin.com/get/äëïöü") + XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü") } else { XCTFail("error should not be nil") } } - + func skipped_testThatUploadStreamRequestWithInvalidURLStringThrowsResponseHandlerError() { // Given let sessionManager = CLDNSessionManager() let expectation = self.expectation(description: "Upload should fail with error") - + var response: CLDNDefaultDataResponse? - + // When - sessionManager.upload(InputStream(data: Data()), to: "https://mockbin.com/get/äëïöü").response { resp in + sessionManager.upload(InputStream(data: Data()), to: "https://httpbin.org/get/äëïöü").response { resp in response = resp expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNil(response?.request) XCTAssertNil(response?.response) XCTAssertNotNil(response?.data) XCTAssertEqual(response?.data?.count, 0) XCTAssertNotNil(response?.error) - + if let error = response?.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError) - XCTAssertEqual(error.urlConvertible as? String, "https://mockbin.com/get/äëïöü") + XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü") } else { XCTFail("error should not be nil") } } - + // MARK: Tests - CLDNRequest Adapter - + func testThatSessionManagerCallsRequestAdapterWhenCreatingDataRequest() { // Given let adapter = HTTPMethodAdapter(method: .post) - + let sessionManager = CLDNSessionManager() sessionManager.adapter = adapter sessionManager.startRequestsImmediately = false - + // When - let request = sessionManager.request("https://mockbin.com/get") - + let request = sessionManager.request("https://httpbin.org/get") + // Then XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue) } - + func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithData() { // Given let adapter = HTTPMethodAdapter(method: .get) - + let sessionManager = CLDNSessionManager() sessionManager.adapter = adapter sessionManager.startRequestsImmediately = false - + // When - let request = sessionManager.upload("data".data(using: .utf8)!, to: "https://mockbin.com/post") - + let request = sessionManager.upload("data".data(using: .utf8)!, to: "https://httpbin.org/post") + // Then XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue) } - + func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithFile() { // Given let adapter = HTTPMethodAdapter(method: .get) - + let sessionManager = CLDNSessionManager() sessionManager.adapter = adapter sessionManager.startRequestsImmediately = false - + // When let fileURL = URL(fileURLWithPath: "/path/to/some/file.txt") - let request = sessionManager.upload(fileURL, to: "https://mockbin.com/post") - + let request = sessionManager.upload(fileURL, to: "https://httpbin.org/post") + // Then XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue) } - + func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithInputStream() { // Given let adapter = HTTPMethodAdapter(method: .get) - + let sessionManager = CLDNSessionManager() sessionManager.adapter = adapter sessionManager.startRequestsImmediately = false - + // When let inputStream = InputStream(data: "data".data(using: .utf8)!) - let request = sessionManager.upload(inputStream, to: "https://mockbin.com/post") - + let request = sessionManager.upload(inputStream, to: "https://httpbin.org/post") + // Then XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue) } - + func testThatRequestAdapterErrorThrowsResponseHandlerError() { // Given let adapter = HTTPMethodAdapter(method: .post, throwsError: true) - + let sessionManager = CLDNSessionManager() sessionManager.adapter = adapter sessionManager.startRequestsImmediately = false - + // When - let request = sessionManager.request("https://mockbin.com/get") - + let request = sessionManager.request("https://httpbin.org/get") + // Then if let error = request.delegate.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError) @@ -528,33 +528,33 @@ class SessionManagerTestCase: BaseTestCase { XCTFail("error should not be nil") } } - + // MARK: Tests - CLDNRequest Retrier - + func testThatSessionManagerCallsRequestRetrierWhenRequestEncountersError() throws { try XCTSkipUnless(allowManagerTest, "prevents the test from running, currently there's an issue when Travis CI runs this test") // Given let handler = RequestHandler() - + let sessionManager = CLDNSessionManager() sessionManager.adapter = handler sessionManager.retrier = handler - + let expectation = self.expectation(description: "request should eventually fail") var response: CLDNDataResponse? - + // When - let request = sessionManager.request("https://mockbin.com/basic-auth/user/password") + let request = sessionManager.request("https://httpbin.org/basic-auth/user/password") .validate() .responseJSON { jsonResponse in response = jsonResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(handler.adaptedCount, 2) XCTAssertEqual(handler.retryCount, 2) @@ -562,7 +562,7 @@ class SessionManagerTestCase: BaseTestCase { XCTAssertEqual(response?.result.isSuccess, false) XCTAssertTrue(sessionManager.delegate.requests.isEmpty) } - + func testThatSessionManagerCallsRequestRetrierWhenRequestInitiallyEncountersAdaptError() throws { try XCTSkipUnless(allowManagerTest, "prevents the test from running, currently there's an issue when Travis CI runs this test") @@ -572,68 +572,68 @@ class SessionManagerTestCase: BaseTestCase { handler.adaptedCount = 1 handler.throwsErrorOnSecondAdapt = true handler.shouldApplyAuthorizationHeader = true - + let sessionManager = CLDNSessionManager() sessionManager.adapter = handler sessionManager.retrier = handler - + let expectation = self.expectation(description: "request should eventually fail") var response: CLDNDataResponse? - + // When - sessionManager.request("https://mockbin.com/basic-auth/user/password") + sessionManager.request("https://httpbin.org/basic-auth/user/password") .validate() .responseJSON { jsonResponse in response = jsonResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(handler.adaptedCount, 2, "handler.adaptedCount should be equal to 2") XCTAssertEqual(handler.retryCount, 1, "handler.retryCount should be equal to 1") XCTAssertEqual(response?.result.isSuccess, true, "response?.result.isSuccess should be equal to true") XCTAssertTrue(sessionManager.delegate.requests.isEmpty, "delegate.requests.isEmpty should be empty") - + handler.retryErrors.forEach { XCTAssertFalse($0 is AdaptError, "retry error should not be AdaptError") } } - + func testThatSessionManagerCallsRequestRetrierWhenUploadInitiallyEncountersAdaptError() throws { try XCTSkipUnless(allowManagerTest, "prevents the test from running, currently there's an issue when Travis CI runs this test") - + // Given let handler = UploadHandler() - + let sessionManager = CLDNSessionManager() sessionManager.adapter = handler sessionManager.retrier = handler - + let expectation = self.expectation(description: "request should eventually fail") var response: CLDNDataResponse? - + let uploadData = "upload data".data(using: .utf8, allowLossyConversion: false)! - + // When - sessionManager.upload(uploadData, to: "https://mockbin.com/post") + sessionManager.upload(uploadData, to: "https://httpbin.org/post") .validate() .responseJSON { jsonResponse in response = jsonResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(handler.adaptedCount, 2) XCTAssertEqual(handler.retryCount, 1) XCTAssertEqual(response?.result.isSuccess, true) XCTAssertTrue(sessionManager.delegate.requests.isEmpty) - + handler.retryErrors.forEach { XCTAssertFalse($0 is AdaptError) } } - + func testThatSessionManagerCallsAdapterWhenRequestIsRetried() throws { try XCTSkipUnless(allowManagerTest, "prevents the test from running, currently there's an issue when Travis CI runs this test") @@ -641,24 +641,24 @@ class SessionManagerTestCase: BaseTestCase { // Given let handler = RequestHandler() handler.shouldApplyAuthorizationHeader = true - + let sessionManager = CLDNSessionManager() sessionManager.adapter = handler sessionManager.retrier = handler - + let expectation = self.expectation(description: "request should eventually fail") var response: CLDNDataResponse? - + // When - let request = sessionManager.request("https://mockbin.com/basic-auth/user/password") + let request = sessionManager.request("https://httpbin.org/basic-auth/user/password") .validate() .responseJSON { jsonResponse in response = jsonResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(handler.adaptedCount, 2) XCTAssertEqual(handler.retryCount, 1) @@ -666,7 +666,7 @@ class SessionManagerTestCase: BaseTestCase { XCTAssertEqual(response?.result.isSuccess, true) XCTAssertTrue(sessionManager.delegate.requests.isEmpty) } - + func testThatRequestAdapterErrorThrowsResponseHandlerErrorWhenRequestIsRetried() throws { try XCTSkipUnless(allowManagerTest, "prevents the test from running, currently there's an issue when Travis CI runs this test") @@ -674,31 +674,31 @@ class SessionManagerTestCase: BaseTestCase { // Given let handler = RequestHandler() handler.throwsErrorOnSecondAdapt = true - + let sessionManager = CLDNSessionManager() sessionManager.adapter = handler sessionManager.retrier = handler - + let expectation = self.expectation(description: "request should eventually fail") var response: CLDNDataResponse? - + // When - let request = sessionManager.request("https://mockbin.com/basic-auth/user/password") + let request = sessionManager.request("https://httpbin.org/basic-auth/user/password") .validate() .responseJSON { jsonResponse in response = jsonResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(handler.adaptedCount, 1, "handler.adaptedCount count should be equal to 0") XCTAssertEqual(handler.retryCount, 1, "handler.retry count should be equal to 0") XCTAssertEqual(request.retryCount, 0, "result.retry count should be equal to 0") XCTAssertEqual(response?.result.isSuccess, false, "result should succeed") XCTAssertTrue(sessionManager.delegate.requests.isEmpty, "delegate.requests should be empty") - + if let error = response?.result.error as? CLDNError { XCTAssertTrue(error.isInvalidURLError, "error.isInvalidURLError should be true") XCTAssertEqual(error.urlConvertible as? String, "", "error.urlConvertible shold be true") @@ -714,12 +714,12 @@ class SessionManagerConfigurationHeadersTestCase: BaseTestCase { enum ConfigurationType { case `default`, ephemeral, background } - + func testThatDefaultConfigurationHeadersAreSentWithRequest() { // Given, When, Then executeAuthorizationHeaderTest(for: .default) } - + func testThatEphemeralConfigurationHeadersAreSentWithRequest() { // Given, When, Then executeAuthorizationHeaderTest(for: .ephemeral) @@ -730,13 +730,13 @@ class SessionManagerConfigurationHeadersTestCase: BaseTestCase { executeAuthorizationHeaderTest(for: .background) } #endif - + private func executeAuthorizationHeaderTest(for type: ConfigurationType) { // Given let manager: CLDNSessionManager = { let configuration: URLSessionConfiguration = { let configuration: URLSessionConfiguration - + switch type { case .default: configuration = .default @@ -746,39 +746,41 @@ class SessionManagerConfigurationHeadersTestCase: BaseTestCase { let identifier = "org.cloudinary.test.manager-configuration-tests" configuration = .background(withIdentifier: identifier) } - + var headers = CLDNSessionManager.defaultHTTPHeaders headers["Authorization"] = "Bearer 123456" configuration.httpAdditionalHeaders = headers - + return configuration }() - + return CLDNSessionManager(configuration: configuration) }() - + let expectation = self.expectation(description: "request should complete successfully") - + var response: CLDNDataResponse? - + // When - manager.request("https://mockbin.com/header/Authorization") + manager.request("https://httpbin.org/headers") .responseJSON { closureResponse in response = closureResponse expectation.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) - + // Then if let response = response { XCTAssertNotNil(response.request, "request should not be nil") XCTAssertNotNil(response.response, "response should not be nil") XCTAssertNotNil(response.data, "data should not be nil") XCTAssertTrue(response.result.isSuccess, "result should be a success") - + if - let authorization = response.result.value as? String + let response = response.result.value as? [String: Any], + let headers = response["headers"] as? [String: String], + let authorization = headers["Authorization"] { XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match") } else { diff --git a/Example/Tests/BaseNetwork/Core/UploadTests.swift b/Example/Tests/BaseNetwork/Core/UploadTests.swift index d48ec3c8..36a042b7 100644 --- a/Example/Tests/BaseNetwork/Core/UploadTests.swift +++ b/Example/Tests/BaseNetwork/Core/UploadTests.swift @@ -28,7 +28,7 @@ import XCTest class UploadFileInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLAndFile() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let imageURL = url(forResource: "rainbow", withExtension: "jpg") // When @@ -43,7 +43,7 @@ class UploadFileInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLHeadersAndFile() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let headers = ["Authorization": "123456"] let imageURL = url(forResource: "rainbow", withExtension: "jpg") @@ -67,7 +67,7 @@ class UploadFileInitializationTestCase: BaseTestCase { class UploadDataInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLAndData() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" // When let request = CLDNSessionManager.default.upload(Data(), to: urlString) @@ -81,7 +81,7 @@ class UploadDataInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLHeadersAndData() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let headers = ["Authorization": "123456"] // When @@ -104,7 +104,7 @@ class UploadDataInitializationTestCase: BaseTestCase { class UploadStreamInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLAndStream() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let imageURL = url(forResource: "rainbow", withExtension: "jpg") let imageStream = InputStream(url: imageURL)! @@ -120,7 +120,7 @@ class UploadStreamInitializationTestCase: BaseTestCase { func testUploadClassMethodWithMethodURLHeadersAndStream() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let imageURL = url(forResource: "rainbow", withExtension: "jpg") let headers = ["Authorization": "123456"] let imageStream = InputStream(url: imageURL)! @@ -145,7 +145,7 @@ class UploadStreamInitializationTestCase: BaseTestCase { class UploadDataTestCase: BaseTestCase { func testUploadDataRequest() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let data = "Lorem ipsum dolor sit amet".data(using: .utf8, allowLossyConversion: false)! let expectation = self.expectation(description: "Upload request should succeed: \(urlString)") @@ -168,7 +168,7 @@ class UploadDataTestCase: BaseTestCase { func skipped_testUploadDataRequestWithProgress() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let data: Data = { var text = "" for _ in 1...3_000 { @@ -242,7 +242,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataSetsContentTypeHeader() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let uploadData = "upload_data".data(using: .utf8, allowLossyConversion: false)! let expectation = self.expectation(description: "multipart form data upload should succeed") @@ -291,7 +291,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataSucceedsWithDefaultParameters() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let frenchData = "français".data(using: .utf8, allowLossyConversion: false)! let japaneseData = "日本語".data(using: .utf8, allowLossyConversion: false)! @@ -337,7 +337,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataBelowMemoryThresholdStreamsFromMemory() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let frenchData = "français".data(using: .utf8, allowLossyConversion: false)! let japaneseData = "日本語".data(using: .utf8, allowLossyConversion: false)! @@ -381,7 +381,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataBelowMemoryThresholdSetsContentTypeHeader() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let uploadData = "upload data".data(using: .utf8, allowLossyConversion: false)! let expectation = self.expectation(description: "multipart form data upload should succeed") @@ -434,7 +434,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataAboveMemoryThresholdStreamsFromDisk() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let frenchData = "français".data(using: .utf8, allowLossyConversion: false)! let japaneseData = "日本語".data(using: .utf8, allowLossyConversion: false)! @@ -480,7 +480,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { func testThatUploadingMultipartFormDataAboveMemoryThresholdSetsContentTypeHeader() { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let uploadData = "upload data".data(using: .utf8, allowLossyConversion: false)! let expectation = self.expectation(description: "multipart form data upload should succeed") @@ -542,7 +542,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { return SessionManager(configuration: configuration, serverTrustPolicyManager: nil) }() - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let french = "français".data(using: .utf8, allowLossyConversion: false)! let japanese = "日本語".data(using: .utf8, allowLossyConversion: false)! @@ -600,7 +600,7 @@ class UploadMultipartFormDataTestCase: BaseTestCase { private func executeMultipartFormDataUploadRequestWithProgress(streamFromDisk: Bool) { // Given - let urlString = "https://mockbin.com/post" + let urlString = "https://httpbin.org/post" let loremData1: Data = { var loremValues: [String] = [] for _ in 1...1_500 { diff --git a/Example/Tests/BaseNetwork/Features/CacheTests.swift b/Example/Tests/BaseNetwork/Features/CacheTests.swift index 22a5532a..16d904bb 100644 --- a/Example/Tests/BaseNetwork/Features/CacheTests.swift +++ b/Example/Tests/BaseNetwork/Features/CacheTests.swift @@ -72,7 +72,7 @@ class CacheTestCase: BaseTestCase { var urlCache: URLCache! var manager: CLDNSessionManager! - let urlString = "https://mockbin.com/response-headers" + let urlString = "https://httpbin.org/response-headers" let requestTimeout: TimeInterval = 30 var requests: [String: URLRequest] = [:] diff --git a/Example/Tests/BaseNetwork/Features/ResponseSerializationTests.swift b/Example/Tests/BaseNetwork/Features/ResponseSerializationTests.swift index 972c7baf..58ea70ab 100644 --- a/Example/Tests/BaseNetwork/Features/ResponseSerializationTests.swift +++ b/Example/Tests/BaseNetwork/Features/ResponseSerializationTests.swift @@ -26,7 +26,7 @@ import Foundation import XCTest private func httpURLResponse(forStatusCode statusCode: Int, headers: CLDNHTTPHeaders = [:]) -> HTTPURLResponse { - let url = URL(string: "https://mockbin.com/get")! + let url = URL(string: "https://httpbin.org/get")! return HTTPURLResponse(url: url, statusCode: statusCode, httpVersion: "HTTP/1.1", headerFields: headers)! } diff --git a/Example/Tests/BaseNetwork/Features/URLProtocolTests.swift b/Example/Tests/BaseNetwork/Features/URLProtocolTests.swift index 517c25a2..ed79d241 100644 --- a/Example/Tests/BaseNetwork/Features/URLProtocolTests.swift +++ b/Example/Tests/BaseNetwork/Features/URLProtocolTests.swift @@ -135,7 +135,7 @@ class URLProtocolTestCase: BaseTestCase { func skipped_testThatURLProtocolReceivesRequestHeadersAndSessionConfigurationHeaders() { // Given - let urlString = "https://mockbin.com/headers" + let urlString = "https://httpbin.org/headers" let url = URL(string: urlString)! var urlRequest = URLRequest(url: url) diff --git a/Example/Tests/BaseNetwork/Features/ValidationTests.swift b/Example/Tests/BaseNetwork/Features/ValidationTests.swift index 1fb873ed..d4575758 100644 --- a/Example/Tests/BaseNetwork/Features/ValidationTests.swift +++ b/Example/Tests/BaseNetwork/Features/ValidationTests.swift @@ -28,7 +28,7 @@ import XCTest class StatusCodeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableStatusCodeResponseSucceeds() { // Given - let urlString = "https://mockbin.com/status/200" + let urlString = "https://httpbin.org/status/200" let expectation1 = self.expectation(description: "request should return 200 status code") @@ -49,7 +49,7 @@ class StatusCodeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableStatusCodeResponseFails() { // Given - let urlString = "https://mockbin.com/status/404" + let urlString = "https://httpbin.org/status/404" let expectation1 = self.expectation(description: "request should return 404 status code") @@ -80,7 +80,7 @@ class StatusCodeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithNoAcceptableStatusCodesFails() { // Given - let urlString = "https://mockbin.com/status/201" + let urlString = "https://httpbin.org/status/201" let expectation1 = self.expectation(description: "request should return 201 status code") @@ -115,7 +115,7 @@ class StatusCodeValidationTestCase: BaseTestCase { class ContentTypeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableContentTypeResponseSucceeds() { // Given - let urlString = "https://mockbin.com/ip" + let urlString = "https://httpbin.org/ip" let expectation1 = self.expectation(description: "request should succeed and return ip") @@ -139,7 +139,7 @@ class ContentTypeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableWildcardContentTypeResponseSucceeds() { // Given - let urlString = "https://mockbin.com/ip" + let urlString = "https://httpbin.org/ip" let expectation1 = self.expectation(description: "request should succeed and return ip") @@ -163,7 +163,7 @@ class ContentTypeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableContentTypeResponseFails() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation1 = self.expectation(description: "request should succeed and return html") @@ -195,7 +195,7 @@ class ContentTypeValidationTestCase: BaseTestCase { func testThatValidationForRequestWithNoAcceptableContentTypeResponseFails() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation1 = self.expectation(description: "request should succeed and return html") @@ -297,7 +297,7 @@ class ContentTypeValidationTestCase: BaseTestCase { return MockManager(configuration: configuration) }() - let urlString = "https://mockbin.com/delete" + let urlString = "https://httpbin.org/delete" let expectation1 = self.expectation(description: "request should be stubbed and return 204 status code") @@ -328,7 +328,7 @@ class ContentTypeValidationTestCase: BaseTestCase { class MultipleValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableStatusCodeAndContentTypeResponseSucceeds() { // Given - let urlString = "https://mockbin.com/ip" + let urlString = "https://httpbin.org/ip" let expectation1 = self.expectation(description: "request should succeed and return ip") @@ -351,10 +351,10 @@ class MultipleValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableStatusCodeAndContentTypeResponseFailsWithStatusCodeError() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation1 = self.expectation(description: "request should succeed and return status code 200") - + var requestError: Error? // When @@ -383,7 +383,7 @@ class MultipleValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableStatusCodeAndContentTypeResponseFailsWithContentTypeError() { // Given - let urlString = "https://mockbin.com/" + let urlString = "https://httpbin.org/" let expectation1 = self.expectation(description: "request should succeed and return html") @@ -419,9 +419,9 @@ class MultipleValidationTestCase: BaseTestCase { class AutomaticValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableStatusCodeAndContentTypeResponseSucceeds() { - + // Given - let url = URL(string: "https://mockbin.com/ip")! + let url = URL(string: "https://httpbin.org/ip")! var urlRequest = URLRequest(url: url) urlRequest.setValue("application/json", forHTTPHeaderField: "Accept") @@ -443,7 +443,7 @@ class AutomaticValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableStatusCodeResponseFails() { // Given - let urlString = "https://mockbin.com/status/404" + let urlString = "https://httpbin.org/status/404" let expectation1 = self.expectation(description: "request should return 404 status code") @@ -456,7 +456,7 @@ class AutomaticValidationTestCase: BaseTestCase { requestError = resp.error expectation1.fulfill() } - + waitForExpectations(timeout: timeout, handler: nil) // Then @@ -474,7 +474,7 @@ class AutomaticValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableWildcardContentTypeResponseSucceeds() { // Given - let url = URL(string: "https://mockbin.com/ip")! + let url = URL(string: "https://httpbin.org/ip")! var urlRequest = URLRequest(url: url) urlRequest.setValue("application/*", forHTTPHeaderField: "Accept") @@ -496,7 +496,7 @@ class AutomaticValidationTestCase: BaseTestCase { func testThatValidationForRequestWithAcceptableComplexContentTypeResponseSucceeds() { // Given - let url = URL(string: "https://mockbin.com/")! + let url = URL(string: "https://httpbin.org/")! var urlRequest = URLRequest(url: url) let headerValue = "text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8,*/*;q=0.5" @@ -520,7 +520,7 @@ class AutomaticValidationTestCase: BaseTestCase { func testThatValidationForRequestWithUnacceptableContentTypeResponseFails() { // Given - let url = URL(string: "https://mockbin.com/")! + let url = URL(string: "https://httpbin.org/")! var urlRequest = URLRequest(url: url) urlRequest.setValue("application/json", forHTTPHeaderField: "Accept") @@ -575,7 +575,7 @@ extension CLDNDataRequest { class CustomValidationTestCase: BaseTestCase { func testThatCustomValidationClosureHasAccessToServerResponseData() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation1 = self.expectation(description: "request should return 200 status code") @@ -601,7 +601,7 @@ class CustomValidationTestCase: BaseTestCase { func testThatCustomValidationCanThrowCustomError() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation1 = self.expectation(description: "request should return 200 status code") @@ -625,7 +625,7 @@ class CustomValidationTestCase: BaseTestCase { func testThatValidationExtensionHasAccessToServerResponseData() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation1 = self.expectation(description: "request should return 200 status code") @@ -647,7 +647,7 @@ class CustomValidationTestCase: BaseTestCase { func testThatValidationExtensionCanThrowCustomError() { // Given - let urlString = "https://mockbin.com/get" + let urlString = "https://httpbin.org/get" let expectation1 = self.expectation(description: "request should return 200 status code") diff --git a/Example/Tests/NetworkTests/DownloaderTests.swift b/Example/Tests/NetworkTests/DownloaderTests.swift index 76601c2b..a9335deb 100644 --- a/Example/Tests/NetworkTests/DownloaderTests.swift +++ b/Example/Tests/NetworkTests/DownloaderTests.swift @@ -27,77 +27,77 @@ import Cloudinary @testable import Cloudinary class DownloaderTests: NetworkBaseTest { - + // MARK: - Tests func test_downloadImage_shouldReturnNetworkErrorCode() { var expectation = self.expectation(description: "Should get 404 error") var error: NSError? let firstMockUrl = "https://demo-res.cloudinary.com/image/upload/c_fill,dpr_3.0,f_heic,g_auto,h_100,q_auto,w_100/v1/some_invalid_url" - let secondMockUrl = "https://mockbin.com/status/404" - + let secondMockUrl = "https://httpbin.org/status/404" + cloudinarySecured.createDownloader().fetchImage(firstMockUrl).responseImage({ (_, errorRes) in error = errorRes expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) verify404ErrorCode(in: error) - + expectation = self.expectation(description: "Should get 404 error") cloudinarySecured.createDownloader().fetchImage(secondMockUrl).responseImage({ (_, errorRes) in error = errorRes expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) verify404ErrorCode(in: error) } - + private func verify404ErrorCode(in error: Error?) { XCTAssertNotNil(error, "should get an error") XCTAssertNotNil((error! as NSError).userInfo["statusCode"], "should get a statusCode in user info") - + let statusCode = (error! as NSError).userInfo["statusCode"] as! Int XCTAssertTrue(statusCode == 404, "Mock error should be 404 in this test") let httpStatusCode = HTTPStatusCode(rawValue: statusCode) XCTAssertNotNil(httpStatusCode, "should get a case") XCTAssertTrue(httpStatusCode?.rawValue == 404) } - + func test_downloadImage_shouldDownloadImage() { XCTAssertNotNil(cloudinarySecured.config.apiSecret, "Must set api secret for this test") - + var expectation = self.expectation(description: "Upload should succeed") - + var publicId: String? uploadFile().response({ (result, error) in XCTAssertNil(error) publicId = result?.publicId expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + guard let pubId = publicId else { XCTFail("Public ID should not be nil at this point") return } - + expectation = self.expectation(description: "test_downloadImage_shouldDownloadImage Download should succeed") - + var response: UIImage? var error: NSError? - + let url = cloudinarySecured!.createUrl().generate(pubId) cloudinarySecured.createDownloader().fetchImage(url!).responseImage({ (responseImage, errorRes) in response = responseImage error = errorRes - + expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + XCTAssertNotNil(response, "response should not be nil") XCTAssertNil(error, "error should be nil") } @@ -109,9 +109,9 @@ class DownloaderTests: NetworkBaseTest { func test_downloadImageWithoutCache_shouldCacheImage() { downloadImageWithoutCache_shouldNotCacheImage(cloudinaryObject: cloudinarySecured) } - + func test_downloadImageWithCache_emptyInit_shouldCacheImage() { - + // Given let config: CLDConfiguration if let url = Bundle(for: type(of: self)).infoDictionary?["cldCloudinaryUrl"] as? String, url.count > 0 { @@ -124,11 +124,11 @@ class DownloaderTests: NetworkBaseTest { let tempSut = CLDCloudinary(configuration: config, networkAdapter: nil, downloadAdapter: nil, sessionConfiguration: nil, downloadSessionConfiguration: nil) tempSut.enableUrlCache = false tempSut.cachePolicy = .disk - + downloadImageWithCache_shouldCacheImage(cloudinaryObject: tempSut) } func test_downloadImageWithoutCache_emptyInit_shouldCacheImage() { - + // Given let config: CLDConfiguration if let url = Bundle(for: type(of: self)).infoDictionary?["cldCloudinaryUrl"] as? String, url.count > 0 { @@ -136,24 +136,24 @@ class DownloaderTests: NetworkBaseTest { } else { config = CLDConfiguration.initWithEnvParams() ?? CLDConfiguration(cloudinaryUrl: "cloudinary://a:b@test123")! } - + // When let tempSut = CLDCloudinary(configuration: config, networkAdapter: nil, downloadAdapter: nil, sessionConfiguration: nil, downloadSessionConfiguration: nil) - + downloadImageWithoutCache_shouldNotCacheImage(cloudinaryObject: tempSut) } } extension DownloaderTests { - + // MARK: - cache by cloudinary func downloadImageWithCache_shouldCacheImage(cloudinaryObject: CLDCloudinary) { - + XCTAssertNotNil(cloudinaryObject.config.apiSecret, "Must set api secret for this test") - + // When var expectation = self.expectation(description: "Upload should succeed") - + /// upload file to get publicId var publicId: String? uploadFile().response({ (result, error) in @@ -161,16 +161,16 @@ extension DownloaderTests { publicId = result?.publicId expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + guard let pubId = publicId else { XCTFail("Public ID should not be nil at this point") return } - + expectation = self.expectation(description: "Download 1 should succeed") - + var response: UIImage? /// download image by publicId - first time, no cache yet let url = cloudinaryObject.createUrl().generate(pubId) @@ -178,26 +178,26 @@ extension DownloaderTests { response = responseImage expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + expectation = self.expectation(description: "Download 2 should succeed") - + var responseCached: UIImage? /// download image by publicId - should get from cache so responses should be equal cloudinaryObject.createDownloader().fetchImage(url!).responseImage({ (responseImage, errorRes) in responseCached = responseImage - + expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertEqual(response, responseCached, "Images should be equal because it is the image we cached") expectation = self.expectation(description: "Download 3 should succeed") - + /// remove from cache and re-download - image should be different cloudinaryObject.removeFromCache(key: url!) cloudinaryObject.createDownloader().fetchImage(url!).responseImage({ (responseImage, errorRes) in @@ -211,61 +211,61 @@ extension DownloaderTests { XCTAssertNotEqual(response, responseCached, "Images should be differet because image was removed from cache") } func downloadImageWithoutCache_shouldNotCacheImage(cloudinaryObject: CLDCloudinary) { - + XCTAssertNotNil(cloudinaryObject.config.apiSecret, "Must set api secret for this test") - + // Given var publicId: String? var response: UIImage? var error: NSError? var responseCached: UIImage? - + cloudinaryObject.cacheMaxMemoryTotalCost = 20 cloudinaryObject.cacheMaxDiskCapacity = 20 - + // When var expectation = self.expectation(description: "Upload should succeed") - + /// upload file to get publicId uploadFile().response({ (result, error) in XCTAssertNil(error) publicId = result?.publicId expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + guard let pubId = publicId else { XCTFail("Public ID should not be nil at this point") return } - + expectation = self.expectation(description: "downloadImageWithoutCache_shouldNotCacheImage Download 1 should succeed") - + let url = cloudinaryObject.createUrl().generate(pubId) - + /// download image that will not get cached due to low capacity cloudinaryObject.createDownloader().fetchImage(url!).responseImage({ (responseImage, errorRes) in response = responseImage error = errorRes - + expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + expectation = self.expectation(description: "downloadImageWithoutCache_shouldNotCacheImage Download 2 should succeed") - + /// download again (should not get the image from cache due to low capacity) cloudinaryObject.createDownloader().fetchImage(url!).responseImage({ (responseImage, errorRes) in responseCached = responseImage error = errorRes - + expectation.fulfill() }) - + waitForExpectations(timeout: timeout, handler: nil) - + // Then XCTAssertNotEqual(response, responseCached, "Images should be not same because the size of the cache is too small") XCTAssertNotNil(response, "response should not be nil") diff --git a/Example/Tests/NetworkTests/UploaderTests/UploaderTests.swift b/Example/Tests/NetworkTests/UploaderTests/UploaderTests.swift index fa78ae8c..f71eef12 100644 --- a/Example/Tests/NetworkTests/UploaderTests/UploaderTests.swift +++ b/Example/Tests/NetworkTests/UploaderTests/UploaderTests.swift @@ -373,33 +373,6 @@ class UploaderTests: NetworkBaseTest { XCTAssertNotNil(requestError, "Error should not be nil") } - func testUploadLarge() { - XCTAssertNotNil(cloudinary!.config.apiSecret, "Must set api secret for this test") - - let expectation = self.expectation(description: "Upload large should succeed") - let file = TestResourceType.dog.url - let filename = TestResourceType.dog.fileName - var requestResult: CLDUploadResult? - var requestError: NSError? - - let params = CLDUploadRequestParams() - params.setResourceType(CLDUrlResourceType.video) - params.setUseFilename(true) - - - cloudinary!.createUploader().signedUploadLarge(url: file, params: params, chunkSize: 5 * 1024 * 1024).response({ (result, error) in - requestResult = result - requestError = error - expectation.fulfill() - }) - - waitForExpectations(timeout: timeout, handler: nil) - - XCTAssertNotNil(requestResult, "result should not be nil") - XCTAssertNil(requestError, "error should be nil") - XCTAssertTrue(isUsedFilename(filename: filename, publicId: requestResult?.publicId)) - } - func testUploadVideoData() { XCTAssertNotNil(cloudinary!.config.apiSecret, "Must set api secret for this test") @@ -1430,7 +1403,35 @@ class UploaderTests: NetworkBaseTest { return result! } - + + func testUploadLarge() { + XCTAssertNotNil(cloudinary!.config.apiSecret, "Must set api secret for this test") + + let expectation = self.expectation(description: "Upload large should succeed") + let file = TestResourceType.dog.url + let filename = TestResourceType.dog.fileName + var requestResult: CLDUploadResult? + var requestError: NSError? + + let params = CLDUploadRequestParams() + params.setResourceType(CLDUrlResourceType.video) + params.setUseFilename(true) + + + cloudinary!.createUploader().signedUploadLarge(url: file, params: params, chunkSize: 5 * 1024 * 1024).response({ (result, error) in + requestResult = result + requestError = error + expectation.fulfill() + }) + + waitForExpectations(timeout: timeout, handler: nil) + + XCTAssertNotNil(requestResult, "result should not be nil") + XCTAssertNil(requestError, "error should be nil") + XCTAssertTrue(isUsedFilename(filename: filename, publicId: requestResult?.publicId)) + } + + func validateQualityOverride(publicId: String, quality: String, shouldSucceed: Bool){ let qualityOverrideExpectation = self.expectation(description: "Explicit call with quality override should succeed")