Skip to content

Commit 1e05266

Browse files
author
Filip Sardzoski
authored
Merge pull request #28 from dimebt/feature/add-support-for-url-query-parameters-with-same-name
ADD Support for url query parameters with same name
2 parents 34e4a17 + 18fab79 commit 1e05266

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

GirdersSwift.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
Pod::Spec.new do |s|
22
s.name = 'GirdersSwift'
3-
s.version = '0.7.0'
3+
s.version = '0.7.1'
44
s.summary = 'Girders for iOS, written in Swift.'
55
s.homepage = 'https://www.netcetera.com'
66
s.author = 'Netcetera'
77
s.description = 'A library that reduces development time for iOS Swift applications.'
88
s.platform = :ios, '11.0'
9-
s.source = { :git => 'https://github.com/netceteragroup/GirdersSwift.git', :tag => '0.7.0' }
9+
s.source = { :git => 'https://github.com/netceteragroup/GirdersSwift.git', :tag => '0.7.1' }
1010
s.requires_arc = true
1111
s.swift_version = "5.0"
1212
s.module_name = 'GirdersSwift'

Sources/GirdersSwift/http/Request.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,26 @@ public struct MutableRequest : RequestGenerator {
150150
}
151151

152152
public mutating func updateQueryParameters(parameters: Any?) {
153-
if let params = parameters as? [String: AnyObject] {
154-
self.queryString =
155-
params.urlEncodedQueryStringWithEncoding(encoding: String.Encoding.utf8)
153+
switch parameters {
154+
case let params as [String: AnyObject]:
155+
self.queryString = params.urlEncodedQueryStringWithEncoding(encoding: String.Encoding.utf8)
156+
case let params as [URLQueryItem]:
157+
updateQueryParameters(params: params)
158+
default:
159+
self.queryString = nil
156160
}
157161
}
158162

163+
private mutating func updateQueryParameters(params: [URLQueryItem]) {
164+
var urlComponents = URLComponents()
165+
let encodedQueryParams = params.map {
166+
URLQueryItem(name: $0.name.urlEncodedStringWithEncoding(),
167+
value: $0.value?.urlEncodedStringWithEncoding())
168+
}
169+
urlComponents.queryItems = encodedQueryParams
170+
self.queryString = urlComponents.query!
171+
}
172+
159173
public mutating func updateSSLCredentials(sslCredentials: SSLCredentials) {
160174
self.sslCredentials = sslCredentials
161175
}

Tests/GirdersSwiftTests/swift/http/TestRequestGenerator.swift

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,43 @@ class TestMutableRequest: XCTestCase {
108108
XCTAssertNotNil(request.parameters)
109109
}
110110

111-
func testupdateHTTPHeaderFields() {
111+
func testQueryParametersAreProperlySetWhenURLQueryItemConfigurationIsUsed() {
112+
let queryParameters = [URLQueryItem(name: "token1", value: "token1"),
113+
URLQueryItem(name: "token2", value: "token2")]
114+
let request = mutableRequestWithQuery(queryParameters)
115+
XCTAssertTrue(request.queryString!.contains("token1=token1"))
116+
XCTAssertTrue(request.queryString!.contains("token2=token2"))
117+
}
118+
119+
func testQueryParametersAreSetWhenEqualKeysAreBeingUsed() {
120+
let queryParameters = [URLQueryItem(name: "token1", value: "token1"),
121+
URLQueryItem(name: "token1", value: "token2")]
122+
123+
let request = mutableRequestWithQuery(queryParameters)
124+
XCTAssertTrue(request.queryString!.contains("token1=token1"))
125+
XCTAssertTrue(request.queryString!.contains("token1=token2"))
126+
}
127+
128+
func testURLEscapeEncodingIsAppliedInQueryString() {
129+
let param1 = "New Parameter"
130+
let value1 = "Hello, world!"
131+
132+
let queryParameters = [URLQueryItem(name: param1, value: value1)]
133+
let request = mutableRequestWithQuery(queryParameters)
134+
XCTAssertEqual(request.queryString!,
135+
("\(param1.urlEncodedStringWithEncoding())=\(value1.urlEncodedStringWithEncoding())"))
136+
}
137+
138+
func testUpdateQueryParametersFromUnsupportedType() {
139+
var request = mockGenerator.generateRequest(withMethod: .GET)
140+
let queryParameters = ["param1=value1", "param2=value2"]
141+
142+
request.updateQueryParameters(parameters: queryParameters)
143+
144+
XCTAssertNil(request.queryString)
145+
}
146+
147+
func testUpdateHTTPHeaderFields() {
112148
var request = mockGenerator.request(withMethod: .POST) |> mockGenerator.withBasicAuth |> mockGenerator.withJsonSupport
113149

114150
XCTAssertEqual(request.headerFields["Accept"], "application/json")
@@ -120,4 +156,13 @@ class TestMutableRequest: XCTestCase {
120156

121157
XCTAssertNotNil(request.headerFields["Test1"])
122158
}
159+
160+
// MARK: - Private
161+
162+
private func mutableRequestWithQuery(_ params: Any) -> MutableRequest {
163+
var request = mockGenerator.generateRequest(withMethod: .GET)
164+
request.updateQueryParameters(parameters: params)
165+
return request
166+
}
167+
123168
}

0 commit comments

Comments
 (0)