Skip to content

Commit 8c73e49

Browse files
author
Ruben Nine
committed
Adding context property to JSONResponse.
Updating `UploadOperation` so that, on success, finishes with a JSONResponse that includes the `Uploadable` used for uploading as context.
1 parent fe91519 commit 8c73e49

File tree

3 files changed

+51
-30
lines changed

3 files changed

+51
-30
lines changed

Sources/FilestackSDK/Internal/Operations/UploadOperation.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ private extension UploadOperation {
107107
self.executeCompleteOperation(using: partsAndEtags, descriptor: descriptor) { (result) in
108108
switch result {
109109
case let .success(response):
110-
self.finish(with: .success(response))
110+
let responseWithContext = JSONResponse(response: response, context: self.uploadable)
111+
self.finish(with: .success(responseWithContext))
111112
case let .failure(error):
112113
self.finish(with: .failure(error))
113114
}

Sources/FilestackSDK/Public/Models/JSONResponse.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ public class JSONResponse: NSObject {
2525
/// The JSON returned by the server.
2626
@objc public let json: [String: Any]?
2727

28+
/// Optionally, some associated context.
29+
@objc public let context: Any?
30+
2831
/// Returns the associated error value if the result if it is a failure, `nil` otherwise.
2932
@objc public var error: Swift.Error?
3033

@@ -41,6 +44,17 @@ public class JSONResponse: NSObject {
4144
}
4245

4346
self.error = error
47+
self.context = nil
48+
49+
super.init()
50+
}
51+
52+
init(response: JSONResponse, context: Any?) {
53+
self.request = response.request
54+
self.response = response.response
55+
self.json = response.json
56+
self.error = response.error
57+
self.context = context
4458

4559
super.init()
4660
}

Tests/FilestackSDKTests/UploadTests.swift

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class UploadTests: XCTestCase {
7474
XCTAssertEqual(response?.json?["status"] as? String, "Stored")
7575
XCTAssertEqual(response?.json?["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
7676
XCTAssertEqual(response?.json?["mimetype"] as? String, "image/jpeg")
77+
XCTAssertEqual(response?.context as? URL, largeFileURL)
7778
}
7879

7980
func testIntelligentMultiPartUpload() {
@@ -84,10 +85,10 @@ class UploadTests: XCTestCase {
8485
stubMultipartCompleteRequest()
8586

8687
let expectation = self.expectation(description: "request should succeed")
87-
var json: [String: Any]!
88+
var response: JSONResponse?
8889

8990
let uploader = client.upload(using: largeFileURL) { resp in
90-
json = resp.json
91+
response = resp
9192
expectation.fulfill()
9293
}
9394

@@ -98,12 +99,13 @@ class UploadTests: XCTestCase {
9899
XCTAssertEqual(uploader.progress.fileTotalCount, 1)
99100
XCTAssertEqual(uploader.progress.fileCompletedCount, 1)
100101

101-
XCTAssertEqual(json["handle"] as? String, "6GKA0wnQWO7tKaGu2YXA")
102-
XCTAssertEqual(json["size"] as? Int, largeFileSize)
103-
XCTAssertEqual(json["filename"] as? String, "large.jpg")
104-
XCTAssertEqual(json["status"] as? String, "Stored")
105-
XCTAssertEqual(json["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
106-
XCTAssertEqual(json["mimetype"] as? String, "image/jpeg")
102+
XCTAssertEqual(response?.json?["handle"] as? String, "6GKA0wnQWO7tKaGu2YXA")
103+
XCTAssertEqual(response?.json?["size"] as? Int, largeFileSize)
104+
XCTAssertEqual(response?.json?["filename"] as? String, "large.jpg")
105+
XCTAssertEqual(response?.json?["status"] as? String, "Stored")
106+
XCTAssertEqual(response?.json?["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
107+
XCTAssertEqual(response?.json?["mimetype"] as? String, "image/jpeg")
108+
XCTAssertEqual(response?.context as? URL, largeFileURL)
107109
}
108110

109111
func testCancellingResumableMultiPartUpload() {
@@ -114,11 +116,10 @@ class UploadTests: XCTestCase {
114116
stubMultipartCompleteRequest(requestTime: 5.0, responseTime: 5.0)
115117

116118
let expectation = self.expectation(description: "request should succeed")
117-
118-
var error: Swift.Error!
119+
var response: JSONResponse?
119120

120121
let uploader = client.upload(using: sampleFileURL) { resp in
121-
error = resp.error
122+
response = resp
122123
expectation.fulfill()
123124
}
124125

@@ -134,7 +135,8 @@ class UploadTests: XCTestCase {
134135
XCTAssertEqual(uploader.progress.fileCompletedCount, 1)
135136
XCTAssertTrue(uploader.progress.isCancelled)
136137

137-
XCTAssertNotNil(error)
138+
XCTAssertNotNil(response?.error)
139+
XCTAssertNil(response?.context)
138140
}
139141

140142
func testCancellingStartedUploadWithoutUploadablesShouldCallCompletionHandler() {
@@ -212,22 +214,21 @@ class UploadTests: XCTestCase {
212214
XCTAssertEqual(hitCount, 1)
213215
XCTAssertNotNil(response?.json)
214216

215-
let json: [String: Any]! = response?.json
216-
217217
XCTAssertEqual(uploader.progress.totalUnitCount, Int64(largeFileSize))
218218
XCTAssertEqual(uploader.progress.completedUnitCount, Int64(largeFileSize))
219219
XCTAssertEqual(uploader.progress.fileTotalCount, 1)
220220
XCTAssertEqual(uploader.progress.fileCompletedCount, 1)
221221

222-
XCTAssertEqual(json["handle"] as? String, "6GKA0wnQWO7tKaGu2YXA")
223-
XCTAssertEqual(json["size"] as? Int, largeFileSize)
224-
XCTAssertEqual(json["filename"] as? String, "large.jpg")
225-
XCTAssertEqual(json["status"] as? String, "Stored")
226-
XCTAssertEqual(json["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
227-
XCTAssertEqual(json["mimetype"] as? String, "image/jpeg")
228-
XCTAssertEqual(json["upload_tags"] as? [String: String], uploadTags)
222+
XCTAssertEqual(response?.json?["handle"] as? String, "6GKA0wnQWO7tKaGu2YXA")
223+
XCTAssertEqual(response?.json?["size"] as? Int, largeFileSize)
224+
XCTAssertEqual(response?.json?["filename"] as? String, "large.jpg")
225+
XCTAssertEqual(response?.json?["status"] as? String, "Stored")
226+
XCTAssertEqual(response?.json?["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
227+
XCTAssertEqual(response?.json?["mimetype"] as? String, "image/jpeg")
228+
XCTAssertEqual(response?.json?["upload_tags"] as? [String: String], uploadTags)
229+
XCTAssertEqual(response?.context as? URL, largeFileURL)
229230

230-
let returnedWorkflows: [String: Any]! = json["workflows"] as? [String: Any]
231+
let returnedWorkflows: [String: Any]! = response?.json?["workflows"] as? [String: Any]
231232

232233
XCTAssertNotNil(returnedWorkflows["workflow-1"])
233234
XCTAssertNotNil(returnedWorkflows["workflow-2"])
@@ -270,9 +271,10 @@ class UploadTests: XCTestCase {
270271
XCTAssertEqual(json["status"] as? String, "Stored")
271272
XCTAssertEqual(json["url"] as? String, "https://cdn.filestackcontent.com/6GKA0wnQWO7tKaGu2YXA")
272273
XCTAssertEqual(json["mimetype"] as? String, "image/jpeg")
274+
XCTAssertEqual(responses.first!.context as? URL, sampleFileURL)
273275
}
274276

275-
func testMultiFileUploadWithFewFile() {
277+
func testMultiFileUploadWithFewFiles() {
276278
var hitCount = 0
277279
stubRegularMultipartRequest(hitCount: &hitCount)
278280

@@ -285,19 +287,21 @@ class UploadTests: XCTestCase {
285287
deleteTemporaryFilesAfterUpload: false,
286288
storeOptions: defaultStoreOptions)
287289

288-
let uploader = client.upload(using: [sampleFileURL, sampleFileURL], options: uploadOptions) { resp in
290+
let uploader = client.upload(using: [sampleFileURL, largeFileURL], options: uploadOptions) { resp in
289291
responses = resp
290292
expectation.fulfill()
291293
}
292294

293295
waitForExpectations(timeout: 15, handler: nil)
294296

295-
XCTAssertEqual(uploader.progress.totalUnitCount, Int64(sampleFileSize * 2))
296-
XCTAssertEqual(uploader.progress.completedUnitCount, Int64(sampleFileSize * 2))
297+
XCTAssertEqual(uploader.progress.totalUnitCount, Int64(sampleFileSize + largeFileSize))
298+
XCTAssertEqual(uploader.progress.completedUnitCount, Int64(sampleFileSize + largeFileSize))
297299
XCTAssertEqual(uploader.progress.fileTotalCount, 2)
298300
XCTAssertEqual(uploader.progress.fileCompletedCount, 2)
299301

300302
XCTAssertEqual(responses.count, 2)
303+
XCTAssertEqual(responses[0].context as? URL, sampleFileURL)
304+
XCTAssertEqual(responses[1].context as? URL, largeFileURL)
301305
}
302306

303307
func testMultiFileUploadWithoutAutostart() {
@@ -318,17 +322,19 @@ class UploadTests: XCTestCase {
318322
expectation.fulfill()
319323
}
320324

321-
uploader.add(uploadables: [sampleFileURL, sampleFileURL])
325+
uploader.add(uploadables: [sampleFileURL, largeFileURL])
322326
uploader.start()
323327

324328
waitForExpectations(timeout: 15, handler: nil)
325329

326-
XCTAssertEqual(uploader.progress.totalUnitCount, Int64(sampleFileSize * 2))
327-
XCTAssertEqual(uploader.progress.completedUnitCount, Int64(sampleFileSize * 2))
330+
XCTAssertEqual(uploader.progress.totalUnitCount, Int64(sampleFileSize + largeFileSize))
331+
XCTAssertEqual(uploader.progress.completedUnitCount, Int64(sampleFileSize + largeFileSize))
328332
XCTAssertEqual(uploader.progress.fileTotalCount, 2)
329333
XCTAssertEqual(uploader.progress.fileCompletedCount, 2)
330334

331335
XCTAssertEqual(responses.count, 2)
336+
XCTAssertEqual(responses[0].context as? URL, sampleFileURL)
337+
XCTAssertEqual(responses[1].context as? URL, largeFileURL)
332338
}
333339
}
334340

0 commit comments

Comments
 (0)