Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions NetworkingTests/Webservice/WebserviceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,44 @@ final class WebserviceTests: XCTestCase {

waitForExpectations(timeout: 0.1, handler: nil)
}

struct CancelRequestBehavior: RequestBehavior {
func allowCompletion(data: Data?, response: URLResponse?, error: Error?) -> Bool {
return false
}

func after(completion result: Result<HTTPURLResponse, Error>) {
switch result {
case .success:
XCTFail("should not get called")
case .failure(let error):
if case Webservice.Error.cancelled = error {
print("request cancelled")
} else {
XCTFail("incorrect error")
}
}
}
}

func testCancelledBehavior() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is the test for a cancel request behaviour that returns true?


let sessionMock = URLSessionDataTaskLoaderFake(data: nil,
response: HTTPURLResponse(url: URL.fake(),
statusCode: 200,
httpVersion: nil,
headerFields: nil),
error: nil)

webservice = Webservice(baseURL: URL.fake(),
session: sessionMock,
defaultRequestBehavior: CancelRequestBehavior())

let resource = Resource<Empty, Empty>(endpoint: "/", decoder: EmptyDecoder())

webservice.load(resource) { _ in
XCTFail("completion should not get called")
}
}
}

14 changes: 12 additions & 2 deletions Sources/Webservice/Requests/RequestBehavior.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ public protocol RequestBehavior {
func modify(urlComponents: URLComponents) -> URLComponents
func modify(planned request: URLRequest) -> URLRequest
func before(sending request: URLRequest)

func modifyResponse(data: Data?, response: URLResponse?, error: Error?) -> (Data?, URLResponse?, Error?)
func allowCompletion(data: Data?, response: URLResponse?, error: Error?) -> Bool
func after(completion result: Result<HTTPURLResponse, Error>)

}

public extension RequestBehavior {
func modify(urlComponents: URLComponents) -> URLComponents { return urlComponents }
func modify(planned request: URLRequest) -> URLRequest { return request }
func before(sending: URLRequest) {}

func allowCompletion(data: Data?, response: URLResponse?, error: Error?) -> Bool { return true }
func modifyResponse(data: Data?, response: URLResponse?, error: Error?)
-> (Data?, URLResponse?, Error?) { return (data, response, error) }
func after(completion result: Result<HTTPURLResponse, Error>) {}
Expand Down Expand Up @@ -74,4 +75,13 @@ private struct CompoundRequestBehavior: RequestBehavior {
$0.after(completion: result)
}
}

func allowCompletion(data: Data?, response: URLResponse?, error: Error?) -> Bool {
for behaviour in behaviors {
if !behaviour.allowCompletion(data: data, response: response, error: error) {
return false
}
}
return true
}
}
7 changes: 7 additions & 0 deletions Sources/Webservice/Webservice.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public struct Webservice: ResourceRequestable {
public enum Error: Swift.Error {
case http(HTTP.StatusCode, Swift.Error?)
case unknown(Swift.Error?)
case cancelled
}

private let baseURL: URL
Expand Down Expand Up @@ -42,6 +43,12 @@ public struct Webservice: ResourceRequestable {
requestBehavior.before(sending: request)

session.dataTask(with: request) { data, response, error in

guard requestBehavior.allowCompletion(data: data, response: response, error: error) else {
requestBehavior.after(completion: Result.failure(Error.cancelled))
return
}

let (data, response, error) = requestBehavior.modifyResponse(data: data,
response: response,
error: error)
Expand Down