Skip to content

Commit 1aeee92

Browse files
committed
Added OrderNote model+Mapper+tests
1 parent 01c5db0 commit 1aeee92

File tree

17 files changed

+798
-338
lines changed

17 files changed

+798
-338
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
21DB5B99C4107CF69C0A57EC /* Pods_NetworkingTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69314EDE650855CAF927057E /* Pods_NetworkingTests.framework */; };
1111
6647C0161DAC6AB6570C53A7 /* Pods_Networking.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */; };
1212
741B950120EBC8A700DD6E2D /* OrderCouponLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */; };
13+
74C8F06420EEB44800B6EDC9 /* OrderNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06320EEB44800B6EDC9 /* OrderNote.swift */; };
14+
74C8F06620EEB76400B6EDC9 /* order-notes.json in Resources */ = {isa = PBXBuildFile; fileRef = 74C8F06520EEB76400B6EDC9 /* order-notes.json */; };
15+
74C8F06820EEB7BD00B6EDC9 /* OrderNoteMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06720EEB7BC00B6EDC9 /* OrderNoteMapper.swift */; };
16+
74C8F06A20EEBC8C00B6EDC9 /* OrderMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */; };
17+
74C8F06C20EEBD5D00B6EDC9 /* broken-order.json in Resources */ = {isa = PBXBuildFile; fileRef = 74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */; };
1318
B505F6CD20BEE37E00BB1B69 /* AccountMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */; };
1419
B505F6CF20BEE38B00BB1B69 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CE20BEE38B00BB1B69 /* Account.swift */; };
1520
B505F6D120BEE39600BB1B69 /* AccountRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6D020BEE39600BB1B69 /* AccountRemote.swift */; };
@@ -49,7 +54,7 @@
4954
B5C6FCCF20A3592900A4F8E4 /* OrderItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C6FCCE20A3592900A4F8E4 /* OrderItem.swift */; };
5055
B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C6FCD320A373BA00A4F8E4 /* OrderMapper.swift */; };
5156
B5C6FCD620A3768900A4F8E4 /* order.json in Resources */ = {isa = PBXBuildFile; fileRef = B5C6FCD520A3768900A4F8E4 /* order.json */; };
52-
CE20179320E3EFA7005B4C18 /* broken-order.json in Resources */ = {isa = PBXBuildFile; fileRef = CE20179220E3EFA7005B4C18 /* broken-order.json */; };
57+
CE20179320E3EFA7005B4C18 /* broken-orders.json in Resources */ = {isa = PBXBuildFile; fileRef = CE20179220E3EFA7005B4C18 /* broken-orders.json */; };
5358
/* End PBXBuildFile section */
5459

5560
/* Begin PBXContainerItemProxy section */
@@ -65,6 +70,11 @@
6570
/* Begin PBXFileReference section */
6671
69314EDE650855CAF927057E /* Pods_NetworkingTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NetworkingTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6772
741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCouponLine.swift; sourceTree = "<group>"; };
73+
74C8F06320EEB44800B6EDC9 /* OrderNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderNote.swift; sourceTree = "<group>"; };
74+
74C8F06520EEB76400B6EDC9 /* order-notes.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "order-notes.json"; sourceTree = "<group>"; };
75+
74C8F06720EEB7BC00B6EDC9 /* OrderNoteMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderNoteMapper.swift; sourceTree = "<group>"; };
76+
74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderMapperTests.swift; sourceTree = "<group>"; };
77+
74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "broken-order.json"; sourceTree = "<group>"; };
6878
753D6504FF01F09F6A33B73E /* Pods-Networking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Networking.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-Networking/Pods-Networking.debug.xcconfig"; sourceTree = "<group>"; };
6979
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountMapper.swift; sourceTree = "<group>"; };
7080
B505F6CE20BEE38B00BB1B69 /* Account.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = "<group>"; };
@@ -110,7 +120,7 @@
110120
B5C6FCD520A3768900A4F8E4 /* order.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = order.json; sourceTree = "<group>"; };
111121
BD9439D9B8F2C1ED2EADAA51 /* Pods-NetworkingTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.debug.xcconfig"; sourceTree = "<group>"; };
112122
C8F9A8CC6F90A8C9B5EF2EE2 /* Pods-Networking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Networking.release.xcconfig"; path = "../Pods/Target Support Files/Pods-Networking/Pods-Networking.release.xcconfig"; sourceTree = "<group>"; };
113-
CE20179220E3EFA7005B4C18 /* broken-order.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "broken-order.json"; sourceTree = "<group>"; };
123+
CE20179220E3EFA7005B4C18 /* broken-orders.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "broken-orders.json"; sourceTree = "<group>"; };
114124
F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
115125
F6CEE1CA2AD376C0C28AE9F6 /* Pods-NetworkingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.release.xcconfig"; sourceTree = "<group>"; };
116126
/* End PBXFileReference section */
@@ -279,10 +289,11 @@
279289
children = (
280290
B505F6CE20BEE38B00BB1B69 /* Account.swift */,
281291
B5BB1D0F20A237FB00112D92 /* Address.swift */,
282-
741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */,
283292
B557DA1C20979E7D005962F4 /* Order.swift */,
284-
B5BB1D1120A255EC00112D92 /* OrderStatus.swift */,
293+
741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */,
285294
B5C6FCCE20A3592900A4F8E4 /* OrderItem.swift */,
295+
74C8F06320EEB44800B6EDC9 /* OrderNote.swift */,
296+
B5BB1D1120A255EC00112D92 /* OrderStatus.swift */,
286297
);
287298
path = Model;
288299
sourceTree = "<group>";
@@ -293,7 +304,9 @@
293304
B505F6D420BEE4E600BB1B69 /* me.json */,
294305
B559EBA920A0B5CD00836CD4 /* orders-load-all.json */,
295306
B5C6FCD520A3768900A4F8E4 /* order.json */,
296-
CE20179220E3EFA7005B4C18 /* broken-order.json */,
307+
CE20179220E3EFA7005B4C18 /* broken-orders.json */,
308+
74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */,
309+
74C8F06520EEB76400B6EDC9 /* order-notes.json */,
297310
);
298311
path = Responses;
299312
sourceTree = "<group>";
@@ -305,6 +318,7 @@
305318
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */,
306319
B5C6FCD320A373BA00A4F8E4 /* OrderMapper.swift */,
307320
B567AF2A20A0FA4200AB6C62 /* OrderListMapper.swift */,
321+
74C8F06720EEB7BC00B6EDC9 /* OrderNoteMapper.swift */,
308322
);
309323
path = Mapper;
310324
sourceTree = "<group>";
@@ -330,6 +344,7 @@
330344
children = (
331345
B505F6D220BEE3A500BB1B69 /* AccountMapperTests.swift */,
332346
B5C6FCCC20A34B8300A4F8E4 /* OrderListMapperTests.swift */,
347+
74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */,
333348
);
334349
path = Mapper;
335350
sourceTree = "<group>";
@@ -447,10 +462,12 @@
447462
isa = PBXResourcesBuildPhase;
448463
buildActionMask = 2147483647;
449464
files = (
465+
74C8F06620EEB76400B6EDC9 /* order-notes.json in Resources */,
466+
74C8F06C20EEBD5D00B6EDC9 /* broken-order.json in Resources */,
450467
B505F6D520BEE4E700BB1B69 /* me.json in Resources */,
451468
B5C6FCD620A3768900A4F8E4 /* order.json in Resources */,
452469
B559EBAA20A0B5CD00836CD4 /* orders-load-all.json in Resources */,
453-
CE20179320E3EFA7005B4C18 /* broken-order.json in Resources */,
470+
CE20179320E3EFA7005B4C18 /* broken-orders.json in Resources */,
454471
);
455472
runOnlyForDeploymentPostprocessing = 0;
456473
};
@@ -522,6 +539,7 @@
522539
files = (
523540
B557DA1A20979D66005962F4 /* Settings.swift in Sources */,
524541
741B950120EBC8A700DD6E2D /* OrderCouponLine.swift in Sources */,
542+
74C8F06420EEB44800B6EDC9 /* OrderNote.swift in Sources */,
525543
B5BB1D0C20A2050300112D92 /* DateFormatter+Woo.swift in Sources */,
526544
B567AF2520A0CCA300AB6C62 /* AuthenticatedRequest.swift in Sources */,
527545
B505F6EA20BEFC3700BB1B69 /* MockupNetwork.swift in Sources */,
@@ -537,6 +555,7 @@
537555
B5C6FCCF20A3592900A4F8E4 /* OrderItem.swift in Sources */,
538556
B505F6EC20BEFDC200BB1B69 /* Loader.swift in Sources */,
539557
B5BB1D1220A255EC00112D92 /* OrderStatus.swift in Sources */,
558+
74C8F06820EEB7BD00B6EDC9 /* OrderNoteMapper.swift in Sources */,
540559
B5BB1D1020A237FB00112D92 /* Address.swift in Sources */,
541560
B557DA0420975500005962F4 /* OrdersRemote.swift in Sources */,
542561
B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */,
@@ -554,6 +573,7 @@
554573
files = (
555574
B505F6D320BEE3A500BB1B69 /* AccountMapperTests.swift in Sources */,
556575
B5C6FCC820A32E4800A4F8E4 /* DateFormatterWooTests.swift in Sources */,
576+
74C8F06A20EEBC8C00B6EDC9 /* OrderMapperTests.swift in Sources */,
557577
B567AF3120A0FB8F00AB6C62 /* JetpackRequestTests.swift in Sources */,
558578
B505F6D720BEE58800BB1B69 /* AccountRemoteTests.swift in Sources */,
559579
B518662A20A09C6F00037A38 /* OrdersRemoteTests.swift in Sources */,
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Foundation
2+
3+
4+
/// Mapper: OrderNote
5+
///
6+
class OrderNoteMapper: Mapper {
7+
8+
/// (Attempts) to convert a dictionary into [OrderNote].
9+
///
10+
func map(response: Data) throws -> [OrderNote] {
11+
let decoder = JSONDecoder()
12+
decoder.dateDecodingStrategy = .formatted(DateFormatter.Defaults.dateTimeFormatter)
13+
14+
return try decoder.decode(OrderNoteEnvelope.self, from: response).orderNotes
15+
}
16+
}
17+
18+
19+
/// OrderNote Disposable Entity:
20+
/// `Load Order Notes` endpoint returns all of its notes within the `data` key. This entity
21+
/// allows us to do parse all the things with JSONDecoder.
22+
///
23+
private struct OrderNoteEnvelope: Decodable {
24+
let orderNotes: [OrderNote]
25+
26+
private enum CodingKeys: String, CodingKey {
27+
case orderNotes = "data"
28+
}
29+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import Foundation
2+
3+
4+
/// Represents an Order's Note Entity.
5+
///
6+
public struct OrderNote: Decodable {
7+
public let noteId: Int
8+
public let dateCreated: Date
9+
public let contents: String
10+
public let isCustomerNote: Bool
11+
}
12+
13+
14+
/// Defines all of the OrderNote's CodingKeys.
15+
///
16+
private extension OrderNote {
17+
18+
enum CodingKeys: String, CodingKey {
19+
case noteId = "id"
20+
case dateCreated = "date_created_gmt"
21+
case contents = "note"
22+
case isCustomerNote = "customer_note"
23+
}
24+
}
25+
26+
27+
// MARK: - Comparable Conformance
28+
//
29+
extension OrderNote: Comparable {
30+
public static func == (lhs: OrderNote, rhs: OrderNote) -> Bool {
31+
return lhs.noteId == rhs.noteId &&
32+
lhs.dateCreated == rhs.dateCreated &&
33+
lhs.contents == rhs.contents &&
34+
lhs.isCustomerNote == rhs.isCustomerNote
35+
}
36+
37+
public static func < (lhs: OrderNote, rhs: OrderNote) -> Bool {
38+
return lhs.noteId < rhs.noteId ||
39+
(lhs.noteId == rhs.noteId && lhs.dateCreated < rhs.dateCreated) ||
40+
(lhs.noteId == rhs.noteId && lhs.dateCreated == rhs.dateCreated && lhs.contents < rhs.contents)
41+
}
42+
}

Networking/Networking/Remote/OrdersRemote.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public class OrdersRemote: Remote {
2525
/// Retrieves a specific `Order`
2626
///
2727
/// - Parameters:
28-
/// - siteID: Site for which we'll fetch remote orders.
29-
/// - orderID: Order for which we'll fetch remote orders.
28+
/// - siteID: Site which hosts the Order.
29+
/// - orderID: Identifier of the Order.
3030
/// - completion: Closure to be executed upon completion.
3131
///
3232
public func loadOrder(for siteID: Int, orderID: Int, completion: @escaping (Order?, Error?) -> Void) {
@@ -37,6 +37,21 @@ public class OrdersRemote: Remote {
3737
enqueue(request, mapper: mapper, completion: completion)
3838
}
3939

40+
/// Retrieves the notes for a specific `Order`
41+
///
42+
/// - Parameters:
43+
/// - siteID: Site which hosts the Order.
44+
/// - orderID: Identifier of the Order.
45+
/// - completion: Closure to be executed upon completion.
46+
///
47+
public func loadOrderNotes(for siteID: Int, orderID: Int, completion: @escaping ([OrderNote]?, Error?) -> Void) {
48+
let path = "\(Constants.ordersPath)/\(orderID)/\(Constants.notesPath)/"
49+
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path, parameters: nil)
50+
let mapper = OrderNoteMapper()
51+
52+
enqueue(request, mapper: mapper, completion: completion)
53+
}
54+
4055
/// Updates the `OrderStatus` of a given Order.
4156
///
4257
/// - Parameters:
@@ -60,8 +75,9 @@ public class OrdersRemote: Remote {
6075
//
6176
private extension OrdersRemote {
6277
enum Constants {
63-
static let defaultPageSize: Int = 75
64-
static let ordersPath: String = "orders"
78+
static let defaultPageSize: Int = 75
79+
static let ordersPath: String = "orders"
80+
static let notesPath: String = "notes"
6581
}
6682

6783
enum ParameterKeys {

Networking/NetworkingTests/Mapper/OrderListMapperTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class OrderListMapperTests: XCTestCase {
8686
let brokenOrder = orders[0]
8787
let format = DateFormatter()
8888
format.dateStyle = .short
89-
89+
9090
let orderCreatedString = format.string(from: brokenOrder.dateCreated)
9191
let todayCreatedString = format.string(from: Date())
9292
XCTAssertEqual(orderCreatedString, todayCreatedString)
@@ -120,6 +120,6 @@ private extension OrderListMapperTests {
120120
/// Returns the OrderlistMapper output upon receiving `broken-order`
121121
///
122122
func mapLoadBrokenOrderResponse() -> [Order] {
123-
return mapOrders(from: "broken-order")
123+
return mapOrders(from: "broken-orders")
124124
}
125125
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import XCTest
2+
@testable import Networking
3+
4+
5+
/// OrderMapper Unit Tests
6+
///
7+
class OrderMapperTests: XCTestCase {
8+
9+
/// Verifies that all of the Order Fields are parsed correctly.
10+
///
11+
func testOrderFieldsAreProperlyParsed() {
12+
guard let order = mapLoadOrderResponse() else {
13+
XCTFail()
14+
return
15+
}
16+
17+
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2018-01-24T16:21:48")
18+
let dateModified = DateFormatter.Defaults.dateTimeFormatter.date(from: "2018-05-09T18:15:30")
19+
let datePaid = DateFormatter.Defaults.dateTimeFormatter.date(from: "2018-05-03T19:24:55")
20+
21+
XCTAssertEqual(order.orderID, 1467)
22+
XCTAssertEqual(order.parentID, 0)
23+
XCTAssertEqual(order.customerID, 100)
24+
XCTAssertEqual(order.number, "1467")
25+
XCTAssert(order.status == .processing)
26+
XCTAssertEqual(order.currency, "USD")
27+
XCTAssertEqual(order.customerNote, "")
28+
XCTAssertEqual(order.dateCreated, dateCreated)
29+
XCTAssertEqual(order.dateModified, dateModified)
30+
XCTAssertEqual(order.datePaid, datePaid)
31+
XCTAssertEqual(order.discountTotal, "0.00")
32+
XCTAssertEqual(order.discountTax, "0.00")
33+
XCTAssertEqual(order.shippingTotal, "0.00")
34+
XCTAssertEqual(order.shippingTax, "0.00")
35+
XCTAssertEqual(order.total, "102.00")
36+
XCTAssertEqual(order.totalTax, "2.00")
37+
}
38+
39+
/// Verifies that all of the Order Address fields are parsed correctly.
40+
///
41+
func testOrderAddressesAreCorrectlyParsed() {
42+
guard let order = mapLoadOrderResponse() else {
43+
XCTFail()
44+
return
45+
}
46+
47+
let dummyAddresses = [order.billingAddress, order.shippingAddress]
48+
49+
for address in dummyAddresses {
50+
XCTAssertEqual(address.firstName, "Maria")
51+
XCTAssertEqual(address.lastName, "Scrambled")
52+
XCTAssertEqual(address.company, "Logged Out")
53+
XCTAssertEqual(address.address1, "9999 Scrambled")
54+
XCTAssertEqual(address.address2, "")
55+
XCTAssertEqual(address.city, "Omaha")
56+
XCTAssertEqual(address.state, "NE")
57+
XCTAssertEqual(address.postcode, "68124")
58+
XCTAssertEqual(address.country, "US")
59+
}
60+
}
61+
62+
/// Verifies that all of the Order Items are parsed correctly.
63+
///
64+
func testOrderItemsAreCorrectlyParsed() {
65+
guard let order = mapLoadOrderResponse() else {
66+
XCTFail()
67+
return
68+
}
69+
70+
let firstItem = order.items[0]
71+
XCTAssertEqual(firstItem.itemID, 3)
72+
XCTAssertEqual(firstItem.name, "ARC Reactor")
73+
XCTAssertEqual(firstItem.productID, 1450)
74+
XCTAssertEqual(firstItem.quantity, 1)
75+
XCTAssertEqual(firstItem.sku, "100")
76+
XCTAssertEqual(firstItem.subtotal, "100.00")
77+
XCTAssertEqual(firstItem.subtotalTax, "2.00")
78+
XCTAssertEqual(firstItem.taxClass, "")
79+
XCTAssertEqual(firstItem.total, "100.00")
80+
XCTAssertEqual(firstItem.totalTax, "2.00")
81+
XCTAssertEqual(firstItem.variationID, 0)
82+
}
83+
84+
/// Verifies that an Order in a broken state does [gets default values] | [gets skipped while parsing]
85+
///
86+
func testOrderHasDefaultDateCreatedWhenNullDateReceived() {
87+
guard let brokenOrder = mapLoadBrokenOrderResponse() else {
88+
XCTFail()
89+
return
90+
}
91+
92+
let format = DateFormatter()
93+
format.dateStyle = .short
94+
95+
let orderCreatedString = format.string(from: brokenOrder.dateCreated)
96+
let todayCreatedString = format.string(from: Date())
97+
XCTAssertEqual(orderCreatedString, todayCreatedString)
98+
99+
let orderModifiedString = format.string(from: brokenOrder.dateModified)
100+
XCTAssertEqual(orderModifiedString, todayCreatedString)
101+
}
102+
}
103+
104+
105+
/// Private Methods.
106+
///
107+
private extension OrderMapperTests {
108+
109+
/// Returns the OrderListMapper output upon receiving `filename` (Data Encoded)
110+
///
111+
func mapOrder(from filename: String) -> Order? {
112+
guard let response = Loader.contentsOf(filename) else {
113+
return nil
114+
}
115+
116+
return try! OrderMapper().map(response: response)
117+
}
118+
119+
/// Returns the OrderMapper output upon receiving `order`
120+
///
121+
func mapLoadOrderResponse() -> Order? {
122+
return mapOrder(from: "order")
123+
}
124+
125+
/// Returns the OrderMapper output upon receiving `broken-order`
126+
///
127+
func mapLoadBrokenOrderResponse() -> Order? {
128+
return mapOrder(from: "broken-order")
129+
}
130+
}

0 commit comments

Comments
 (0)