From a594e75712d2e2e5eea23928cc527ddc5c404dfa Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 4 Dec 2022 03:05:21 +0100 Subject: [PATCH] Implemented the CreateFolderEndpoint endpoint. --- .../Endpoints/CreateFolderEndpoint.swift | 54 +++++++++++++ .../CreateFolderEndpoint+InitTests.swift | 79 +++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 Libraries/Sources/APIService/Endpoints/CreateFolderEndpoint.swift create mode 100644 Libraries/Tests/APIServiceTests/Cases/Endpoints/CreateFolderEndpoint+InitTests.swift diff --git a/Libraries/Sources/APIService/Endpoints/CreateFolderEndpoint.swift b/Libraries/Sources/APIService/Endpoints/CreateFolderEndpoint.swift new file mode 100644 index 0000000..4aa5b3e --- /dev/null +++ b/Libraries/Sources/APIService/Endpoints/CreateFolderEndpoint.swift @@ -0,0 +1,54 @@ +// +// CreateFolderEndpoint.swift +// APIService +// +// Created by Javier Cicchelli on 04/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import Foundation + +struct CreateFolderEndpoint: Endpoint { + let path: String + let method: RequestMethod + let credentials: BasicCredentials + let headers: [String : String] + let body: Data? +} + +// MARK: - Initialisers + +extension CreateFolderEndpoint { + init( + itemId: String, + folderName: String, + username: String, + password: String + ) { + self.path = .init(format: .Formats.itemsWithId, itemId) + self.method = .post + self.credentials = .init( + username: username, + password: password + ) + self.headers = [.Header.Keys.contentType: .Header.Values.contentTypeJSON] + self.body = { + let encoder = JSONEncoder() + let folder = Folder(name: folderName) + + do { + return try encoder.encode(folder) + } catch { + return nil + } + }() + } +} + +// MARK: - Models + +private extension CreateFolderEndpoint { + struct Folder: Encodable { + let name: String + } +} diff --git a/Libraries/Tests/APIServiceTests/Cases/Endpoints/CreateFolderEndpoint+InitTests.swift b/Libraries/Tests/APIServiceTests/Cases/Endpoints/CreateFolderEndpoint+InitTests.swift new file mode 100644 index 0000000..11464f0 --- /dev/null +++ b/Libraries/Tests/APIServiceTests/Cases/Endpoints/CreateFolderEndpoint+InitTests.swift @@ -0,0 +1,79 @@ +// +// CreateFolderEndpoint+InitTests.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 CreateFolderEndpointInitTests: XCTestCase { + + // MARK: Properties + + let itemId = UUID().uuidString + + var endpoint: CreateFolderEndpoint! + var folderName: String! + var username: String! + var password: String! + + // MARK: Test cases + + func test_withItemId_someFolderName_andProperUsernameAndPassword() throws { + // GIVEN + folderName = "some-folder" + username = "username" + password = "password" + + // WHEN + endpoint = .init( + itemId: itemId, + folderName: folderName, + username: username, + password: password + ) + + // THEN + XCTAssertEqual(endpoint.scheme, .Schemes.http) + XCTAssertEqual(endpoint.host, .Hosts.default) + XCTAssertEqual(endpoint.path, "/items/\(itemId)") + XCTAssertEqual(endpoint.method, .post) + XCTAssertEqual(endpoint.credentials.username, username) + XCTAssertEqual(endpoint.credentials.password, password) + XCTAssertEqual(endpoint.headers, [.Header.Keys.contentType: .Header.Values.contentTypeJSON]) + XCTAssertEqual(endpoint.authorizationHeader, [.Header.Keys.authorization: "Basic dXNlcm5hbWU6cGFzc3dvcmQ="]) + XCTAssertEqual(endpoint.body, "{\"name\":\"some-folder\"}".data(using: .utf8)) + } + + func test_withItemId_someFolderName_andEmptyUsernameOrPassword() throws { + // GIVEN + folderName = "some-folder" + username = "" + password = "password" + + // WHEN + endpoint = .init( + itemId: itemId, + folderName: folderName, + username: username, + password: password + ) + + // THEN + XCTAssertEqual(endpoint.scheme, .Schemes.http) + XCTAssertEqual(endpoint.host, .Hosts.default) + XCTAssertEqual(endpoint.path, "/items/\(itemId)") + XCTAssertEqual(endpoint.method, .post) + XCTAssertEqual(endpoint.credentials.username, username) + XCTAssertEqual(endpoint.credentials.password, password) + XCTAssertEqual(endpoint.headers, [.Header.Keys.contentType: .Header.Values.contentTypeJSON]) + XCTAssertEqual(endpoint.authorizationHeader, [:]) + XCTAssertEqual(endpoint.body, "{\"name\":\"some-folder\"}".data(using: .utf8)) + } + +}