Просмотр исходного кода

Add escaping and tests for async test

onevcat 5 лет назад
Родитель
Сommit
09e5f68fa8

+ 4 - 4
Sources/Networking/ImageDownloader.swift

@@ -221,7 +221,7 @@ open class ImageDownloader {
     private func createDownloadContext(
         with url: URL,
         options: KingfisherParsedOptionsInfo,
-        done: ((Result<DownloadingContext, KingfisherError>) -> Void)
+        done: @escaping ((Result<DownloadingContext, KingfisherError>) -> Void)
     )
     {
         func checkRequestAndDone(r: URLRequest) {
@@ -340,7 +340,7 @@ open class ImageDownloader {
         return downloadTask
     }
 
-    // MARK: Dowloading Task
+    // MARK: Downloading Task
     /// Downloads an image with a URL and option. Invoked internally by Kingfisher. Subclasses must invoke super.
     ///
     /// - Parameters:
@@ -364,9 +364,9 @@ open class ImageDownloader {
                 // `AsyncImageDownloadRequestModifier` is used the returned `downloadTask` of this method will be `nil`
                 // and the actual "delayed" task is given in `AsyncImageDownloadRequestModifier.onDownloadTaskStarted`
                 // callback.
-                downloadTask = startDownloadTask(
+                downloadTask = self.startDownloadTask(
                     context: context,
-                    callback: createTaskCallback(completionHandler, options: options)
+                    callback: self.createTaskCallback(completionHandler, options: options)
                 )
                 if let modifier = options.requestModifier {
                     modifier.onDownloadTaskStarted?(downloadTask)

+ 3 - 3
Sources/Networking/RequestModifier.swift

@@ -27,7 +27,7 @@
 import Foundation
 
 public protocol AsyncImageDownloadRequestModifier {
-    func modified(for request: URLRequest, modify: (URLRequest?) -> Void)
+    func modified(for request: URLRequest, reportModified: @escaping (URLRequest?) -> Void)
     var onDownloadTaskStarted: ((DownloadTask?) -> Void)? { get }
 }
 
@@ -52,9 +52,9 @@ public protocol ImageDownloadRequestModifier: AsyncImageDownloadRequestModifier
 }
 
 extension ImageDownloadRequestModifier {
-    public func modified(for request: URLRequest, modify: (URLRequest?) -> Void) {
+    public func modified(for request: URLRequest, reportModified: @escaping (URLRequest?) -> Void) {
         let request = modified(for: request)
-        modify(request)
+        reportModified(request)
     }
 
     public var onDownloadTaskStarted: ((DownloadTask?) -> Void)? { return nil }

+ 42 - 1
Tests/KingfisherTests/ImageDownloaderTests.swift

@@ -112,11 +112,40 @@ class ImageDownloaderTests: XCTestCase {
         modifier.url = url
         
         let someURL = URL(string: "some_strange_url")!
-        downloader.downloadImage(with: someURL, options: [.requestModifier(modifier)]) { result in
+        let task = downloader.downloadImage(with: someURL, options: [.requestModifier(modifier)]) { result in
             XCTAssertNotNil(result.value)
             XCTAssertEqual(result.value?.url, url)
             exp.fulfill()
         }
+        XCTAssertNotNil(task)
+        waitForExpectations(timeout: 3, handler: nil)
+    }
+
+    func testDownloadWithAsyncModifyingRequest() {
+        let exp = expectation(description: #function)
+
+        let url = testURLs[0]
+        stub(url, data: testImageData)
+
+        var downloadTaskCalled = false
+
+        let asyncModifier = AsyncURLModifier()
+        asyncModifier.url = url
+        asyncModifier.onDownloadTaskStarted = { task in
+            XCTAssertNotNil(task)
+            downloadTaskCalled = true
+        }
+
+
+        let someURL = URL(string: "some_strage_url")!
+        let task = downloader.downloadImage(with: someURL, options: [.requestModifier(asyncModifier)]) { result in
+            XCTAssertNotNil(result.value)
+            XCTAssertEqual(result.value?.url, url)
+            XCTAssertTrue(downloadTaskCalled)
+            exp.fulfill()
+        }
+        // The returned task is nil since the download is not starting immediately.
+        XCTAssertNil(task)
         waitForExpectations(timeout: 3, handler: nil)
     }
 
@@ -535,3 +564,15 @@ class URLModifier: ImageDownloadRequestModifier {
     }
 }
 
+class AsyncURLModifier: AsyncImageDownloadRequestModifier {
+    var url: URL? = nil
+    var onDownloadTaskStarted: ((DownloadTask?) -> Void)?
+
+    func modified(for request: URLRequest, reportModified: @escaping (URLRequest?) -> Void) {
+        var r = request
+        r.url = url
+        DispatchQueue.main.async {
+            reportModified(r)
+        }
+    }
+}