diff --git a/Tests/Clients/AmiiboClientTests.swift b/Tests/Clients/AmiiboClientTests.swift index b143b72..1c20243 100644 --- a/Tests/Clients/AmiiboClientTests.swift +++ b/Tests/Clients/AmiiboClientTests.swift @@ -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) + } } } diff --git a/Tests/Helpers/Data+Seed.swift b/Tests/Helpers/Data+Seed.swift new file mode 100644 index 0000000..91b4c80 --- /dev/null +++ b/Tests/Helpers/Data+Seed.swift @@ -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) + } +} diff --git a/Tests/Helpers/MockURLRequest+Init.swift b/Tests/Helpers/MockURLRequest+Init.swift new file mode 100644 index 0000000..25d5abc --- /dev/null +++ b/Tests/Helpers/MockURLRequest+Init.swift @@ -0,0 +1,12 @@ +import Communications +import Foundation + +extension MockURLRequest { + + // MARK: Initialisers + + init(url: URL) { + self.init(method: .get, url: url) + } + +} diff --git a/Tests/Helpers/TestEndpoint.swift b/Tests/Helpers/TestEndpoint.swift new file mode 100644 index 0000000..c3f0755 --- /dev/null +++ b/Tests/Helpers/TestEndpoint.swift @@ -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 + +} diff --git a/Tests/Helpers/TestModel.swift b/Tests/Helpers/TestModel.swift new file mode 100644 index 0000000..c05a0f7 --- /dev/null +++ b/Tests/Helpers/TestModel.swift @@ -0,0 +1,5 @@ +import Foundation + +struct TestModel: Decodable { + let timestamp: Date? +}