[Feature] Client #3

Merged
javier merged 7 commits from feature/client into main 2023-04-19 14:33:49 +00:00
5 changed files with 151 additions and 4 deletions
Showing only changes of commit 9a08825ee8 - Show all commits

View File

@ -15,10 +15,10 @@ final class AmiiboClientTests: XCTestCase {
return configuration return configuration
}() }()
private let makeURLRequest = MakeURLRequestUseCase()
private let endpoint = TestEndpoint()
private var client: AmiiboClient! private var client: AmiiboClient!
private var request: MockURLRequest!
private var response: MockURLResponse!
// MARK: Setup // MARK: Setup
@ -32,11 +32,114 @@ final class AmiiboClientTests: XCTestCase {
// MARK: Tests // MARK: Tests
func test_withSomething() async throws { func test_request_withEndpointAndModel_whenDataDoesMatchModel() async throws {
// GIVEN // GIVEN
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
MockURLProtocol.mockData[.init(url: url)] = .init(
status: .ok,
data: .Seed.dataWithoutTimestamp
)
// WHEN // WHEN
let model = try await client.request(
endpoint: endpoint,
as: TestModel.self
)
// THEN // THEN
XCTFail("Not implemented yet") XCTAssertNotNil(model)
XCTAssertNil(model.timestamp)
}
func test_request_withEndpointAndModel_whenDataDoesMatchModel_andDateDecodingStrategy() async throws {
// GIVEN
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
MockURLProtocol.mockData[.init(url: url)] = .init(
status: .ok,
data: .Seed.dataWithDateAndTime
)
client.setDateDecodingStrategy(.formatted(.dateAndTime))
// WHEN
let model = try await client.request(
endpoint: endpoint,
as: TestModel.self
)
// THEN
XCTAssertNotNil(model)
XCTAssertNotNil(model.timestamp)
}
func test_request_withEndpointAndModel_whenDataDoesNotMatchModel() async throws {
// GIVEN
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
MockURLProtocol.mockData[.init(url: url)] = .init(
status: .ok,
data: .Seed.dataUnrelated
)
// WHEN & THEN
do {
let _ = try await client.request(
endpoint: endpoint,
as: TestModel.self
)
} catch is DecodingError {
XCTAssertTrue(true)
} catch {
XCTAssertTrue(false)
}
}
func test_request_withEndpointAndModel_whenDateDecodingStrategyNotCorrectlySet() async throws {
// GIVEN
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
MockURLProtocol.mockData[.init(url: url)] = .init(
status: .ok,
data: .Seed.dataWithDateAndTime
)
client.setDateDecodingStrategy(.formatted(.dateOnly))
// WHEN & THEN
do {
let _ = try await client.request(
endpoint: endpoint,
as: TestModel.self
)
} catch is DecodingError {
XCTAssertTrue(true)
} catch {
XCTAssertTrue(false)
}
}
func test_request_withEndpointAndModel_whenResponseCodeIsNotOK() async throws {
// GIVEN
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
MockURLProtocol.mockData[.init(url: url)] = .init(
status: .notFound,
data: .Seed.dataWithoutTimestamp
)
// WHEN & THEN
do {
let _ = try await client.request(
endpoint: endpoint,
as: TestModel.self
)
} catch is AmiiboClientError {
XCTAssertTrue(true)
} catch {
XCTAssertTrue(false)
}
} }
} }

View File

@ -0,0 +1,10 @@
import Foundation
extension Data {
enum Seed {
static let dataUnrelated = "{\"something\":\"Something goes in here...\"}".data(using: .utf8)
static let dataWithoutTimestamp = "{\"timestamp\":null}".data(using: .utf8)
static let dataWithDateOnly = "{\"timestamp\":\"2023-03-23\"}".data(using: .utf8)
static let dataWithDateAndTime = "{\"timestamp\":\"2023-03-23T13:11:20.382254\"}".data(using: .utf8)
}
}

View File

@ -0,0 +1,12 @@
import Communications
import Foundation
extension MockURLRequest {
// MARK: Initialisers
init(url: URL) {
self.init(method: .get, url: url)
}
}

View File

@ -0,0 +1,17 @@
import Communications
import Foundation
struct TestEndpoint: Endpoint {
// MARK: Properties
let scheme: String = "http"
let host: String = "www.something.com"
let port: Int? = nil
let path: String = "/path/to/endpoint"
let parameters: Parameters = [:]
let method: HTTPRequestMethod = .get
let headers: [String : String] = [:]
let body: Data? = nil
}

View File

@ -0,0 +1,5 @@
import Foundation
struct TestModel: Decodable {
let timestamp: Date?
}