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