Skip to content

Commit

Permalink
Extend test coverage, update mock transport
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonHLawrence committed Jan 23, 2024
1 parent 2b7407c commit 7a3d9e7
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
8 changes: 6 additions & 2 deletions Sources/SimpleRESTClient/MockTransport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
Expand Down
35 changes: 35 additions & 0 deletions Tests/SimpleRESTClientTests/APIClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
}
}
}
}

0 comments on commit 7a3d9e7

Please sign in to comment.