Skip to content

Commit c44167d

Browse files
1. Inherit Error protocol for SendRequestError
2. Better tests for IterableActionRunner.
1 parent 73e53b1 commit c44167d

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

Tests/swift-sdk-swift-tests/IterableActionRunnerTests.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,22 @@ class IterableActionRunnerTests: XCTestCase {
2929
let action = IterableAction.action(fromDictionary: ["type" : "openUrl", "data" : urlString])!
3030
let context = IterableActionContext(action: action, source: .push)
3131
let urlOpener = MockUrlOpener()
32-
32+
let expectation = XCTestExpectation(description: "call UrlHandler")
33+
let urlHandler: UrlHandler = {url in
34+
XCTAssertEqual(url.absoluteString, urlString)
35+
expectation.fulfill()
36+
return false
37+
}
38+
3339
let handled = IterableActionRunner.execute(action: action,
3440
context: context,
35-
urlHandler: { url in return false},
41+
urlHandler: urlHandler,
3642
urlOpener: urlOpener)
3743

44+
45+
wait(for: [expectation], timeout: testExpectationTimeout)
3846
XCTAssertTrue(handled)
39-
47+
4048
if #available(iOS 10.0, *) {
4149
XCTAssertEqual(urlOpener.ios10OpenedUrl?.absoluteString, urlString)
4250
XCTAssertNil(urlOpener.preIos10openedUrl)
@@ -51,12 +59,20 @@ class IterableActionRunnerTests: XCTestCase {
5159
let action = IterableAction.action(fromDictionary: ["type" : "openUrl", "data" : urlString])!
5260
let context = IterableActionContext(action: action, source: .push)
5361
let urlOpener = MockUrlOpener()
62+
let expectation = XCTestExpectation(description: "call UrlHandler")
63+
let urlHandler: UrlHandler = {url in
64+
XCTAssertEqual(url.absoluteString, urlString)
65+
expectation.fulfill()
66+
return true
67+
}
5468

5569
let handled = IterableActionRunner.execute(action: action,
5670
context: context,
57-
urlHandler: { url in return true},
71+
urlHandler: urlHandler,
5872
urlOpener: urlOpener)
5973

74+
75+
wait(for: [expectation], timeout: testExpectationTimeout)
6076
XCTAssertTrue(handled)
6177

6278
if #available(iOS 10.0, *) {

swift-sdk/NetworkHelper.swift

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@ import Foundation
88

99
typealias SendRequestValue = [AnyHashable : Any]
1010

11-
struct SendRequestErrorType {
11+
struct SendRequestError : Error {
1212
let errorMessage: String?
1313
let data: Data?
1414
}
1515

16+
extension SendRequestError : LocalizedError {
17+
var localizedDescription: String {
18+
return errorMessage ?? ""
19+
}
20+
}
21+
1622
enum Result<Value, ErrorType> {
1723
case value(Value)
1824
case error(ErrorType)
@@ -54,15 +60,15 @@ extension URLSession : NetworkSessionProtocol {
5460
}
5561

5662
struct NetworkHelper {
57-
static func sendRequest(_ request: URLRequest, usingSession networkSession: NetworkSessionProtocol) -> Promise<SendRequestValue, SendRequestErrorType> {
58-
let result = Promise<SendRequestValue, SendRequestErrorType>()
63+
static func sendRequest(_ request: URLRequest, usingSession networkSession: NetworkSessionProtocol) -> Promise<SendRequestValue, SendRequestError> {
64+
let result = Promise<SendRequestValue, SendRequestError>()
5965

6066
networkSession.makeRequest(request) { (data, response, error) in
6167
if let error = error {
62-
return result.reject(with: SendRequestErrorType(errorMessage: "\(error.localizedDescription)", data: data))
68+
return result.reject(with: SendRequestError(errorMessage: "\(error.localizedDescription)", data: data))
6369
}
6470
guard let response = response as? HTTPURLResponse else {
65-
return result.reject(with: SendRequestErrorType(errorMessage: "No response", data: nil))
71+
return result.reject(with: SendRequestError(errorMessage: "No response", data: nil))
6672
}
6773

6874
let responseCode = response.statusCode
@@ -82,33 +88,33 @@ struct NetworkHelper {
8288
}
8389

8490
if responseCode == 401 {
85-
return result.reject(with: SendRequestErrorType(errorMessage: "Invalid API Key", data: data))
91+
return result.reject(with: SendRequestError(errorMessage: "Invalid API Key", data: data))
8692
} else if responseCode >= 400 {
8793
var errorMessage = "Invalid Request"
8894
if let jsonDict = json as? [AnyHashable : Any], let msgFromDict = jsonDict["msg"] as? String {
8995
errorMessage = msgFromDict
9096
} else if responseCode >= 500 {
9197
errorMessage = "Internal Server Error"
9298
}
93-
return result.reject(with: SendRequestErrorType(errorMessage: errorMessage, data: data))
99+
return result.reject(with: SendRequestError(errorMessage: errorMessage, data: data))
94100
} else if responseCode == 200 {
95101
if let data = data, data.count > 0 {
96102
if let jsonError = jsonError {
97103
var reason = "Could not parse json, error: \(jsonError.localizedDescription)"
98104
if let stringValue = String(data: data, encoding: .utf8) {
99105
reason = "Could not parse json: \(stringValue), error: \(jsonError.localizedDescription)"
100106
}
101-
return result.reject(with: SendRequestErrorType(errorMessage: reason, data: data))
107+
return result.reject(with: SendRequestError(errorMessage: reason, data: data))
102108
} else if let json = json as? [AnyHashable : Any] {
103109
return result.resolve(with: json)
104110
} else {
105-
return result.reject(with: SendRequestErrorType(errorMessage: "Response is not a dictionary", data: data))
111+
return result.reject(with: SendRequestError(errorMessage: "Response is not a dictionary", data: data))
106112
}
107113
} else {
108-
return result.reject(with: SendRequestErrorType(errorMessage: "No data received", data: data))
114+
return result.reject(with: SendRequestError(errorMessage: "No data received", data: data))
109115
}
110116
} else {
111-
return result.reject(with: SendRequestErrorType(errorMessage: "Received non-200 response: \(responseCode)", data: data))
117+
return result.reject(with: SendRequestError(errorMessage: "Received non-200 response: \(responseCode)", data: data))
112118
}
113119
}
114120

0 commit comments

Comments
 (0)