diff --git a/Tests/MicroClientTests/Doubles/URLSessionMock.swift b/Tests/MicroClientTests/Doubles/URLSessionMock.swift index 46b493a..deab09a 100644 --- a/Tests/MicroClientTests/Doubles/URLSessionMock.swift +++ b/Tests/MicroClientTests/Doubles/URLSessionMock.swift @@ -3,10 +3,15 @@ import Foundation @testable import MicroClient final class URLSessionMock: URLSessionProtocol { - var dataToReturn: Data = Data() - var responseToReturn: URLResponse = URLResponse() - var errorToThrow: Error? - var lastRequest: URLRequest? + + // MARK: - Properties + + private(set) var lastRequest: URLRequest? + private var stubbedDataToReturn: Data = Data() + private var stubbedResponseToReturn: URLResponse = URLResponse() + private var stubbedErrorToThrow: Error? + + // MARK: - Public func data( for request: URLRequest, @@ -14,10 +19,27 @@ final class URLSessionMock: URLSessionProtocol { ) async throws -> (Data, URLResponse) { lastRequest = request - if let error = errorToThrow { + if let error = stubbedErrorToThrow { throw error } - return (dataToReturn, responseToReturn) + return (stubbedDataToReturn, stubbedResponseToReturn) + } +} + +// MARK: - Stub + +extension URLSessionMock { + + func stubDataToReturn( + data: Data, + response: URLResponse + ) { + stubbedDataToReturn = data + stubbedResponseToReturn = response + } + + func stubDataToThrow(error: Error?) { + stubbedErrorToThrow = error } } diff --git a/Tests/MicroClientTests/Fixtures/NetworkClientMother.swift b/Tests/MicroClientTests/Fixtures/NetworkClientMother.swift index bb12031..e8dec69 100644 --- a/Tests/MicroClientTests/Fixtures/NetworkClientMother.swift +++ b/Tests/MicroClientTests/Fixtures/NetworkClientMother.swift @@ -40,33 +40,6 @@ enum NetworkClientMother { )! } - static func makeErrorResponse( - for url: URL, - statusCode: Int = 500, - httpVersion: String = "HTTP/1.1", - headerFields: [String: String]? = ["Content-Type": "application/json"] - ) -> HTTPURLResponse { - HTTPURLResponse( - url: url, - statusCode: statusCode, - httpVersion: httpVersion, - headerFields: headerFields - )! - } - - static func makeNotFoundResponse( - for url: URL, - httpVersion: String = "HTTP/1.1", - headerFields: [String: String]? = ["Content-Type": "application/json"] - ) -> HTTPURLResponse { - HTTPURLResponse( - url: url, - statusCode: 404, - httpVersion: httpVersion, - headerFields: headerFields - )! - } - static func makeNetworkConfiguration( session: URLSessionProtocol = URLSessionMock(), baseURL: URL = URL(string: "https://api.example.com")!, diff --git a/Tests/MicroClientTests/Fixtures/TestModelMother.swift b/Tests/MicroClientTests/Fixtures/TestModelMother.swift index e40f500..23bcfa5 100644 --- a/Tests/MicroClientTests/Fixtures/TestModelMother.swift +++ b/Tests/MicroClientTests/Fixtures/TestModelMother.swift @@ -87,18 +87,6 @@ enum TestModelMother { ) } - static func makeTestResponseModel( - success: Bool = true, - message: String = "Success", - data: TestResponseModel.TestData? = makeTestData() - ) -> TestResponseModel { - TestResponseModel( - success: success, - message: message, - data: data - ) - } - static func makeSuccessfulResponseModel( message: String = "Created successfully" ) -> TestResponseModel { @@ -109,22 +97,6 @@ enum TestModelMother { ) } - static func makeFailedResponseModel( - message: String = "Operation failed" - ) -> TestResponseModel { - TestResponseModel( - success: false, - message: message, - data: nil - ) - } - - static func makeTestData( - value: String = "test" - ) -> TestResponseModel.TestData { - TestResponseModel.TestData(value: value) - } - // MARK: - NetworkRequest Models static func makeNetworkRequestTestModel( @@ -137,16 +109,6 @@ enum TestModelMother { ) } - static func makeNetworkRequestResponseModel( - success: Bool = true, - message: String = "Success" - ) -> NetworkRequestResponseModel { - NetworkRequestResponseModel( - success: success, - message: message - ) - } - // MARK: - Decoding Models static func makeDecodingTestModel( diff --git a/Tests/MicroClientTests/NetworkClientErrorHandlingTests.swift b/Tests/MicroClientTests/NetworkClientErrorHandlingTests.swift index 30606fc..dd3b6ec 100644 --- a/Tests/MicroClientTests/NetworkClientErrorHandlingTests.swift +++ b/Tests/MicroClientTests/NetworkClientErrorHandlingTests.swift @@ -16,8 +16,7 @@ struct NetworkClientErrorHandlingTests { let invalidJSON = Data("{ invalid json".utf8) let expectedURL = try #require(URL(string: "https://api.example.com/data")) - mockSession.dataToReturn = invalidJSON - mockSession.responseToReturn = try #require( + let response = try #require( HTTPURLResponse( url: expectedURL, statusCode: 200, @@ -25,6 +24,10 @@ struct NetworkClientErrorHandlingTests { headerFields: nil ) ) + mockSession.stubDataToReturn( + data: invalidJSON, + response: response + ) let request = NetworkRequest( path: "/data", diff --git a/Tests/MicroClientTests/NetworkClientStatusPublisherTests.swift b/Tests/MicroClientTests/NetworkClientStatusPublisherTests.swift index 2b603a9..b28225f 100644 --- a/Tests/MicroClientTests/NetworkClientStatusPublisherTests.swift +++ b/Tests/MicroClientTests/NetworkClientStatusPublisherTests.swift @@ -14,8 +14,10 @@ struct NetworkClientStatusPublisherTests { session: mockSession ) - mockSession.dataToReturn = Data() - mockSession.responseToReturn = URLResponse() + mockSession.stubDataToReturn( + data: Data(), + response: URLResponse() + ) var statusUpdates: [NetworkClientStatus] = [] @@ -56,7 +58,7 @@ struct NetworkClientStatusPublisherTests { session: mockSession ) - mockSession.errorToThrow = URLError(.networkConnectionLost) + mockSession.stubDataToThrow(error: URLError(.networkConnectionLost)) var statusUpdates: [NetworkClientStatus] = [] diff --git a/Tests/MicroClientTests/NetworkClientTests.swift b/Tests/MicroClientTests/NetworkClientTests.swift index 2066aa1..441a975 100644 --- a/Tests/MicroClientTests/NetworkClientTests.swift +++ b/Tests/MicroClientTests/NetworkClientTests.swift @@ -15,9 +15,12 @@ struct NetworkClientTests { ) let expectedURL = try #require(URL(string: "https://api.example.com/ping")) - mockSession.dataToReturn = Data() - mockSession.responseToReturn = NetworkClientMother.makeSuccessResponse( - for: expectedURL + + mockSession.stubDataToReturn( + data: Data(), + response: NetworkClientMother.makeSuccessResponse( + for: expectedURL + ) ) let request = NetworkRequest( @@ -28,7 +31,7 @@ struct NetworkClientTests { let response = try await client.run(request) #expect( - response.value != nil, + type(of: response.value) == VoidResponse.self, "It should return VoidResponse" ) #expect( @@ -53,10 +56,12 @@ struct NetworkClientTests { """.utf8) let expectedURL = try #require(URL(string: "https://api.example.com/users")) - mockSession.dataToReturn = responseData - mockSession.responseToReturn = NetworkClientMother.makeSuccessResponse( - for: expectedURL, - statusCode: 201 + mockSession.stubDataToReturn( + data: responseData, + response: NetworkClientMother.makeSuccessResponse( + for: expectedURL, + statusCode: 201 + ) ) let requestBody = TestModelMother.makeTestRequestModel() @@ -92,7 +97,7 @@ struct NetworkClientTests { ) let networkError = URLError(.notConnectedToInternet) - mockSession.errorToThrow = networkError + mockSession.stubDataToThrow(error: networkError) let request = NetworkRequest( path: "/test", @@ -118,9 +123,11 @@ struct NetworkClientTests { ) let expectedURL = try #require(URL(string: "https://api.example.com/protected")) - mockSession.dataToReturn = Data() - mockSession.responseToReturn = NetworkClientMother.makeSuccessResponse( - for: expectedURL + mockSession.stubDataToReturn( + data: Data(), + response: NetworkClientMother.makeSuccessResponse( + for: expectedURL + ) ) let request = NetworkRequest( @@ -152,9 +159,11 @@ struct NetworkClientTests { ) let expectedURL = try #require(URL(string: "https://api.example.com/search?q=swift&limit=10")) - mockSession.dataToReturn = Data() - mockSession.responseToReturn = NetworkClientMother.makeSuccessResponse( - for: expectedURL + mockSession.stubDataToReturn( + data: Data(), + response: NetworkClientMother.makeSuccessResponse( + for: expectedURL + ) ) let request = NetworkRequest( @@ -200,9 +209,11 @@ struct NetworkClientTests { let client = NetworkClient(configuration: configuration) let expectedURL = try #require(URL(string: "https://api.example.com/data")) - mockSession.dataToReturn = Data() - mockSession.responseToReturn = NetworkClientMother.makeSuccessResponse( - for: expectedURL + mockSession.stubDataToReturn( + data: Data(), + response: NetworkClientMother.makeSuccessResponse( + for: expectedURL + ) ) let request = NetworkRequest( diff --git a/Tests/MicroClientTests/NetworkResponseComplexModelsTests.swift b/Tests/MicroClientTests/NetworkResponseComplexModelsTests.swift index 618846a..f2fd1d0 100644 --- a/Tests/MicroClientTests/NetworkResponseComplexModelsTests.swift +++ b/Tests/MicroClientTests/NetworkResponseComplexModelsTests.swift @@ -34,7 +34,6 @@ struct NetworkResponseComplexModelsTests { networkResponse.response === httpResponse, "It should store the HTTPURLResponse" ) - if let httpUrlResponse = networkResponse.response as? HTTPURLResponse { #expect( httpUrlResponse.statusCode == 201, @@ -44,6 +43,10 @@ struct NetworkResponseComplexModelsTests { httpUrlResponse.allHeaderFields["Location"] as? String == "/api/complex/\(complexModel.id)", "It should preserve HTTP headers for complex models" ) + #expect( + httpResponse.location?.absoluteString == "/api/complex/\(complexModel.id)", + "It should preserve HTTP headers for complex models" + ) } } }