From bfb47ea0f88971d67adc33d95d3199dfe63bc5d3 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 4 Dec 2022 01:41:32 +0100 Subject: [PATCH] Implemented the GetMeEndpoint endpoint. --- .../APIService/Endpoints/GetMeEndpoint.swift | 33 ++++++++++ .../Extensions/String+Headers.swift | 20 ++++++ .../APIService/Extensions/String+Hosts.swift | 13 ++++ .../Extensions/String+Schemes.swift | 13 ++++ .../APIService/Protocols/Endpoint.swift | 4 +- .../Endpoints/GetMeEndpoint+InitTests.swift | 63 +++++++++++++++++++ 6 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 Libraries/Sources/APIService/Endpoints/GetMeEndpoint.swift create mode 100644 Libraries/Sources/APIService/Extensions/String+Headers.swift create mode 100644 Libraries/Sources/APIService/Extensions/String+Hosts.swift create mode 100644 Libraries/Sources/APIService/Extensions/String+Schemes.swift create mode 100644 Libraries/Tests/APIServiceTests/Cases/Endpoints/GetMeEndpoint+InitTests.swift diff --git a/Libraries/Sources/APIService/Endpoints/GetMeEndpoint.swift b/Libraries/Sources/APIService/Endpoints/GetMeEndpoint.swift new file mode 100644 index 0000000..c2ff363 --- /dev/null +++ b/Libraries/Sources/APIService/Endpoints/GetMeEndpoint.swift @@ -0,0 +1,33 @@ +// +// GetMeEndpoint.swift +// APIService +// +// Created by Javier Cicchelli on 03/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +struct GetMeEndpoint: Endpoint { + let path: String + let method: RequestMethod + let credentials: BasicCredentials + let headers: [String : String] + let body: [String : String]? +} + +// MARK: - Initialisers + +extension GetMeEndpoint { + init( + username: String, + password: String + ) { + self.path = "/me" + self.method = .get + self.credentials = .init( + username: username, + password: password + ) + self.headers = [.Header.Keys.contentType: .Header.Values.contentTypeJSON] + self.body = nil + } +} diff --git a/Libraries/Sources/APIService/Extensions/String+Headers.swift b/Libraries/Sources/APIService/Extensions/String+Headers.swift new file mode 100644 index 0000000..f224c8a --- /dev/null +++ b/Libraries/Sources/APIService/Extensions/String+Headers.swift @@ -0,0 +1,20 @@ +// +// String+Headers.swift +// APIService +// +// Created by Javier Cicchelli on 03/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +extension String { + enum Header { + enum Keys { + static let authorization = "Authorization" + static let contentType = "Content-Type" + } + + enum Values { + static let contentTypeJSON = "application/json" + } + } +} diff --git a/Libraries/Sources/APIService/Extensions/String+Hosts.swift b/Libraries/Sources/APIService/Extensions/String+Hosts.swift new file mode 100644 index 0000000..5daa9c4 --- /dev/null +++ b/Libraries/Sources/APIService/Extensions/String+Hosts.swift @@ -0,0 +1,13 @@ +// +// String+Hosts.swift +// APIService +// +// Created by Javier Cicchelli on 04/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +extension String { + enum Hosts { + static let `default` = "163.172.147.216:8080" + } +} diff --git a/Libraries/Sources/APIService/Extensions/String+Schemes.swift b/Libraries/Sources/APIService/Extensions/String+Schemes.swift new file mode 100644 index 0000000..5f7063b --- /dev/null +++ b/Libraries/Sources/APIService/Extensions/String+Schemes.swift @@ -0,0 +1,13 @@ +// +// String+Schemes.swift +// APIService +// +// Created by Javier Cicchelli on 04/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +extension String { + enum Schemes { + static let http = "http" + } +} diff --git a/Libraries/Sources/APIService/Protocols/Endpoint.swift b/Libraries/Sources/APIService/Protocols/Endpoint.swift index 8834991..af12ed8 100644 --- a/Libraries/Sources/APIService/Protocols/Endpoint.swift +++ b/Libraries/Sources/APIService/Protocols/Endpoint.swift @@ -19,8 +19,8 @@ protocol Endpoint { // MARK: - Defaults extension Endpoint { - var scheme: String { "http" } - var host: String { "163.172.147.216:8080" } + var scheme: String { .Schemes.http } + var host: String { .Hosts.default } var authorizationHeader: [String: String] { let makeAuthHeader = MakeAuthorizationHeaderUseCase() diff --git a/Libraries/Tests/APIServiceTests/Cases/Endpoints/GetMeEndpoint+InitTests.swift b/Libraries/Tests/APIServiceTests/Cases/Endpoints/GetMeEndpoint+InitTests.swift new file mode 100644 index 0000000..9befdf0 --- /dev/null +++ b/Libraries/Tests/APIServiceTests/Cases/Endpoints/GetMeEndpoint+InitTests.swift @@ -0,0 +1,63 @@ +// +// GetMeEndpoint+InitTests.swift +// APIServiceTests +// +// Created by Javier Cicchelli on 04/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import XCTest + +@testable import APIService + +final class GetMeEndpointInitTests: XCTestCase { + + // MARK: Properties + + var endpoint: GetMeEndpoint! + var username: String! + var password: String! + + // MARK: Test cases + + func test_withProperUsernameAndPassword() throws { + // GIVEN + username = "username" + password = "password" + + // WHEN + endpoint = .init(username: username, password: password) + + // THEN + XCTAssertEqual(endpoint.scheme, .Schemes.http) + XCTAssertEqual(endpoint.host, .Hosts.default) + XCTAssertEqual(endpoint.path, "/me") + XCTAssertEqual(endpoint.method, .get) + 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="]) + XCTAssertNil(endpoint.body) + } + + func test_withEmptyUsernameOrPassword() async throws { + // GIVEN + username = "" + password = "password" + + // WHEN + endpoint = .init(username: username, password: password) + + // THEN + XCTAssertEqual(endpoint.scheme, .Schemes.http) + XCTAssertEqual(endpoint.host, .Hosts.default) + XCTAssertEqual(endpoint.path, "/me") + XCTAssertEqual(endpoint.method, .get) + XCTAssertEqual(endpoint.credentials.username, username) + XCTAssertEqual(endpoint.credentials.password, password) + XCTAssertEqual(endpoint.headers, [.Header.Keys.contentType: .Header.Values.contentTypeJSON]) + XCTAssertEqual(endpoint.authorizationHeader, [:]) + XCTAssertNil(endpoint.body) + } + +}