Browse Source

Added RequestRetrier tests verifying retrier and adapter are called.

Christian Noon 9 years ago
parent
commit
6ab9b059b4
1 changed files with 87 additions and 0 deletions
  1. 87 0
      Tests/SessionManagerTests.swift

+ 87 - 0
Tests/SessionManagerTests.swift

@@ -44,6 +44,36 @@ class SessionManagerTestCase: BaseTestCase {
         }
     }
 
+    private class RequestHandler: RequestAdapter, RequestRetrier {
+        var adaptedCount = 0
+        var retryCount = 0
+        var shouldApplyAuthorizationHeader = false
+
+        func adapt(_ urlRequest: URLRequest) -> URLRequest {
+            var urlRequest = urlRequest
+
+            adaptedCount += 1
+
+            if shouldApplyAuthorizationHeader && adaptedCount > 1 {
+                Request.authorizationHeaderFrom(user: "user", password: "password").forEach { header, value in
+                    urlRequest.setValue(value, forHTTPHeaderField: header)
+                }
+            }
+
+            return urlRequest
+        }
+
+        func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: RequestRetryCompletion) {
+            retryCount += 1
+
+            if retryCount < 2 {
+                completion(true, 0.0)
+            } else {
+                completion(false, 0.0)
+            }
+        }
+    }
+
     // MARK: Tests - Initialization
 
     func testInitializerWithDefaultArguments() {
@@ -293,6 +323,63 @@ class SessionManagerTestCase: BaseTestCase {
         // Then
         XCTAssertEqual(request.task.originalRequest?.httpMethod, adapter.method.rawValue)
     }
+
+    // MARK: Tests - Request Retrier
+
+    func testThatSessionManagerCallsRequestRetrierWhenRequestEncountersError() {
+        // Given
+        let handler = RequestHandler()
+
+        let sessionManager = SessionManager()
+        sessionManager.adapter = handler
+        sessionManager.retrier = handler
+
+        let expectation = self.expectation(description: "request should eventually fail")
+        var response: Response<Any>?
+
+        // When
+        sessionManager.request("https://httpbin.org/basic-auth/user/password", withMethod: .get)
+            .validate()
+            .responseJSON { jsonResponse in
+                response = jsonResponse
+                expectation.fulfill()
+            }
+
+        waitForExpectations(timeout: timeout, handler: nil)
+
+        // Then
+        XCTAssertEqual(handler.adaptedCount, 2)
+        XCTAssertEqual(handler.retryCount, 2)
+        XCTAssertEqual(response?.result.isSuccess, false)
+    }
+
+    func testThatSessionManagerCallsAdapterWhenRequestIsRetried() {
+        // Given
+        let handler = RequestHandler()
+        handler.shouldApplyAuthorizationHeader = true
+
+        let sessionManager = SessionManager()
+        sessionManager.adapter = handler
+        sessionManager.retrier = handler
+
+        let expectation = self.expectation(description: "request should eventually fail")
+        var response: Response<Any>?
+
+        // When
+        sessionManager.request("https://httpbin.org/basic-auth/user/password", withMethod: .get)
+            .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)
+    }
 }
 
 // MARK: -