From c6c544750035715ed5b3e59992803e3355c8525e Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 4 Dec 2022 01:13:35 +0100 Subject: [PATCH] Implemented the MakeAuthorizationHeaderUseCase use case. --- Libraries/Package.swift | 1 + .../MakeAuthorizationHeaderUseCase.swift | 46 ++++++++++++ .../MakeAuthorizationHeaderUseCaseTests.swift | 73 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 Libraries/Sources/APIService/Use Cases/MakeAuthorizationHeaderUseCase.swift create mode 100644 Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeAuthorizationHeaderUseCaseTests.swift diff --git a/Libraries/Package.swift b/Libraries/Package.swift index 902fb07..99713d6 100644 --- a/Libraries/Package.swift +++ b/Libraries/Package.swift @@ -4,6 +4,7 @@ import PackageDescription let package = Package( name: "Libraries", + platforms: [.iOS(.v15)], products: [ .library( name: "Libraries", diff --git a/Libraries/Sources/APIService/Use Cases/MakeAuthorizationHeaderUseCase.swift b/Libraries/Sources/APIService/Use Cases/MakeAuthorizationHeaderUseCase.swift new file mode 100644 index 0000000..20b3080 --- /dev/null +++ b/Libraries/Sources/APIService/Use Cases/MakeAuthorizationHeaderUseCase.swift @@ -0,0 +1,46 @@ +// +// MakeAuthorizationHeaderUseCase.swift +// APIService +// +// Created by Javier Cicchelli on 04/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import Foundation + +struct MakeAuthorizationHeaderUseCase { + func callAsFunction( + username: String, + password: String + ) throws -> [String: String] { + guard !username.isEmpty else { throw MakeAuthorizationHeaderError.usernameIsEmpty } + guard !password.isEmpty else { throw MakeAuthorizationHeaderError.passwordIsEmpty } + + let loginString = String(format: .Formats.usernameAndPassword, username, password) + + guard let loginData = loginString.data(using: .utf8) else { + throw MakeAuthorizationHeaderError.loginDataNotCreated + } + + let loginBase64 = loginData.base64EncodedString() + + return [.Header.Keys.authorization: String(format: .Formats.authorizationValue, loginBase64)] + } +} + +// MARK: - Errors + +enum MakeAuthorizationHeaderError: Error { + case usernameIsEmpty + case passwordIsEmpty + case loginDataNotCreated +} + +// MARK: - String+Formats + +private extension String { + enum Formats { + static let usernameAndPassword = "%@:%@" + static let authorizationValue = "Basic %@" + } +} diff --git a/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeAuthorizationHeaderUseCaseTests.swift b/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeAuthorizationHeaderUseCaseTests.swift new file mode 100644 index 0000000..f4d7b33 --- /dev/null +++ b/Libraries/Tests/APIServiceTests/Cases/Use Cases/MakeAuthorizationHeaderUseCaseTests.swift @@ -0,0 +1,73 @@ +// +// MakeAuthorizationHeaderUseCaseTests.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 MakeAuthorizationHeaderUseCaseTests: XCTestCase { + + // MARK: Properties + + let makeAuthHeader = MakeAuthorizationHeaderUseCase() + + var username: String! + var password: String! + + var result: [String: String]! + + // MARK: Test cases + + func test_withCorrectUsernameAndPassword() throws { + // GIVEN + username = "username" + password = "password" + + // WHEN + + result = try makeAuthHeader(username: username, password: password) + + // THEN + XCTAssertEqual(result.count, 1) + XCTAssertEqual(result[.Header.Keys.authorization], "Basic dXNlcm5hbWU6cGFzc3dvcmQ=") + } + + func test_withEmptyUsername() throws { + // GIVEN + username = "" + password = "password" + + // WHEN & THEN + XCTAssertThrowsError(try makeAuthHeader(username: username, password: password)) { error in + XCTAssertEqual(error as? MakeAuthorizationHeaderError, .usernameIsEmpty) + } + } + + func test_withEmptyPassword() throws { + // GIVEN + username = "username" + password = "" + + // WHEN & THEN + XCTAssertThrowsError(try makeAuthHeader(username: username, password: password)) { error in + XCTAssertEqual(error as? MakeAuthorizationHeaderError, .passwordIsEmpty) + } + } + + func test_withEmptyUsernameAndPassword() throws { + // GIVEN + username = "" + password = "" + + // WHEN & THEN + XCTAssertThrowsError(try makeAuthHeader(username: username, password: password)) { error in + XCTAssertEqual(error as? MakeAuthorizationHeaderError, .usernameIsEmpty) + } + } + +}