Skip to content

Commit df854e0

Browse files
authored
Merge pull request #2 from JZDesign/build.request
Build request and tests
2 parents de3ae5a + 778efa9 commit df854e0

File tree

3 files changed

+105
-8
lines changed

3 files changed

+105
-8
lines changed
Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1-
struct HTTPEngine {
2-
var text = "Hello, World!"
1+
import Foundation
2+
3+
public typealias Header = [String: String]
4+
5+
public struct HTTPEngine {
6+
public init() {}
7+
8+
public func buildRequest(
9+
method: HTTPMethod,
10+
url: URL,
11+
body: Data? = nil,
12+
header: Header? = nil
13+
) -> URLRequest {
14+
15+
var request = URLRequest(url: url)
16+
request.httpMethod = method.rawValue.uppercased()
17+
request.httpBody = body
18+
request.allHTTPHeaderFields = header
19+
20+
if request.allHTTPHeaderFields?["Content-Type"] == nil {
21+
if [HTTPMethod.post, HTTPMethod.put, HTTPMethod.patch].contains(method) {
22+
request.allHTTPHeaderFields?["Content-Type"] = "application/json"
23+
}
24+
}
25+
26+
if request.allHTTPHeaderFields?["Accept-Encoding"] == nil {
27+
request.allHTTPHeaderFields?["Accept-Encoding"] = "gzip;q=1.0,compress;q=0.5"
28+
}
29+
30+
return request
31+
}
32+
333
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import Foundation
2+
3+
public enum HTTPMethod: String, CaseIterable {
4+
case post
5+
case get
6+
case patch
7+
case delete
8+
case put
9+
}
Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,73 @@
11
import XCTest
2+
import Foundation
23
@testable import HTTPEngine
34

45
final class HTTPEngineTests: XCTestCase {
5-
func testExample() {
6-
// This is an example of a functional test case.
7-
// Use XCTAssert and related functions to verify your tests produce the correct
8-
// results.
9-
XCTAssertEqual(HTTPEngine().text, "Hello, World!")
6+
7+
func testBuildRequestContainsAcceptEncodingByDefault() {
8+
HTTPMethod.allCases.forEach {
9+
let request = HTTPEngine().buildRequest(method: $0, url: URL(string: "www.google.com")!)
10+
XCTAssertEqual(request.allHTTPHeaderFields?["Accept-Encoding"], "gzip;q=1.0,compress;q=0.5")
11+
}
12+
}
13+
14+
func testBuildRequestsOverridesAcceptEncodingHeader() {
15+
let request = HTTPEngine()
16+
.buildRequest(
17+
method: .get,
18+
url: URL(string: "www.google.com")!,
19+
header: ["Accept-Encoding": "something"])
20+
XCTAssertEqual(request.allHTTPHeaderFields?["Accept-Encoding"], "something")
21+
}
22+
23+
func testPostPatchPutContainDefaultContentTypeHeader() {
24+
let methods: [HTTPMethod] = [.post, .patch, .put]
25+
methods.forEach {
26+
let request = HTTPEngine().buildRequest(method: $0, url: URL(string: "www.google.com")!)
27+
XCTAssertEqual(request.allHTTPHeaderFields?["Content-Type"], "application/json")
28+
}
29+
}
30+
31+
func testNonPostPatchPutMethodsDoNotContainDefaultContentTypeHeader() {
32+
let methods: [HTTPMethod] = [.get, .delete]
33+
methods.forEach {
34+
let request = HTTPEngine().buildRequest(method: $0, url: URL(string: "www.google.com")!)
35+
XCTAssertNil(request.allHTTPHeaderFields?["Content-Type"])
36+
}
37+
}
38+
39+
40+
func testBuildRequestOverridesContentTypeHeader() {
41+
let methods: [HTTPMethod] = HTTPMethod.allCases
42+
methods.forEach {
43+
let request = HTTPEngine()
44+
.buildRequest(
45+
method: $0,
46+
url: URL(string: "www.google.com")!,
47+
header: ["Content-Type": "something"]
48+
)
49+
XCTAssertEqual(request.allHTTPHeaderFields?["Content-Type"], "something")
50+
}
51+
}
52+
53+
func testBuildRequestAppliesBodyToRequest() {
54+
let request = HTTPEngine().buildRequest(method: .get, url: URL(string: "www.google.com")!, body: "".data(using: .utf8)!)
55+
XCTAssertNotNil(request.httpBody)
56+
}
57+
58+
func testBuildRequestAppliesMethodToRequest() {
59+
let request = HTTPEngine().buildRequest(method: .get, url: URL(string: "www.google.com")!)
60+
XCTAssertEqual(request.httpMethod, "GET")
1061
}
1162

63+
1264
static var allTests = [
13-
("testExample", testExample),
65+
("Default Accept Encoding Header", testBuildRequestContainsAcceptEncodingByDefault),
66+
("Override Accept Encoding Header", testBuildRequestsOverridesAcceptEncodingHeader),
67+
("Put Patch Post contain default Content Type header", testPostPatchPutContainDefaultContentTypeHeader),
68+
("Non Put Patch Post do not contain content type header", testNonPostPatchPutMethodsDoNotContainDefaultContentTypeHeader),
69+
("Build request overrides content type header", testBuildRequestOverridesContentTypeHeader),
70+
("Build Request applies body to request", testBuildRequestAppliesBodyToRequest),
71+
("Build Request applies Method to request", testBuildRequestAppliesMethodToRequest)
1472
]
1573
}

0 commit comments

Comments
 (0)