Skip to content

Commit

Permalink
fix download progress bug
Browse files Browse the repository at this point in the history
close Moya#715
  • Loading branch information
pmairoldi committed Oct 14, 2016
1 parent 0b2c725 commit a57f6e6
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 0 deletions.
46 changes: 46 additions & 0 deletions Demo/Tests/MoyaProviderSpec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -587,5 +587,51 @@ class MoyaProviderSpec: QuickSpec {
expect(underlyingIsCancelled).to(beTrue())
}
}

describe("a provider with progress tracking") {
var provider: MoyaProvider<GitHubUserContent>!
beforeEach {

//delete downloaded filed before each test
let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let file = directory.appendingPathComponent("logo_github.png")
try? FileManager.default.removeItem(at: file)

//`responseTime(-4)` equals to 1000 bytes at a time. The sample data is 4000 bytes.
OHHTTPStubs.stubRequests(passingTest: {$0.url!.path.hasSuffix("logo_github.png")}) { _ in
return OHHTTPStubsResponse(data: GitHubUserContent.downloadMoyaWebContent("logo_github.png").sampleData, statusCode: 200, headers: nil).responseTime(-4)
}
provider = MoyaProvidesr<GitHubUserContent>()
}

it("tracks progress of request") {

let target: GitHubUserContent = .downloadMoyaWebContent("logo_github.png")

var progressValues: [Double] = []
var completedValues: [Bool] = []
var error: Moya.Error?

waitUntil(timeout: 5.0) { done in
let progressClosure: ProgressBlock = { progress in
progressValues.append(progress.progress)
completedValues.append(progress.completed)
}

let progressCompletionClosure: Completion = { (result) in
if case .failure(let err) = result {
error = err
}
done()
}

provider.request(target, queue: nil, progress: progressClosure, completion: progressCompletionClosure)
}

expect(error).to(beNil())
expect(progressValues) == [0.25, 0.5, 0.75, 1.0, 1.0]
expect(completedValues) == [false, false, false, false, true]
}
}
}
}
49 changes: 49 additions & 0 deletions Demo/Tests/TestHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,52 @@ enum HTTPBin: TargetType {
}
}
}

public enum GitHubUserContent {
case downloadMoyaWebContent(String)
}

extension GitHubUserContent: TargetType {
public var baseURL: URL { return URL(string: "https://raw.githubusercontent.com")! }
public var path: String {
switch self {
case .downloadMoyaWebContent(let contentPath):
return "/Moya/Moya/master/web/\(contentPath)"
}
}
public var method: Moya.Method {
switch self {
case .downloadMoyaWebContent:
return .get
}
}
public var parameters: [String: Any]? {
switch self {
case .downloadMoyaWebContent:
return nil
}
}
public var task: Task {
switch self {
case .downloadMoyaWebContent:
return .download(.request(DefaultDownloadDestination))
}
}
public var sampleData: Data {
switch self {
case .downloadMoyaWebContent:
return Data(count: 4000)
}
}

}

private let DefaultDownloadDestination: DownloadDestination = { temporaryURL, response in
let directoryURLs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

if !directoryURLs.isEmpty {
return (directoryURLs[0].appendingPathComponent(response.suggestedFilename!), [])
}

return (temporaryURL, [])
}
12 changes: 12 additions & 0 deletions Source/Moya+Internal.swift
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,18 @@ private extension MoyaProvider {
completion(result)
})

if let dataRequest = dataRequest as? T {
progressAlamoRequest = dataRequest
}
} else if var dataRequest = progressAlamoRequest as? DownloadRequest {
dataRequest = dataRequest.response(queue: queue, completionHandler: { handler in
let result = convertResponseToResult(handler.response, request: handler.request, data: nil, error: handler.error)
// Inform all plugins about the response
plugins.forEach { $0.didReceiveResponse(result, target: target) }
progressCompletion?(ProgressResponse(response: result.value))
completion(result)
})

if let dataRequest = dataRequest as? T {
progressAlamoRequest = dataRequest
}
Expand Down

0 comments on commit a57f6e6

Please sign in to comment.