Implemented the AmiiboClient client and the AmiiboClientError error.

This commit is contained in:
Javier Cicchelli 2023-04-19 01:38:31 +02:00
parent ac9248b21d
commit 267083726b
3 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,66 @@
import Communications
import Foundation
struct AmiiboClient {
// MARK: Properties
private let session: URLSession
private let decoder = JSONDecoder()
private let makeURLRequest = MakeURLRequestUseCase()
// MARK: Initialisers
init(configuration: URLSessionConfiguration) {
session = .init(configuration: configuration)
}
// MARK: Functions
func setDateDecodingStrategy(_ dateDecodingStrategy: JSONDecoder.DateDecodingStrategy) {
decoder.dateDecodingStrategy = dateDecodingStrategy
}
}
// MARK: - Client
extension AmiiboClient: Client {
// MARK: Functions
func request<Model>(
endpoint: some Endpoint,
as model: Model.Type
) async throws -> Model where Model : Decodable {
let urlRequest = try makeURLRequest(endpoint: endpoint)
let (data, response) = try await session.data(for: urlRequest)
try check(response)
return try decoder.decode(model, from: data)
}
}
// MARK: - Helpers
private extension AmiiboClient {
// MARK: Functions
func check(_ response: URLResponse) throws {
guard
let urlResponse = response as? HTTPURLResponse,
let responseCode = HTTPResponseCode(rawValue: urlResponse.statusCode)
else {
throw AmiiboClientError.responseCodeNotFound
}
guard responseCode == .ok else {
throw AmiiboClientError.responseCode(responseCode.rawValue)
}
}
}

View File

@ -0,0 +1,4 @@
public enum AmiiboClientError: Error {
case responseCode(Int)
case responseCodeNotFound
}

View File

@ -0,0 +1,42 @@
import Communications
import Foundation
import XCTest
@testable import AmiiboService
final class AmiiboClientTests: XCTestCase {
// MARK: Properties
private let configuration: URLSessionConfiguration = {
let configuration = URLSessionConfiguration.ephemeral
configuration.protocolClasses = [MockURLProtocol.self]
return configuration
}()
private var client: AmiiboClient!
private var request: MockURLRequest!
private var response: MockURLResponse!
// MARK: Setup
override func setUp() async throws {
client = .init(configuration: configuration)
}
override func tearDown() async throws {
client = nil
}
// MARK: Tests
func test_withSomething() async throws {
// GIVEN
// WHEN
// THEN
XCTFail("Not implemented yet")
}
}