[Feature] Client #3
@ -15,10 +15,10 @@ final class AmiiboClientTests: XCTestCase {
|
||||
|
||||
return configuration
|
||||
}()
|
||||
private let makeURLRequest = MakeURLRequestUseCase()
|
||||
private let endpoint = TestEndpoint()
|
||||
|
||||
private var client: AmiiboClient!
|
||||
private var request: MockURLRequest!
|
||||
private var response: MockURLResponse!
|
||||
|
||||
// MARK: Setup
|
||||
|
||||
@ -32,11 +32,114 @@ final class AmiiboClientTests: XCTestCase {
|
||||
|
||||
// MARK: Tests
|
||||
|
||||
func test_withSomething() async throws {
|
||||
func test_request_withEndpointAndModel_whenDataDoesMatchModel() async throws {
|
||||
// GIVEN
|
||||
let url = try XCTUnwrap(try makeURLRequest(endpoint: endpoint).url)
|
||||
|
||||
MockURLProtocol.mockData[.init(url: url)] = .init(
|
||||
status: .ok,
|
||||
data: .Seed.dataWithoutTimestamp
|
||||
)
|
||||
|
||||
// WHEN
|
||||
let model = try await client.request(
|
||||
endpoint: endpoint,
|
||||
as: TestModel.self
|
||||
)
|
||||
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
10
Tests/Helpers/Data+Seed.swift
Normal file
10
Tests/Helpers/Data+Seed.swift
Normal 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)
|
||||
}
|
||||
}
|
12
Tests/Helpers/MockURLRequest+Init.swift
Normal file
12
Tests/Helpers/MockURLRequest+Init.swift
Normal file
@ -0,0 +1,12 @@
|
||||
import Communications
|
||||
import Foundation
|
||||
|
||||
extension MockURLRequest {
|
||||
|
||||
// MARK: Initialisers
|
||||
|
||||
init(url: URL) {
|
||||
self.init(method: .get, url: url)
|
||||
}
|
||||
|
||||
}
|
17
Tests/Helpers/TestEndpoint.swift
Normal file
17
Tests/Helpers/TestEndpoint.swift
Normal 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
|
||||
|
||||
}
|
5
Tests/Helpers/TestModel.swift
Normal file
5
Tests/Helpers/TestModel.swift
Normal file
@ -0,0 +1,5 @@
|
||||
import Foundation
|
||||
|
||||
struct TestModel: Decodable {
|
||||
let timestamp: Date?
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user