Skip to content

Commit 16e118f

Browse files
authored
Merge pull request #8569 from woocommerce/feat/8568-refund-migrate
REST API: Migrate refund endpoints
2 parents f969f6e + 99e9656 commit 16e118f

File tree

8 files changed

+277
-53
lines changed

8 files changed

+277
-53
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,8 @@
694694
DE42F9602967C88400D514C2 /* report-orders-total-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE42F95E2967C88400D514C2 /* report-orders-total-without-data.json */; };
695695
DE42F9612967C88400D514C2 /* report-orders-total.json in Resources */ = {isa = PBXBuildFile; fileRef = DE42F95F2967C88400D514C2 /* report-orders-total.json */; };
696696
DE42F9632967C8B900D514C2 /* ReportOrderTotalsMapperTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE42F9622967C8B900D514C2 /* ReportOrderTotalsMapperTests.swift */; };
697+
DE42F9652967F34400D514C2 /* refund-single-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE42F9642967F34400D514C2 /* refund-single-without-data.json */; };
698+
DE42F9672967F61D00D514C2 /* refunds-all-without-data.json in Resources */ = {isa = PBXBuildFile; fileRef = DE42F9662967F61D00D514C2 /* refunds-all-without-data.json */; };
697699
DE50295928C5BD0200551736 /* JetpackUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE50295828C5BD0200551736 /* JetpackUser.swift */; };
698700
DE50295B28C5F99700551736 /* DotcomUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE50295A28C5F99700551736 /* DotcomUser.swift */; };
699701
DE50295D28C6068B00551736 /* JetpackUserMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE50295C28C6068B00551736 /* JetpackUserMapper.swift */; };
@@ -1503,6 +1505,8 @@
15031505
DE42F95E2967C88400D514C2 /* report-orders-total-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "report-orders-total-without-data.json"; path = "NetworkingTests/Responses/report-orders-total-without-data.json"; sourceTree = SOURCE_ROOT; };
15041506
DE42F95F2967C88400D514C2 /* report-orders-total.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "report-orders-total.json"; path = "NetworkingTests/Responses/report-orders-total.json"; sourceTree = SOURCE_ROOT; };
15051507
DE42F9622967C8B900D514C2 /* ReportOrderTotalsMapperTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportOrderTotalsMapperTests.swift; sourceTree = "<group>"; };
1508+
DE42F9642967F34400D514C2 /* refund-single-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "refund-single-without-data.json"; sourceTree = "<group>"; };
1509+
DE42F9662967F61D00D514C2 /* refunds-all-without-data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "refunds-all-without-data.json"; sourceTree = "<group>"; };
15061510
DE50295828C5BD0200551736 /* JetpackUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JetpackUser.swift; sourceTree = "<group>"; };
15071511
DE50295A28C5F99700551736 /* DotcomUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DotcomUser.swift; sourceTree = "<group>"; };
15081512
DE50295C28C6068B00551736 /* JetpackUserMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JetpackUserMapper.swift; sourceTree = "<group>"; };
@@ -2123,6 +2127,8 @@
21232127
B559EBA820A0B5B100836CD4 /* Responses */ = {
21242128
isa = PBXGroup;
21252129
children = (
2130+
DE42F9662967F61D00D514C2 /* refunds-all-without-data.json */,
2131+
DE42F9642967F34400D514C2 /* refund-single-without-data.json */,
21262132
EE80A24B29556F1D003591E4 /* Coupon */,
21272133
EE338A0A294AF92A00183934 /* AppliicationPassword */,
21282134
DE9DEEF4291CF1B40070AD7C /* site-plugin-without-envelope.json */,
@@ -2961,6 +2967,7 @@
29612967
31A451CC27863A2E00FE81AA /* stripe-account-rejected-fraud.json in Resources */,
29622968
31A451D827863A2E00FE81AA /* stripe-account-restricted-overdue.json in Resources */,
29632969
D865CE69278CA245002C8520 /* stripe-payment-intent-unknown-status.json in Resources */,
2970+
DE42F9652967F34400D514C2 /* refund-single-without-data.json in Resources */,
29642971
0205021C27C86B9700FB1C6B /* inbox-note-without-isRead.json in Resources */,
29652972
24F98C622502EFF600F49B68 /* feature-flags-load-all.json in Resources */,
29662973
DE50296128C609A300551736 /* jetpack-connected-user.json in Resources */,
@@ -3067,6 +3074,7 @@
30673074
31054718262E2F5E00C5C02B /* wcpay-payment-intent-requires-confirmation.json in Resources */,
30683075
D8FBFF2922D52AFB006E3336 /* order-stats-v4-year.json in Resources */,
30693076
D865CE65278CA202002C8520 /* stripe-payment-intent-canceled.json in Resources */,
3077+
DE42F9672967F61D00D514C2 /* refunds-all-without-data.json in Resources */,
30703078
AED8AEBA272A97B400663FCC /* null-data.json in Resources */,
30713079
02BA23CA22EEF62C009539E7 /* order-stats-v4-wcadmin-activated.json in Resources */,
30723080
31A451D627863A2E00FE81AA /* stripe-account-unknown-status.json in Resources */,

Networking/Networking/Mapper/RefundListMapper.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ struct RefundListMapper: Mapper {
2727
.orderID: orderID
2828
]
2929

30-
return try decoder.decode(RefundsEnvelope.self, from: response).refunds
30+
do {
31+
return try decoder.decode(RefundsEnvelope.self, from: response).refunds
32+
} catch {
33+
return try decoder.decode([Refund].self, from: response)
34+
}
3135
}
3236
}
3337

Networking/Networking/Mapper/RefundMapper.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ struct RefundMapper: Mapper {
2727
.orderID: orderID
2828
]
2929

30-
return try decoder.decode(RefundEnvelope.self, from: response).refund
30+
do {
31+
return try decoder.decode(RefundEnvelope.self, from: response).refund
32+
} catch {
33+
return try decoder.decode(Refund.self, from: response)
34+
}
3135
}
3236

3337
/// (Attempts) to encode a Refund object into JSONEncoded data.

Networking/Networking/Remote/RefundsRemote.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ public final class RefundsRemote: Remote {
2828
ParameterKey.contextKey: context
2929
]
3030
let path = "\(Path.orders)/" + String(orderID) + "/" + "\(Path.refunds)"
31-
let request = JetpackRequest(wooApiVersion: .mark3, method: .get, siteID: siteID, path: path, parameters: parameters)
31+
let request = JetpackRequest(wooApiVersion: .mark3,
32+
method: .get,
33+
siteID: siteID,
34+
path: path,
35+
parameters: parameters,
36+
availableAsRESTRequest: true)
3237
let mapper = RefundListMapper(siteID: siteID, orderID: orderID)
3338

3439
enqueue(request, mapper: mapper, completion: completion)
@@ -49,7 +54,12 @@ public final class RefundsRemote: Remote {
4954
let stringOfRefundIDs = refundIDs.sortedUniqueIntToString()
5055
let parameters = [ ParameterKey.include: stringOfRefundIDs ]
5156
let path = "\(Path.orders)/" + String(orderID) + "/" + "\(Path.refunds)"
52-
let request = JetpackRequest(wooApiVersion: .mark3, method: .get, siteID: siteID, path: path, parameters: parameters)
57+
let request = JetpackRequest(wooApiVersion: .mark3,
58+
method: .get,
59+
siteID: siteID,
60+
path: path,
61+
parameters: parameters,
62+
availableAsRESTRequest: true)
5363
let mapper = RefundListMapper(siteID: siteID, orderID: orderID)
5464

5565
enqueue(request, mapper: mapper, completion: completion)
@@ -68,7 +78,12 @@ public final class RefundsRemote: Remote {
6878
refundID: Int64,
6979
completion: @escaping (Refund?, Error?) -> Void) {
7080
let path = Path.orders + "/" + String(orderID) + "/" + Path.refunds + "/" + String(refundID)
71-
let request = JetpackRequest(wooApiVersion: .mark3, method: .get, siteID: siteID, path: path, parameters: nil)
81+
let request = JetpackRequest(wooApiVersion: .mark3,
82+
method: .get,
83+
siteID: siteID,
84+
path: path,
85+
parameters: nil,
86+
availableAsRESTRequest: true)
7287
let mapper = RefundMapper(siteID: siteID, orderID: orderID)
7388

7489
enqueue(request, mapper: mapper, completion: completion)
@@ -92,7 +107,12 @@ public final class RefundsRemote: Remote {
92107
do {
93108
let encodedJson = try mapper.map(refund: refund)
94109
let parameters: [String: Any]? = try JSONSerialization.jsonObject(with: encodedJson, options: []) as? [String: Any]
95-
let request = JetpackRequest(wooApiVersion: .mark3, method: .post, siteID: siteID, path: path, parameters: parameters)
110+
let request = JetpackRequest(wooApiVersion: .mark3,
111+
method: .post,
112+
siteID: siteID,
113+
path: path,
114+
parameters: parameters,
115+
availableAsRESTRequest: true)
96116

97117
enqueue(request, mapper: mapper, completion: completion)
98118
} catch {

Networking/NetworkingTests/Mapper/RefundListMapperTests.swift

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,40 @@ final class RefundListMapperTests: XCTestCase {
1717
/// Verifies that all the Refund fields are parsed correctly.
1818
///
1919
func test_Refund_fields_are_properly_parsed() {
20-
let refunds = mapLoadAllRefundsResponse()
21-
XCTAssertEqual(refunds.count, 2)
22-
23-
let firstRefund = refunds[0]
24-
XCTAssertEqual(firstRefund.siteID, dummySiteID)
25-
XCTAssertEqual(firstRefund.orderID, orderID)
26-
XCTAssertEqual(firstRefund.refundID, 590)
27-
28-
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-09T16:18:23")
29-
XCTAssertEqual(firstRefund.dateCreated, dateCreated)
30-
31-
XCTAssertEqual(firstRefund.amount, "18.00")
32-
XCTAssertEqual(firstRefund.reason, "Only 1 black hoodie left. Inventory count was off. My bad!")
33-
XCTAssertEqual(firstRefund.refundedByUserID, 1)
34-
35-
if let isAutomated = firstRefund.isAutomated {
36-
XCTAssertTrue(isAutomated)
37-
}
38-
39-
let secondRefund = refunds[1]
40-
XCTAssertEqual(secondRefund.siteID, dummySiteID)
41-
XCTAssertEqual(secondRefund.orderID, orderID)
42-
XCTAssertEqual(secondRefund.refundID, 562)
43-
44-
let dateCreated2 = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-01T19:33:46")
45-
XCTAssertEqual(secondRefund.dateCreated, dateCreated2)
46-
47-
XCTAssertEqual(secondRefund.amount, "27.00")
48-
XCTAssertEqual(secondRefund.reason, "My pet hamster ate the sleeve off of one of the Blue XL hoodies. Sorry! No longer for sale.")
49-
XCTAssertEqual(secondRefund.refundedByUserID, 1)
50-
51-
if let isAutomated = secondRefund.isAutomated {
52-
XCTAssertTrue(isAutomated)
20+
let result = [mapLoadAllRefundsResponse(), mapLoadAllRefundsResponseWithoutDataEnvelope()]
21+
for refunds in result {
22+
XCTAssertEqual(refunds.count, 2)
23+
24+
let firstRefund = refunds[0]
25+
XCTAssertEqual(firstRefund.siteID, dummySiteID)
26+
XCTAssertEqual(firstRefund.orderID, orderID)
27+
XCTAssertEqual(firstRefund.refundID, 590)
28+
29+
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-09T16:18:23")
30+
XCTAssertEqual(firstRefund.dateCreated, dateCreated)
31+
32+
XCTAssertEqual(firstRefund.amount, "18.00")
33+
XCTAssertEqual(firstRefund.reason, "Only 1 black hoodie left. Inventory count was off. My bad!")
34+
XCTAssertEqual(firstRefund.refundedByUserID, 1)
35+
if let isAutomated = firstRefund.isAutomated {
36+
XCTAssertTrue(isAutomated)
37+
}
38+
39+
let secondRefund = refunds[1]
40+
XCTAssertEqual(secondRefund.siteID, dummySiteID)
41+
XCTAssertEqual(secondRefund.orderID, orderID)
42+
XCTAssertEqual(secondRefund.refundID, 562)
43+
44+
let dateCreated2 = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-01T19:33:46")
45+
XCTAssertEqual(secondRefund.dateCreated, dateCreated2)
46+
47+
XCTAssertEqual(secondRefund.amount, "27.00")
48+
XCTAssertEqual(secondRefund.reason, "My pet hamster ate the sleeve off of one of the Blue XL hoodies. Sorry! No longer for sale.")
49+
XCTAssertEqual(secondRefund.refundedByUserID, 1)
50+
51+
if let isAutomated = secondRefund.isAutomated {
52+
XCTAssertTrue(isAutomated)
53+
}
5354
}
5455
}
5556

@@ -129,4 +130,10 @@ private extension RefundListMapperTests {
129130
func mapLoadAllRefundsResponse() -> [Refund] {
130131
return mapRefunds(from: "refunds-all")
131132
}
133+
134+
/// Returns the RefundListMapper output upon receiving `refunds-all-without-data`
135+
///
136+
func mapLoadAllRefundsResponseWithoutDataEnvelope() -> [Refund] {
137+
return mapRefunds(from: "refunds-all-without-data")
138+
}
132139
}

Networking/NetworkingTests/Mapper/RefundMapperTests.swift

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,24 @@ final class RefundMapperTests: XCTestCase {
1717
/// Verifies that all of the Refund fields are parsed correctly.
1818
///
1919
func test_Refund_fields_are_properly_parsed() {
20-
guard let refund = mapLoadRefundResponse() else {
21-
XCTFail("No `refund-single.json` file found.")
22-
return
20+
let results = [mapLoadRefundResponse(), mapLoadRefundResponseWithoutDataEnvelope()]
21+
for refund in results {
22+
guard let refund else {
23+
XCTFail("No mock file found.")
24+
return
25+
}
26+
27+
XCTAssertEqual(refund.siteID, dummySiteID)
28+
XCTAssertEqual(refund.refundID, 562)
29+
30+
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-01T19:33:46")
31+
XCTAssertEqual(refund.dateCreated, dateCreated)
32+
33+
XCTAssertEqual(refund.amount, "27.00")
34+
XCTAssertEqual(refund.reason, "My pet hamster ate the sleeve off of one of the Blue XL hoodies. Sorry! No longer for sale.")
35+
XCTAssertEqual(refund.refundedByUserID, 1)
36+
XCTAssertEqual(refund.isAutomated, true)
2337
}
24-
25-
XCTAssertEqual(refund.siteID, dummySiteID)
26-
XCTAssertEqual(refund.refundID, 562)
27-
28-
let dateCreated = DateFormatter.Defaults.dateTimeFormatter.date(from: "2019-10-01T19:33:46")
29-
XCTAssertEqual(refund.dateCreated, dateCreated)
30-
31-
XCTAssertEqual(refund.amount, "27.00")
32-
XCTAssertEqual(refund.reason, "My pet hamster ate the sleeve off of one of the Blue XL hoodies. Sorry! No longer for sale.")
33-
XCTAssertEqual(refund.refundedByUserID, 1)
34-
XCTAssertEqual(refund.isAutomated, true)
3538
}
3639

3740
/// Verifies that all of the Refunded Order Items are parsed correctly.
@@ -160,6 +163,12 @@ private extension RefundMapperTests {
160163
return mapRefund(from: "refund-single")
161164
}
162165

166+
/// Returns the RefundsMapper output upon receiving `refund-single-without-data`
167+
///
168+
func mapLoadRefundResponseWithoutDataEnvelope() -> Refund? {
169+
return mapRefund(from: "refund-single-without-data")
170+
}
171+
163172
/// Creates a dummy refund with items and taxes
164173
///
165174
func sampleRefund(includeTaxes: Bool) -> Refund {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"id": 562,
3+
"date_created": "2019-10-01T19:33:46",
4+
"date_created_gmt": "2019-10-01T19:33:46",
5+
"amount": "27.00",
6+
"reason": "My pet hamster ate the sleeve off of one of the Blue XL hoodies. Sorry! No longer for sale.",
7+
"refunded_by": 1,
8+
"refunded_payment": true,
9+
"meta_data": [],
10+
"line_items": [
11+
{
12+
"id": 67,
13+
"name": "Ship Your Idea - Blue, XL",
14+
"product_id": 21,
15+
"variation_id": 70,
16+
"quantity": -1,
17+
"tax_class": "",
18+
"subtotal": "-27.00",
19+
"subtotal_tax": "0.00",
20+
"total": "-27.00",
21+
"total_tax": "0.00",
22+
"taxes": [],
23+
"meta_data": [
24+
{
25+
"id": 605,
26+
"key": "_refunded_item_id",
27+
"value": "65"
28+
}
29+
],
30+
"sku": "HOODIE-SHIP-YOUR-IDEA-BLUE-XL",
31+
"price": 27
32+
}
33+
],
34+
"shipping_lines": [
35+
{
36+
"id": 189,
37+
"method_title": "Flat rate",
38+
"method_id": "flat_rate",
39+
"instance_id": "1",
40+
"total": "-7.00",
41+
"total_tax": "-0.62",
42+
"taxes": [
43+
{
44+
"id": 1,
45+
"total": "-0.62",
46+
"subtotal": ""
47+
}
48+
]
49+
}
50+
],
51+
"_links": {
52+
"self": [
53+
{
54+
"href": "https://test.com/wp-json/wc/v3/orders/560/refunds/562"
55+
}
56+
],
57+
"collection": [
58+
{
59+
"href": "https://test.com/wp-json/wc/v3/orders/560/refunds"
60+
}
61+
],
62+
"up": [
63+
{
64+
"href": "https://test.com/wp-json/wc/v3/orders/560"
65+
}
66+
]
67+
}
68+
}

0 commit comments

Comments
 (0)