Bladeren bron

Sort acceptable content-types in error messages (#3518)

Co-authored-by: Timur Yusipov <tryusipov@avito.ru>
Timur Yusipov 4 jaren geleden
bovenliggende
commit
26b8c9a41a
2 gewijzigde bestanden met toevoegingen van 74 en 2 verwijderingen
  1. 2 2
      Source/Validation.swift
  2. 72 0
      Tests/ValidationTests.swift

+ 2 - 2
Source/Validation.swift

@@ -117,7 +117,7 @@ extension Request {
             }
 
             let error: AFError = {
-                let reason: ErrorReason = .missingContentType(acceptableContentTypes: Array(acceptableContentTypes))
+                let reason: ErrorReason = .missingContentType(acceptableContentTypes: acceptableContentTypes.sorted())
                 return AFError.responseValidationFailed(reason: reason)
             }()
 
@@ -131,7 +131,7 @@ extension Request {
         }
 
         let error: AFError = {
-            let reason: ErrorReason = .unacceptableContentType(acceptableContentTypes: Array(acceptableContentTypes),
+            let reason: ErrorReason = .unacceptableContentType(acceptableContentTypes: acceptableContentTypes.sorted(),
                                                                responseContentType: responseContentType)
 
             return AFError.responseValidationFailed(reason: reason)

+ 72 - 0
Tests/ValidationTests.swift

@@ -247,6 +247,78 @@ final class ContentTypeValidationTestCase: BaseTestCase {
         }
     }
 
+    func testThatContentTypeValidationFailureSortsPossibleContentTypes() {
+        // Given
+        let endpoint = Endpoint.xml
+
+        let requestDidCompleteExpectation = expectation(description: "request should succeed and return xml")
+        let downloadDidCompleteExpectation = expectation(description: "download should succeed and return xml")
+
+        var requestError: AFError?
+        var downloadError: AFError?
+
+        let acceptableContentTypes = [ // Sorted in a random order, not alphabetically
+            "application/octet-stream",
+            "image/gif",
+            "image/x-xbitmap",
+            "image/tiff",
+            "image/jpg",
+            "image/x-bmp",
+            "image/jpeg",
+            "image/x-icon",
+            "image/jp2",
+            "image/png",
+            "image/ico",
+            "image/bmp",
+            "image/x-ms-bmp",
+            "image/x-win-bitmap"
+        ]
+
+        // When
+        AF.request(endpoint)
+            .validate(contentType: acceptableContentTypes)
+            .response { resp in
+                requestError = resp.error
+                requestDidCompleteExpectation.fulfill()
+            }
+
+        AF.download(endpoint)
+            .validate(contentType: acceptableContentTypes)
+            .response { resp in
+                downloadError = resp.error
+                downloadDidCompleteExpectation.fulfill()
+            }
+
+        waitForExpectations(timeout: timeout)
+
+        // Then
+        XCTAssertNotNil(requestError)
+        XCTAssertNotNil(downloadError)
+
+        let expectedAcceptableContentTypes = [ // Sorted in a specific order, alphabetically
+             "application/octet-stream",
+             "image/bmp",
+             "image/gif",
+             "image/ico",
+             "image/jp2",
+             "image/jpeg",
+             "image/jpg",
+             "image/png",
+             "image/tiff",
+             "image/x-bmp",
+             "image/x-icon",
+             "image/x-ms-bmp",
+             "image/x-win-bitmap",
+             "image/x-xbitmap",
+         ]
+
+        for error in [requestError, downloadError] {
+            XCTAssertEqual(error?.isUnacceptableContentType, true)
+            XCTAssertEqual(error?.responseContentType, "application/xml")
+            XCTAssertEqual(error?.acceptableContentTypes, expectedAcceptableContentTypes)
+        }
+    }
+
     func testThatValidationForRequestWithNoAcceptableContentTypeResponseFails() {
         // Given
         let endpoint = Endpoint.xml