Skip to content

Commit 9f6d880

Browse files
committed
Added OrderNotesMapper tests
1 parent 1aeee92 commit 9f6d880

File tree

9 files changed

+122
-17
lines changed

9 files changed

+122
-17
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
741B950120EBC8A700DD6E2D /* OrderCouponLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */; };
1313
74C8F06420EEB44800B6EDC9 /* OrderNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06320EEB44800B6EDC9 /* OrderNote.swift */; };
1414
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 */; };
15+
74C8F06820EEB7BD00B6EDC9 /* OrderNotesMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06720EEB7BC00B6EDC9 /* OrderNotesMapper.swift */; };
1616
74C8F06A20EEBC8C00B6EDC9 /* OrderMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */; };
1717
74C8F06C20EEBD5D00B6EDC9 /* broken-order.json in Resources */ = {isa = PBXBuildFile; fileRef = 74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */; };
18+
74C8F06E20EEC1E800B6EDC9 /* OrderNotesMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74C8F06D20EEC1E700B6EDC9 /* OrderNotesMapperTests.swift */; };
19+
74C8F07020EEC3A800B6EDC9 /* broken-notes.json in Resources */ = {isa = PBXBuildFile; fileRef = 74C8F06F20EEC3A800B6EDC9 /* broken-notes.json */; };
1820
B505F6CD20BEE37E00BB1B69 /* AccountMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */; };
1921
B505F6CF20BEE38B00BB1B69 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6CE20BEE38B00BB1B69 /* Account.swift */; };
2022
B505F6D120BEE39600BB1B69 /* AccountRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = B505F6D020BEE39600BB1B69 /* AccountRemote.swift */; };
@@ -72,9 +74,11 @@
7274
741B950020EBC8A700DD6E2D /* OrderCouponLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCouponLine.swift; sourceTree = "<group>"; };
7375
74C8F06320EEB44800B6EDC9 /* OrderNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderNote.swift; sourceTree = "<group>"; };
7476
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>"; };
77+
74C8F06720EEB7BC00B6EDC9 /* OrderNotesMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderNotesMapper.swift; sourceTree = "<group>"; };
7678
74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderMapperTests.swift; sourceTree = "<group>"; };
7779
74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "broken-order.json"; sourceTree = "<group>"; };
80+
74C8F06D20EEC1E700B6EDC9 /* OrderNotesMapperTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderNotesMapperTests.swift; sourceTree = "<group>"; };
81+
74C8F06F20EEC3A800B6EDC9 /* broken-notes.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "broken-notes.json"; sourceTree = "<group>"; };
7882
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>"; };
7983
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountMapper.swift; sourceTree = "<group>"; };
8084
B505F6CE20BEE38B00BB1B69 /* Account.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = "<group>"; };
@@ -307,6 +311,7 @@
307311
CE20179220E3EFA7005B4C18 /* broken-orders.json */,
308312
74C8F06B20EEBD5D00B6EDC9 /* broken-order.json */,
309313
74C8F06520EEB76400B6EDC9 /* order-notes.json */,
314+
74C8F06F20EEC3A800B6EDC9 /* broken-notes.json */,
310315
);
311316
path = Responses;
312317
sourceTree = "<group>";
@@ -318,7 +323,7 @@
318323
B505F6CC20BEE37E00BB1B69 /* AccountMapper.swift */,
319324
B5C6FCD320A373BA00A4F8E4 /* OrderMapper.swift */,
320325
B567AF2A20A0FA4200AB6C62 /* OrderListMapper.swift */,
321-
74C8F06720EEB7BC00B6EDC9 /* OrderNoteMapper.swift */,
326+
74C8F06720EEB7BC00B6EDC9 /* OrderNotesMapper.swift */,
322327
);
323328
path = Mapper;
324329
sourceTree = "<group>";
@@ -345,6 +350,7 @@
345350
B505F6D220BEE3A500BB1B69 /* AccountMapperTests.swift */,
346351
B5C6FCCC20A34B8300A4F8E4 /* OrderListMapperTests.swift */,
347352
74C8F06920EEBC8C00B6EDC9 /* OrderMapperTests.swift */,
353+
74C8F06D20EEC1E700B6EDC9 /* OrderNotesMapperTests.swift */,
348354
);
349355
path = Mapper;
350356
sourceTree = "<group>";
@@ -468,6 +474,7 @@
468474
B5C6FCD620A3768900A4F8E4 /* order.json in Resources */,
469475
B559EBAA20A0B5CD00836CD4 /* orders-load-all.json in Resources */,
470476
CE20179320E3EFA7005B4C18 /* broken-orders.json in Resources */,
477+
74C8F07020EEC3A800B6EDC9 /* broken-notes.json in Resources */,
471478
);
472479
runOnlyForDeploymentPostprocessing = 0;
473480
};
@@ -555,7 +562,7 @@
555562
B5C6FCCF20A3592900A4F8E4 /* OrderItem.swift in Sources */,
556563
B505F6EC20BEFDC200BB1B69 /* Loader.swift in Sources */,
557564
B5BB1D1220A255EC00112D92 /* OrderStatus.swift in Sources */,
558-
74C8F06820EEB7BD00B6EDC9 /* OrderNoteMapper.swift in Sources */,
565+
74C8F06820EEB7BD00B6EDC9 /* OrderNotesMapper.swift in Sources */,
559566
B5BB1D1020A237FB00112D92 /* Address.swift in Sources */,
560567
B557DA0420975500005962F4 /* OrdersRemote.swift in Sources */,
561568
B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */,
@@ -578,6 +585,7 @@
578585
B505F6D720BEE58800BB1B69 /* AccountRemoteTests.swift in Sources */,
579586
B518662A20A09C6F00037A38 /* OrdersRemoteTests.swift in Sources */,
580587
B5969E1520A47F99005E9DF1 /* RemoteTests.swift in Sources */,
588+
74C8F06E20EEC1E800B6EDC9 /* OrderNotesMapperTests.swift in Sources */,
581589
B567AF2F20A0FB8F00AB6C62 /* AuthenticatedRequestTests.swift in Sources */,
582590
B5C6FCCD20A34B8300A4F8E4 /* OrderListMapperTests.swift in Sources */,
583591
B518663520A0A2E800037A38 /* Constants.swift in Sources */,

Networking/Networking/Mapper/OrderNoteMapper.swift renamed to Networking/Networking/Mapper/OrderNotesMapper.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import Foundation
22

33

4-
/// Mapper: OrderNote
4+
/// Mapper: OrderNotes
55
///
6-
class OrderNoteMapper: Mapper {
6+
class OrderNotesMapper: Mapper {
77

88
/// (Attempts) to convert a dictionary into [OrderNote].
99
///
1010
func map(response: Data) throws -> [OrderNote] {
1111
let decoder = JSONDecoder()
1212
decoder.dateDecodingStrategy = .formatted(DateFormatter.Defaults.dateTimeFormatter)
1313

14-
return try decoder.decode(OrderNoteEnvelope.self, from: response).orderNotes
14+
return try decoder.decode(OrderNotesEnvelope.self, from: response).orderNotes
1515
}
1616
}
1717

@@ -20,7 +20,7 @@ class OrderNoteMapper: Mapper {
2020
/// `Load Order Notes` endpoint returns all of its notes within the `data` key. This entity
2121
/// allows us to do parse all the things with JSONDecoder.
2222
///
23-
private struct OrderNoteEnvelope: Decodable {
23+
private struct OrderNotesEnvelope: Decodable {
2424
let orderNotes: [OrderNote]
2525

2626
private enum CodingKeys: String, CodingKey {

Networking/Networking/Model/OrderNote.swift

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,29 @@ import Foundation
66
public struct OrderNote: Decodable {
77
public let noteId: Int
88
public let dateCreated: Date
9-
public let contents: String
9+
public let note: String
1010
public let isCustomerNote: Bool
11+
12+
/// Order struct initializer.
13+
///
14+
init(noteId: Int, dateCreated: Date, note: String, isCustomerNote: Bool) {
15+
self.noteId = noteId
16+
self.dateCreated = dateCreated
17+
self.note = note
18+
self.isCustomerNote = isCustomerNote
19+
}
20+
21+
/// The public initializer for OrderNote.
22+
///
23+
public init(from decoder: Decoder) throws {
24+
let container = try decoder.container(keyedBy: CodingKeys.self)
25+
let noteId = try container.decode(Int.self, forKey: .noteId)
26+
let dateCreated = try container.decodeIfPresent(Date.self, forKey: .dateCreated) ?? Date()
27+
let note = try container.decode(String.self, forKey: .note)
28+
let isCustomerNote = try container.decode(Bool.self, forKey: .isCustomerNote)
29+
30+
self.init(noteId: noteId, dateCreated: dateCreated, note: note, isCustomerNote: isCustomerNote) // initialize the struct
31+
}
1132
}
1233

1334

@@ -18,7 +39,7 @@ private extension OrderNote {
1839
enum CodingKeys: String, CodingKey {
1940
case noteId = "id"
2041
case dateCreated = "date_created_gmt"
21-
case contents = "note"
42+
case note = "note"
2243
case isCustomerNote = "customer_note"
2344
}
2445
}
@@ -30,13 +51,13 @@ extension OrderNote: Comparable {
3051
public static func == (lhs: OrderNote, rhs: OrderNote) -> Bool {
3152
return lhs.noteId == rhs.noteId &&
3253
lhs.dateCreated == rhs.dateCreated &&
33-
lhs.contents == rhs.contents &&
54+
lhs.note == rhs.note &&
3455
lhs.isCustomerNote == rhs.isCustomerNote
3556
}
3657

3758
public static func < (lhs: OrderNote, rhs: OrderNote) -> Bool {
3859
return lhs.noteId < rhs.noteId ||
3960
(lhs.noteId == rhs.noteId && lhs.dateCreated < rhs.dateCreated) ||
40-
(lhs.noteId == rhs.noteId && lhs.dateCreated == rhs.dateCreated && lhs.contents < rhs.contents)
61+
(lhs.noteId == rhs.noteId && lhs.dateCreated == rhs.dateCreated && lhs.note < rhs.note)
4162
}
4263
}

Networking/Networking/Remote/OrdersRemote.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class OrdersRemote: Remote {
4747
public func loadOrderNotes(for siteID: Int, orderID: Int, completion: @escaping ([OrderNote]?, Error?) -> Void) {
4848
let path = "\(Constants.ordersPath)/\(orderID)/\(Constants.notesPath)/"
4949
let request = JetpackRequest(wooApiVersion: .mark2, method: .get, siteID: siteID, path: path, parameters: nil)
50-
let mapper = OrderNoteMapper()
50+
let mapper = OrderNotesMapper()
5151

5252
enqueue(request, mapper: mapper, completion: completion)
5353
}

Networking/NetworkingTests/Mapper/OrderMapperTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class OrderMapperTests: XCTestCase {
106106
///
107107
private extension OrderMapperTests {
108108

109-
/// Returns the OrderListMapper output upon receiving `filename` (Data Encoded)
109+
/// Returns the OrderMapper output upon receiving `filename` (Data Encoded)
110110
///
111111
func mapOrder(from filename: String) -> Order? {
112112
guard let response = Loader.contentsOf(filename) else {
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import XCTest
2+
@testable import Networking
3+
4+
5+
/// OrderListMapper Unit Tests
6+
///
7+
class OrderNotesMapperTests: XCTestCase {
8+
9+
/// Verifies that all of the OrderNote Fields are parsed correctly.
10+
///
11+
func testNoteFieldsAreProperlyParsed() {
12+
let notes = mapLoadAllOrderNotesResponse()
13+
XCTAssertEqual(notes.count, 18)
14+
15+
let firstNote = notes[0]
16+
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2018-06-23T17:06:55")
17+
18+
XCTAssertEqual(firstNote.noteId, 2261)
19+
XCTAssertEqual(firstNote.dateCreated, dateCreated)
20+
XCTAssertEqual(firstNote.note, "I love your products!")
21+
XCTAssertEqual(firstNote.isCustomerNote, true)
22+
}
23+
24+
/// Verifies that an Note in a broken state does [gets default values] | [gets skipped while parsing]
25+
///
26+
func testNoteHasDefaultDateCreatedWhenNullDateReceived() {
27+
let notes = mapLoadBrokenOrderNotesResponse()
28+
XCTAssert(notes.count == 1)
29+
30+
let brokenNote = notes[0]
31+
let format = DateFormatter()
32+
format.dateStyle = .short
33+
34+
let orderCreatedString = format.string(from: brokenNote.dateCreated)
35+
let todayCreatedString = format.string(from: Date())
36+
XCTAssertEqual(orderCreatedString, todayCreatedString)
37+
}
38+
}
39+
40+
41+
/// Private Methods.
42+
///
43+
private extension OrderNotesMapperTests {
44+
45+
/// Returns the OrderNotesMapper output upon receiving `filename` (Data Encoded)
46+
///
47+
func mapNotes(from filename: String) -> [OrderNote] {
48+
guard let response = Loader.contentsOf(filename) else {
49+
return []
50+
}
51+
52+
return try! OrderNotesMapper().map(response: response)
53+
}
54+
55+
/// Returns the OrderNotesMapper output upon receiving `orders-load-all`
56+
///
57+
func mapLoadAllOrderNotesResponse() -> [OrderNote] {
58+
return mapNotes(from: "order-notes")
59+
}
60+
61+
/// Returns the OrderNotesMapper output upon receiving `broken-order`
62+
///
63+
func mapLoadBrokenOrderNotesResponse() -> [OrderNote] {
64+
return mapNotes(from: "broken-notes")
65+
}
66+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"data": [{
3+
"id": 2261,
4+
"date_created": null,
5+
"date_created_gmt": null,
6+
"note": "",
7+
"customer_note": false,
8+
"_links": null
9+
}]
10+
}

Networking/NetworkingTests/Responses/order-notes.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
"id": 2261,
55
"date_created": "2018-06-23T13:06:55",
66
"date_created_gmt": "2018-06-23T17:06:55",
7-
"note": "Order exported to CSV and successfully downloaded.",
8-
"customer_note": false,
7+
"note": "I love your products!",
8+
"customer_note": true,
99
"_links": {
1010
"self": [
1111
{

WooCommerce/Classes/ViewModels/OrderNoteViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class OrderNoteViewModel {
2222
}
2323

2424
dateCreated = orderNote.dateCreated
25-
contents = orderNote.contents
25+
contents = orderNote.note
2626
}
2727

2828
var formattedDateCreated: String? {

0 commit comments

Comments
 (0)