diff --git a/Libraries/Sources/APIService/Use Cases/MakeURLRequestUseCase.swift b/Libraries/Sources/APIService/Use Cases/MakeURLRequestUseCase.swift new file mode 100644 index 0000000..f0febbe --- /dev/null +++ b/Libraries/Sources/APIService/Use Cases/MakeURLRequestUseCase.swift @@ -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 +} diff --git a/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeURLRequestUseCaseTests.swift b/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeURLRequestUseCaseTests.swift new file mode 100644 index 0000000..fa6b62c --- /dev/null +++ b/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeURLRequestUseCaseTests.swift @@ -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) + } + +}