Skip to content

Commit 7113d20

Browse files
authored
Merge pull request #225 from woocommerce/issue/224-wiring-entity-listener
Order Details: Wiring EntityListener
2 parents f3a91c1 + 9b47d08 commit 7113d20

File tree

11 files changed

+194
-56
lines changed

11 files changed

+194
-56
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
B518662420A099BF00037A38 /* AlamofireNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = B518662320A099BF00037A38 /* AlamofireNetwork.swift */; };
5757
B518662A20A09C6F00037A38 /* OrdersRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B518662920A09C6F00037A38 /* OrdersRemoteTests.swift */; };
5858
B518663520A0A2E800037A38 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = B518663320A0A2E800037A38 /* Constants.swift */; };
59+
B556FD69211CE2EC00B5DAE7 /* HTTPStatusCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B556FD68211CE2EC00B5DAE7 /* HTTPStatusCode.swift */; };
5960
B557D9ED209753AA005962F4 /* Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B557D9E3209753AA005962F4 /* Networking.framework */; };
6061
B557D9F4209753AA005962F4 /* Networking.h in Headers */ = {isa = PBXBuildFile; fileRef = B557D9E6209753AA005962F4 /* Networking.h */; settings = {ATTRIBUTES = (Public, ); }; };
6162
B557DA0220975500005962F4 /* JetpackRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B557D9FF209754FF005962F4 /* JetpackRequest.swift */; };
@@ -154,6 +155,7 @@
154155
B518662920A09C6F00037A38 /* OrdersRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrdersRemoteTests.swift; sourceTree = "<group>"; };
155156
B518663320A0A2E800037A38 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
156157
B518663420A0A2E800037A38 /* Loader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Loader.swift; sourceTree = "<group>"; };
158+
B556FD68211CE2EC00B5DAE7 /* HTTPStatusCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPStatusCode.swift; sourceTree = "<group>"; };
157159
B557D9E3209753AA005962F4 /* Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
158160
B557D9E6209753AA005962F4 /* Networking.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Networking.h; sourceTree = "<group>"; };
159161
B557D9E7209753AA005962F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -260,6 +262,7 @@
260262
B518662120A097C200037A38 /* Network.swift */,
261263
B518662320A099BF00037A38 /* AlamofireNetwork.swift */,
262264
B518662620A09BCC00037A38 /* MockupNetwork.swift */,
265+
B556FD68211CE2EC00B5DAE7 /* HTTPStatusCode.swift */,
263266
);
264267
path = Network;
265268
sourceTree = "<group>";
@@ -686,6 +689,7 @@
686689
B557DA0220975500005962F4 /* JetpackRequest.swift in Sources */,
687690
B56C1EB820EA76F500D749F9 /* Site.swift in Sources */,
688691
B505F6CD20BEE37E00BB1B69 /* AccountMapper.swift in Sources */,
692+
B556FD69211CE2EC00B5DAE7 /* HTTPStatusCode.swift in Sources */,
689693
B557DA0D20975DB1005962F4 /* WordPressAPIVersion.swift in Sources */,
690694
74A1D26F21189EA100931DFA /* SiteVisitStatsRemote.swift in Sources */,
691695
B557DA1D20979E7D005962F4 /* Order.swift in Sources */,

Networking/Networking/Network/AlamofireNetwork.swift

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public class AlamofireNetwork: Network {
3232
Alamofire.request(authenticated)
3333
.validate()
3434
.responseJSON { response in
35-
completion(response.result.value, response.result.error)
36-
}
35+
completion(response.value, response.customizedError)
36+
}
3737
}
3838

3939
/// Executes the specified Network Request. Upon completion, the payload will be sent back to the caller as a Data instance.
@@ -51,7 +51,30 @@ public class AlamofireNetwork: Network {
5151
Alamofire.request(authenticated)
5252
.validate()
5353
.responseData { response in
54-
completion(response.result.value, response.result.error)
54+
completion(response.value, response.customizedError)
55+
}
56+
}
57+
}
58+
59+
60+
/// MARK: - Alamofire.DataResponse: Private Methods
61+
///
62+
private extension Alamofire.DataResponse {
63+
64+
/// Returns `NetworkError.notFound` whenever the Request failed with a 404 StatusCode. This may be used by upper layers,
65+
/// to determine if an object should be deleted (for instance!).
66+
///
67+
/// In any other case, this property will actually return the regular `DataResponse.error` result.
68+
///
69+
var customizedError: Error? {
70+
guard result.isFailure else {
71+
return nil
5572
}
73+
74+
guard response?.statusCode == HTTPStatusCode.notFound else {
75+
return error
76+
}
77+
78+
return NetworkError.notFound
5679
}
5780
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Foundation
2+
3+
4+
/// Represents (a seriously small subset of) the valid HTTP Status Code(s)
5+
///
6+
public enum HTTPStatusCode {
7+
8+
/// All Good!
9+
///
10+
static let success = 200
11+
12+
/// Resource Not Found
13+
///
14+
static let notFound = 404
15+
}

Networking/Networking/Network/MockupNetwork.swift

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ class MockupNetwork: Network {
1010
///
1111
private var responseMap = [String: String]()
1212

13+
/// Mapping between URL Suffix and Error responses.
14+
///
15+
private var errorMap = [String: Error]()
16+
1317
/// Keeps a collection of all of the `responseJSON` requests.
1418
///
1519
var requestsForResponseJSON = [URLRequestConvertible]()
@@ -20,6 +24,7 @@ class MockupNetwork: Network {
2024

2125

2226

27+
2328
/// Public Initializer
2429
///
2530
required init(credentials: Credentials) { }
@@ -38,12 +43,17 @@ class MockupNetwork: Network {
3843
func responseJSON(for request: URLRequestConvertible, completion: @escaping (Any?, Error?) -> Void) {
3944
requestsForResponseJSON.append(request)
4045

41-
guard let filename = filename(for: request), let response = Loader.jsonObject(for: filename) else {
42-
completion(nil, NetworkError.emptyResponse)
46+
if let error = error(for: request) {
47+
completion(nil, error)
48+
return
49+
}
50+
51+
if let filename = filename(for: request), let response = Loader.jsonObject(for: filename) {
52+
completion(response, nil)
4353
return
4454
}
4555

46-
completion(response, nil)
56+
completion(nil, NetworkError.unknown)
4757
}
4858

4959
/// Whenever the Request's URL matches any of the "Mocked Up Patterns", we'll return the specified response file, loaded as *Data*.
@@ -52,12 +62,17 @@ class MockupNetwork: Network {
5262
func responseData(for request: URLRequestConvertible, completion: @escaping (Data?, Error?) -> Void) {
5363
requestsForResponseData.append(request)
5464

55-
guard let filename = filename(for: request), let data = Loader.contentsOf(filename) else {
56-
completion(nil, NetworkError.emptyResponse)
65+
if let error = error(for: request) {
66+
completion(nil, error)
5767
return
5868
}
5969

60-
completion(data, nil)
70+
if let filename = filename(for: request), let data = Loader.contentsOf(filename) {
71+
completion(data, nil)
72+
return
73+
}
74+
75+
completion(nil, NetworkError.unknown)
6176
}
6277
}
6378

@@ -73,10 +88,17 @@ extension MockupNetwork {
7388
responseMap[requestUrlSuffix] = filename
7489
}
7590

91+
/// We'll return the specified Error, whenever a request matches the specified Suffix Criteria!.
92+
///
93+
func simulateError(requestUrlSuffix: String, error: Error) {
94+
errorMap[requestUrlSuffix] = error
95+
}
96+
7697
/// Removes all of the stored Simulated Responses.
7798
///
7899
func removeAllSimulatedResponses() {
79100
responseMap.removeAll()
101+
errorMap.removeAll()
80102
}
81103

82104
/// Returns the Mockup JSON Filename for a given URLRequestConvertible.
@@ -90,6 +112,17 @@ extension MockupNetwork {
90112
return nil
91113
}
92114

115+
/// Returns the Mockup Error for a given URLRequestConvertible.
116+
///
117+
private func error(for request: URLRequestConvertible) -> Error? {
118+
let searchPath = path(for: request)
119+
for (pattern, error) in errorMap where searchPath.hasSuffix(pattern) {
120+
return error
121+
}
122+
123+
return nil
124+
}
125+
93126
/// Returns the "Request Path" for a given URLRequestConvertible instance.
94127
///
95128
private func path(for request: URLRequestConvertible) -> String {

Networking/Networking/Network/Network.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ public protocol Network {
3434

3535
/// Networking Errors
3636
///
37-
enum NetworkError: Error {
37+
public enum NetworkError: Error {
3838

39-
/// Indicates that there's not been an actual response!
39+
/// Something went wrong. But we have no idea what it was!
4040
///
41-
case emptyResponse
41+
case unknown
42+
43+
/// Resource Not Found (statusCode = 404)
44+
///
45+
case notFound
4246
}

Networking/Networking/Remote/Remote.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class Remote {
3131
func enqueue(_ request: URLRequestConvertible, completion: @escaping (Any?, Error?) -> Void) {
3232
network.responseJSON(for: request) { (payload, error) in
3333
guard let payload = payload else {
34-
completion(nil, error ?? NetworkError.emptyResponse)
34+
completion(nil, error)
3535
return
3636
}
3737

@@ -53,7 +53,7 @@ public class Remote {
5353
func enqueue<M: Mapper>(_ request: URLRequestConvertible, mapper: M, completion: @escaping (M.Output?, Error?) -> Void) {
5454
network.responseData(for: request) { (data, error) in
5555
guard let data = data else {
56-
completion(nil, error ?? NetworkError.emptyResponse)
56+
completion(nil, error)
5757
return
5858
}
5959

Networking/NetworkingTests/Remote/RemoteTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class RemoteTests: XCTestCase {
2121

2222
remote.enqueue(request) { (payload, error) in
2323
XCTAssertNil(payload)
24-
XCTAssertEqual(error as! NetworkError, NetworkError.emptyResponse)
24+
XCTAssertEqual(error as! NetworkError, NetworkError.unknown)
2525

2626
XCTAssert(network.requestsForResponseData.isEmpty)
2727
XCTAssert(network.requestsForResponseJSON.count == 1)
@@ -46,7 +46,7 @@ class RemoteTests: XCTestCase {
4646

4747
remote.enqueue(request, mapper: mapper) { (payload, error) in
4848
XCTAssertNil(payload)
49-
XCTAssertEqual(error as! NetworkError, NetworkError.emptyResponse)
49+
XCTAssertEqual(error as! NetworkError, NetworkError.unknown)
5050

5151
XCTAssert(network.requestsForResponseJSON.isEmpty)
5252
XCTAssert(network.requestsForResponseData.count == 1)

0 commit comments

Comments
 (0)