Implemented the MakeURLRequestUseCase use case.

This commit is contained in:
Javier Cicchelli 2022-12-04 04:29:50 +01:00
parent 47a8db48ff
commit a894a9de47
2 changed files with 204 additions and 0 deletions

View File

@ -0,0 +1,36 @@
//
// MakeURLRequestUseCase.swift
// APIService
//
// Created by Javier Cicchelli on 04/12/2022.
// Copyright © 2022 Röck+Cöde. All rights reserved.
//
import Foundation
struct MakeURLRequestUseCase {
func callAsFunction(endpoint: some Endpoint) throws -> URLRequest {
var urlComponents = URLComponents()
urlComponents.scheme = endpoint.scheme
urlComponents.host = endpoint.host
urlComponents.port = endpoint.port
urlComponents.path = endpoint.path
guard let url = urlComponents.url else { throw MakeURLRequestError.urlNotCreated }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = endpoint.method.rawValue
urlRequest.httpBody = endpoint.body
urlRequest.allHTTPHeaderFields = endpoint.authorizationHeader.merging(endpoint.headers) { first, _ in first }
return urlRequest
}
}
// MARK: - Errors
enum MakeURLRequestError: Error {
case urlNotCreated
}

View File

@ -0,0 +1,168 @@
//
// MakeURLRequestUseCaseTests.swift
// APIServiceTests
//
// Created by Javier Cicchelli on 04/12/2022.
// Copyright © 2022 Röck+Cöde. All rights reserved.
//
import Foundation
import XCTest
@testable import APIService
final class MakeURLRequestUseCaseTests: XCTestCase {
// MARK: Properties
private let makeURLRequest = MakeURLRequestUseCase()
private var result: URLRequest!
// MARK: Test cases
func test_withGetMeEndpoint() throws {
// GIVEN
let endpoint = GetMeEndpoint(
username: "username",
password: "password"
)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/me")
XCTAssertEqual(result.httpMethod, "GET")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.contentType: .Header.Values.contentTypeJSON,
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNil(result.httpBody)
}
func test_withGetItemsEndpoint() throws {
// GIVEN
let itemId = UUID().uuidString
let endpoint = GetItemsEndpoint(
itemId: itemId,
username: "username",
password: "password"
)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/items/\(itemId)")
XCTAssertEqual(result.httpMethod, "GET")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.contentType: .Header.Values.contentTypeJSON,
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNil(result.httpBody)
}
func test_withUploadFileEndpoint() throws {
// GIVEN
let itemId = UUID().uuidString
let fileName = "some-file-name.txt"
let fileData = "This is just a line of text to make some test data".data(using: .utf8)!
let endpoint = UploadFileEndpoint(
itemId: itemId,
fileName: fileName,
fileData: fileData,
username: "username",
password: "password"
)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/items/\(itemId)")
XCTAssertEqual(result.httpMethod, "POST")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.contentType: .Header.Values.contentTypeOctet,
.Header.Keys.contentDisposition: "attachment;filename*=utf-8''\(fileName)",
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNotNil(result.httpBody)
XCTAssertEqual(result.httpBody, fileData)
}
func test_withCreateFolderEndpoint() throws {
// GIVEN
let itemId = UUID().uuidString
let folderName = "some-folder-name"
let endpoint = CreateFolderEndpoint(
itemId: itemId,
folderName: folderName,
username: "username",
password: "password"
)
let body = "{\"name\":\"\(folderName)\"}".data(using: .utf8)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/items/\(itemId)")
XCTAssertEqual(result.httpMethod, "POST")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.contentType: .Header.Values.contentTypeJSON,
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNotNil(result.httpBody)
XCTAssertEqual(result.httpBody, body)
}
func test_withDeleteItemEndpoint() throws {
// GIVEN
let itemId = UUID().uuidString
let endpoint = DeleteItemEndpoint(
itemId: itemId,
username: "username",
password: "password"
)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/items/\(itemId)")
XCTAssertEqual(result.httpMethod, "DELETE")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNil(result.httpBody)
}
func test_withGetDataEndpoint() throws {
// GIVEN
let itemId = UUID().uuidString
let endpoint = GetDataEndpoint(
itemId: itemId,
username: "username",
password: "password"
)
// WHEN
result = try makeURLRequest(endpoint: endpoint)
// THEN
XCTAssertNotNil(result)
XCTAssertEqual(result.url?.absoluteString, "http://163.172.147.216:8080/items/\(itemId)/data")
XCTAssertEqual(result.httpMethod, "GET")
XCTAssertEqual(result.allHTTPHeaderFields, [
.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
])
XCTAssertNil(result.httpBody)
}
}