Implemented the AmiiboClient client and the AmiiboClientError error.
This commit is contained in:
parent
ac9248b21d
commit
267083726b
66
Sources/Clients/AmiiboClient.swift
Normal file
66
Sources/Clients/AmiiboClient.swift
Normal 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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
4
Sources/Errors/AmiiboClientError.swift
Normal file
4
Sources/Errors/AmiiboClientError.swift
Normal file
@ -0,0 +1,4 @@
|
||||
public enum AmiiboClientError: Error {
|
||||
case responseCode(Int)
|
||||
case responseCodeNotFound
|
||||
}
|
42
Tests/Clients/AmiiboClientTests.swift
Normal file
42
Tests/Clients/AmiiboClientTests.swift
Normal 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")
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user