diff --git a/Sources/Communications/Use Cases/MakeURLRequestUseCase.swift b/Sources/Communications/Use Cases/MakeURLRequestUseCase.swift index 7bc7649..099fec1 100644 --- a/Sources/Communications/Use Cases/MakeURLRequestUseCase.swift +++ b/Sources/Communications/Use Cases/MakeURLRequestUseCase.swift @@ -35,6 +35,12 @@ public struct MakeURLRequestUseCase { urlComponents.port = port } + if !endpoint.parameters.isEmpty { + urlComponents.queryItems = endpoint.parameters + .map(URLQueryItem.init) + .sorted(by: { $0.name < $1.name }) + } + guard let url = urlComponents.url else { throw MakeURLRequestError.urlNotCreated } diff --git a/Tests/Communications/Use Cases/MakeURLRequestUseCaseTests.swift b/Tests/Communications/Use Cases/MakeURLRequestUseCaseTests.swift index 6f8cf7c..7499bb1 100644 --- a/Tests/Communications/Use Cases/MakeURLRequestUseCaseTests.swift +++ b/Tests/Communications/Use Cases/MakeURLRequestUseCaseTests.swift @@ -52,6 +52,25 @@ final class MakeURLRequestUseCaseTests: XCTestCase { XCTAssertNil(result.httpBody) } + func test_withEndpoint_initialisedWithParameters() throws { + // GIVEN + let endpoint = TestEndpoint(parameters: [ + "someParameter": "someValue", + "anotherParameter": nil, + "otherParameter": "yetAnotherValue" + ]) + + // WHEN + let result = try makeURLRequest(endpoint: endpoint) + + // THEN + XCTAssertNotNil(result) + XCTAssertEqual(result.url?.absoluteString, "http://www.something.com/path/to/endpoint?anotherParameter&otherParameter=yetAnotherValue&someParameter=someValue") + XCTAssertEqual(result.httpMethod, HTTPRequestMethod.get.rawValue) + XCTAssertEqual(result.allHTTPHeaderFields, [:]) + XCTAssertNil(result.httpBody) + } + func test_withEndpoint_initialisedWithHeaders() throws { // GIVEN let endpoint = TestEndpoint(headers: [ @@ -100,23 +119,25 @@ private struct TestEndpoint: Endpoint { let scheme: String = "http" let host: String = "www.something.com" + let port: Int? let path: String = "/path/to/endpoint" + let parameters: Parameters let method: HTTPRequestMethod = .get - - var port: Int? - var headers: [String : String] - var body: Data? + let headers: Headers + let body: Data? // MARK: Initialisers init( port: Int? = nil, - headers: [String : String] = [:], + parameters: Parameters = [:], + headers: Headers = [:], body: Data? = nil ) { self.port = port - self.body = body + self.parameters = parameters self.headers = headers + self.body = body } }