Skip to content

Commit 8bb8110

Browse files
Merge pull request #8500 from woocommerce/feat/8390-rest-request-encoding
[REST API] Use JSON encoding for `RESTRequest` when needed.
2 parents c47f0cc + 41c1aeb commit 8bb8110

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

Networking/Networking.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,7 @@
760760
EEFAA57D295D77F0003583BE /* AuthenticatedRESTRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA57C295D77F0003583BE /* AuthenticatedRESTRequest.swift */; };
761761
EEFAA57F295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA57E295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift */; };
762762
EEFAA581295D78E9003583BE /* AuthenticatedRESTRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA580295D78E9003583BE /* AuthenticatedRESTRequestTests.swift */; };
763+
EEFAA579295D2FC7003583BE /* RESTRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */; };
763764
FE28F6E226840DED004465C7 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E126840DED004465C7 /* User.swift */; };
764765
FE28F6E426842848004465C7 /* UserMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E326842848004465C7 /* UserMapper.swift */; };
765766
FE28F6E6268429B6004465C7 /* UserRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE28F6E5268429B6004465C7 /* UserRemote.swift */; };
@@ -1550,6 +1551,7 @@
15501551
EEFAA57C295D77F0003583BE /* AuthenticatedRESTRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedRESTRequest.swift; sourceTree = "<group>"; };
15511552
EEFAA57E295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedDotcomRequestTests.swift; sourceTree = "<group>"; };
15521553
EEFAA580295D78E9003583BE /* AuthenticatedRESTRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticatedRESTRequestTests.swift; sourceTree = "<group>"; };
1554+
EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RESTRequestTests.swift; sourceTree = "<group>"; };
15531555
F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; };
15541556
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>"; };
15551557
FE28F6E126840DED004465C7 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
@@ -1837,6 +1839,7 @@
18371839
020D0C02291504DE00BB3DCE /* UnauthenticatedRequestTests.swift */,
18381840
EEFAA57E295D78DF003583BE /* AuthenticatedDotcomRequestTests.swift */,
18391841
EEFAA580295D78E9003583BE /* AuthenticatedRESTRequestTests.swift */,
1842+
EEFAA578295D2FC7003583BE /* RESTRequestTests.swift */,
18401843
);
18411844
path = Requests;
18421845
sourceTree = "<group>";
@@ -3623,6 +3626,7 @@
36233626
9387A6F0226E3F15001B53D7 /* AccountSettingsMapperTests.swift in Sources */,
36243627
2685C102263B6A1000D9EE97 /* AddOnGroupRemoteTests.swift in Sources */,
36253628
02616F8C292132800095BC00 /* SiteRemoteTests.swift in Sources */,
3629+
EEFAA579295D2FC7003583BE /* RESTRequestTests.swift in Sources */,
36263630
B57B1E6721C916850046E764 /* NetworkErrorTests.swift in Sources */,
36273631
D8FBFF0F22D3B25E006E3336 /* WooAPIVersionTests.swift in Sources */,
36283632
45152831257A8E1A0076B03C /* ProductAttributeMapperTests.swift in Sources */,

Networking/Networking/Requests/RESTRequest.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,12 @@ struct RESTRequest: URLRequestConvertible {
5050
let components = [siteURL, Settings.basePath, wooApiVersion.path, path].map { $0.trimSlashes() }
5151
let url = try components.joined(separator: "/").asURL()
5252
let request = try URLRequest(url: url, method: method)
53-
return try URLEncoding.default.encode(request, with: parameters)
53+
switch method {
54+
case .post, .put:
55+
return try JSONEncoding.default.encode(request, with: parameters)
56+
default:
57+
return try URLEncoding.default.encode(request, with: parameters)
58+
}
5459
}
5560
}
5661

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import XCTest
2+
@testable import Networking
3+
import Alamofire
4+
5+
/// RESTRequest Unit Tests
6+
///
7+
final class RESTRequestTests: XCTestCase {
8+
/// Testing API Version
9+
///
10+
private let sampleWooApiVersion = WooAPIVersion.mark3
11+
12+
/// Sample SiteID
13+
///
14+
private let sampleSiteID: Int64 = 1234
15+
16+
/// Sample site address
17+
///
18+
private let sampleSiteAddress = "https://wordpress.com"
19+
20+
/// RPC Sample Method Path
21+
///
22+
private let sampleRPC = "sample"
23+
24+
/// Sample Parameters
25+
///
26+
private let sampleParameters = ["some": "thing", "yo": "semite"]
27+
28+
func test_it_uses_JSON_encoding_for_post_method() throws {
29+
// Given
30+
let request = RESTRequest(siteURL: sampleSiteAddress, wooApiVersion: sampleWooApiVersion, method: .post, path: sampleRPC, parameters: sampleParameters)
31+
32+
// When
33+
let urlRequest = try request.asURLRequest()
34+
35+
// Then
36+
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "Content-Type"), "application/json")
37+
}
38+
39+
func test_it_uses_JSON_encoding_for_put_method() throws {
40+
// Given
41+
let request = RESTRequest(siteURL: sampleSiteAddress, wooApiVersion: sampleWooApiVersion, method: .put, path: sampleRPC, parameters: sampleParameters)
42+
43+
// When
44+
let urlRequest = try request.asURLRequest()
45+
46+
// Then
47+
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "Content-Type"), "application/json")
48+
}
49+
50+
func test_it_does_not_use_JSON_encoding_for_methods_other_than_post_and_put() throws {
51+
// Given
52+
let methods: [HTTPMethod] = [.options, .get, .head, .patch, .delete, .trace, .connect]
53+
for method in methods {
54+
let request = RESTRequest(siteURL: sampleSiteAddress,
55+
wooApiVersion: sampleWooApiVersion,
56+
method: method,
57+
path: sampleRPC,
58+
parameters: sampleParameters)
59+
60+
// When
61+
let urlRequest = try request.asURLRequest()
62+
63+
// Then
64+
XCTAssertNotEqual(urlRequest.value(forHTTPHeaderField: "Content-Type"), "application/json")
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)