diff --git a/Sources/SimpleRESTClient/MockTransport.swift b/Sources/SimpleRESTClient/MockTransport.swift index 790439e..5be6a63 100644 --- a/Sources/SimpleRESTClient/MockTransport.swift +++ b/Sources/SimpleRESTClient/MockTransport.swift @@ -49,14 +49,16 @@ public struct ExpectedRequest { /// Mock implementation of ``Transport`` for unit testing. open class MockTransport: Transport { + open var clearExpectationsOnSatisfy: Bool open var environment: Environment open var requestProcessors: [RequestProcessor] open var expectedRequests: [ExpectedRequest] = [] open var receivedRequests: [URLRequest] = [] - public init(environment: Environment, requestProcessors: [RequestProcessor] = []) { + public init(environment: Environment, requestProcessors: [RequestProcessor] = [], clearExpectationsOnSatisfy: Bool = true) { self.environment = environment self.requestProcessors = requestProcessors + self.clearExpectationsOnSatisfy = clearExpectationsOnSatisfy } /// Add an expected request and its associated response. @@ -86,7 +88,9 @@ open class MockTransport: Transport { guard expectedStatusCodes.contains(response.statusCode) else { throw HTTPError(code: response.statusCode) } - expectedRequests.remove(at: index) + if clearExpectationsOnSatisfy { + expectedRequests.remove(at: index) + } return response.body } throw HTTPError(code: 400) diff --git a/Tests/SimpleRESTClientTests/APIClientTests.swift b/Tests/SimpleRESTClientTests/APIClientTests.swift index 21e2b6d..0b5f9b4 100644 --- a/Tests/SimpleRESTClientTests/APIClientTests.swift +++ b/Tests/SimpleRESTClientTests/APIClientTests.swift @@ -29,6 +29,10 @@ final class APIClientTests: XCTestCase { return thisDirectory.appendingPathComponent("Data", isDirectory: true) }() + override func setUp() async throws { + transport.clear() + } + func testDeleteWithResponse() async throws { guard let deleteResponse = MockResponse(statusCode: 200, filename: "DeleteResponse", sourceFolder: sourceFolder) else { @@ -42,4 +46,35 @@ final class APIClientTests: XCTestCase { XCTAssertEqual(result.errors.first, "No worries.") XCTAssertTrue(transport.allExpectedRequestsReceived) } + + func testGet() async throws { + + let usersResponse = UsersResponse(page: 1, perPage: 10, total: 2, totalPages: 1, users: [ + User(id: 1, email: "jane.doe@gmail.com", firstName: "Jane", lastName: "Doe", avatar: URL(string: "https://www.google.com")!), + User(id: 2, email: "nitin.sawhney@gmail.com", firstName: "Nitin", lastName: "Sawhney", avatar: URL(string: "https://www.google.com")!)]) + let jsonEncoder = DefaultAPICoding().makeEncoder() + let encodedResponse = (try? jsonEncoder.encode(usersResponse)) ?? Data() + let usersRequest = ExpectedRequest(url: "https://reqres.in/api/users/?page=1", method: "GET", response: MockResponse(statusCode: 200, body: encodedResponse)) + transport.expect(usersRequest) + let result: UsersResponse = try await apiClient.get(endpoint: ReqResEndpoint.users(page: 1)) + XCTAssert(result.users.count == 2) + } + + func testGetWith404() async throws { + + let usersRequest = ExpectedRequest(url: "https://reqres.in/api/users/?page=1", + method: "GET", + response: MockResponse(statusCode: 404, body: Data())) + transport.expect(usersRequest) + do { + let result: UsersResponse = try await apiClient.get(endpoint: ReqResEndpoint.users(page: 1)) + print(result) + XCTFail() + } catch { + XCTAssertTrue(error is HTTPError) + if let httpError = error as? HTTPError { + XCTAssertEqual(httpError.code, 404) + } + } + } }