Skip to content

Commit 93fd522

Browse files
authored
Fixed the public scope of the buildEither(component:) components of URLBuilder (#13)
* Fixed #11 * Added BodyBuilderTests.swift for increase test coverage * wip * Added HeaderBuilderTest.swift for increase test coverage
1 parent 3645145 commit 93fd522

File tree

6 files changed

+233
-3
lines changed

6 files changed

+233
-3
lines changed
Binary file not shown.

.swiftpm/xcode/xcshareddata/xcschemes/APIRouter.xcscheme

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
buildConfiguration = "Debug"
4141
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
4242
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
43-
shouldUseLaunchSchemeArgsEnv = "YES">
43+
shouldUseLaunchSchemeArgsEnv = "YES"
44+
codeCoverageEnabled = "YES">
4445
<Testables>
4546
<TestableReference
4647
skipped = "NO">

Sources/APIRouter/URLBuilder.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public struct URLBuilder {
3434
CombinedURL(components)
3535
}
3636

37-
static func buildEither(first component: HttpUrlProtocol) -> HttpUrlProtocol {
37+
public static func buildEither(first component: HttpUrlProtocol) -> HttpUrlProtocol {
3838
CombinedURL([component])
3939
}
4040

41-
static func buildEither(second component: HttpUrlProtocol) -> HttpUrlProtocol {
41+
public static func buildEither(second component: HttpUrlProtocol) -> HttpUrlProtocol {
4242
CombinedURL([component])
4343
}
4444
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import Foundation
2+
import XCTest
3+
@testable import APIRouter
4+
5+
final class BodyBuilderTests: XCTestCase {
6+
func testSwitchConditionalStatementWorkingForBuildEitherInBodyBuilder() {
7+
enum BodyOptions {
8+
case one
9+
case two
10+
11+
var request: Request {
12+
Request {
13+
Body {
14+
switch self {
15+
case .one:
16+
Param("VALUE", forKey: "OPTIONONE")
17+
case .two:
18+
Param("VALUE", forKey: "OPTIONTWO")
19+
}
20+
}
21+
}
22+
}
23+
}
24+
25+
if let optionOneBody = BodyOptions.one.request.urlRequest?.httpBody,
26+
let optionOneBodyString = String(data: optionOneBody, encoding: .utf8),
27+
let optionTwoBody = BodyOptions.two.request.urlRequest?.httpBody,
28+
let optionTwoBodyString = String(data: optionTwoBody, encoding: .utf8) {
29+
XCTAssertEqual(optionOneBodyString, "{\"OPTIONONE\":\"VALUE\"}")
30+
XCTAssertEqual(optionTwoBodyString, "{\"OPTIONTWO\":\"VALUE\"}")
31+
}
32+
}
33+
34+
func testIfConditionalStatementWorkingForBuildEitherInUrlBuilder() {
35+
enum BodyOptions {
36+
case one
37+
case two
38+
39+
var request: Request {
40+
Request {
41+
Body {
42+
if self == .one {
43+
Param("VALUE", forKey: "OPTIONONE")
44+
} else {
45+
Param("VALUE", forKey: "OPTIONTWO")
46+
}
47+
}
48+
}
49+
}
50+
}
51+
52+
if let optionOneBody = BodyOptions.one.request.urlRequest?.httpBody,
53+
let optionOneBodyString = String(data: optionOneBody, encoding: .utf8),
54+
let optionTwoBody = BodyOptions.two.request.urlRequest?.httpBody,
55+
let optionTwoBodyString = String(data: optionTwoBody, encoding: .utf8) {
56+
XCTAssertEqual(optionOneBodyString, "{\"OPTIONONE\":\"VALUE\"}")
57+
XCTAssertEqual(optionTwoBodyString, "{\"OPTIONTWO\":\"VALUE\"}")
58+
}
59+
}
60+
61+
func testForLoopStatementWorkingForBuildEitherInBodyBuilder() {
62+
let params = [
63+
"key1": "value1",
64+
"key2": "value2",
65+
"key3": "value3",
66+
"key4": "value4",
67+
]
68+
69+
let request = Request {
70+
Body {
71+
for param in params {
72+
Param(param.value, forKey: param.key)
73+
}
74+
}
75+
}
76+
77+
if let httpBody = request.urlRequest?.httpBody,
78+
let bodyString = String(data: httpBody, encoding: .utf8) {
79+
XCTAssertEqual(bodyString.sorted(), ["\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", "\"", ",", ",", ",", "1", "1", "2", "2", "3", "3", "4", "4", ":", ":", ":", ":", "a", "a", "a", "a", "e", "e", "e", "e", "e", "e", "e", "e", "k", "k", "k", "k", "l", "l", "l", "l", "u", "u", "u", "u", "v", "v", "v", "v", "y", "y", "y", "y", "{", "}"])
80+
}
81+
}
82+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import Foundation
2+
import XCTest
3+
@testable import APIRouter
4+
5+
final class HeaderBuilderTests: XCTestCase {
6+
func testSwitchConditionStatemntWorkingForBuildEitherInHeaderBuilder() {
7+
enum HeaderOptions {
8+
case one
9+
case two
10+
11+
var request: Request {
12+
Request {
13+
Header {
14+
switch self {
15+
case .one:
16+
Field("VALUE", forKey: "OPTIONONE")
17+
case .two:
18+
Field("VALUE", forKey: "OPTIONTWO")
19+
}
20+
}
21+
}
22+
}
23+
}
24+
25+
if let optionOneHeaderFields = HeaderOptions.one.request.urlRequest?.allHTTPHeaderFields,
26+
let optionTwoHeaderFields = HeaderOptions.two.request.urlRequest?.allHTTPHeaderFields {
27+
XCTAssertEqual(optionOneHeaderFields, ["OPTIONONE":"VALUE"])
28+
XCTAssertEqual(optionTwoHeaderFields, ["OPTIONTWO":"VALUE"])
29+
}
30+
}
31+
32+
func testIfConditionalStatementWorkingForBuildEitherInUrlBuilder() {
33+
enum HeaderOptions {
34+
case one
35+
case two
36+
37+
var request: Request {
38+
Request {
39+
Header {
40+
if self == .one {
41+
Field("VALUE", forKey: "OPTIONONE")
42+
} else {
43+
Field("VALUE", forKey: "OPTIONTWO")
44+
}
45+
}
46+
}
47+
}
48+
}
49+
50+
if let optionOneHeaderFields = HeaderOptions.one.request.urlRequest?.allHTTPHeaderFields,
51+
let optionTwoHeaderFields = HeaderOptions.two.request.urlRequest?.allHTTPHeaderFields {
52+
XCTAssertEqual(optionOneHeaderFields, ["OPTIONONE":"VALUE"])
53+
XCTAssertEqual(optionTwoHeaderFields, ["OPTIONTWO":"VALUE"])
54+
}
55+
}
56+
57+
func testForLoopStatementWorkingForBuildEitherInHeaderBuilder() {
58+
let fields = [
59+
"key1": "value1",
60+
"key2": "value2",
61+
"key3": "value3",
62+
"key4": "value4",
63+
]
64+
65+
let request = Request {
66+
Header {
67+
for field in fields {
68+
Field(field.value, forKey: field.key)
69+
}
70+
}
71+
}
72+
73+
if let sortedAllHTTPHeaderFields = request.urlRequest?.allHTTPHeaderFields {
74+
XCTAssertEqual(sortedAllHTTPHeaderFields, ["key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"])
75+
}
76+
}
77+
}

Tests/APIRouterTests/URLBuilderTests.swift

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,74 @@ final class URLBuilderTests: XCTestCase {
113113

114114
XCTAssertEqual(url, "https://www.urltest.com/test/path?test=query")
115115
}
116+
117+
func testSwitchConditionalStatementWorkingForBuildEitherInUrlBuilder() {
118+
enum SchemeOptions {
119+
case https
120+
case http
121+
}
122+
123+
let options: SchemeOptions = .http
124+
125+
let request = Request {
126+
URL {
127+
switch options {
128+
case .https:
129+
Scheme(.https)
130+
case .http:
131+
Scheme(.http)
132+
}
133+
Host("www.urltest.com")
134+
}
135+
}
136+
137+
guard let url = request.urlRequest?.url?.absoluteString else { return }
138+
139+
XCTAssertEqual(url, "http://www.urltest.com")
140+
}
141+
142+
func testIfConditionalStatementWorkingForBuildEitherInUrlBuilder() {
143+
let conditional = true
144+
145+
let request = Request {
146+
URL {
147+
if conditional == true {
148+
Scheme(.http)
149+
} else {
150+
Scheme(.https)
151+
}
152+
Host("www.urltest.com")
153+
}
154+
}
155+
156+
guard let url = request.urlRequest?.url?.absoluteString else { return }
157+
158+
XCTAssertEqual(url, "http://www.urltest.com")
159+
}
160+
161+
/// #1: https://github.com/devyhan/APIRouter/issues/1
162+
#warning("#1 change after issue resolution.")
163+
func testForLoopStatementWorkingForBuildEitherInUrlBuilder() {
164+
let queries = [
165+
"query1": "value1"//,
166+
// "query2": "value2",
167+
// "query3": "value3",
168+
// "query4": "value4",
169+
]
170+
171+
let request = Request {
172+
URL {
173+
Scheme(.https)
174+
Host("www.urltest.com")
175+
176+
for query in queries {
177+
Query(query.key, value: query.value)
178+
}
179+
}
180+
}
181+
182+
guard let url = request.urlRequest?.url?.absoluteString else { return }
183+
184+
XCTAssertEqual(url, "https://www.urltest.com?query1=value1")
185+
}
116186
}

0 commit comments

Comments
 (0)