Skip to content

Commit

Permalink
Added possibility to use custom URLSession instance
Browse files Browse the repository at this point in the history
  • Loading branch information
Bartłomiej Świerad committed Sep 11, 2020
1 parent 491a603 commit bad6b97
Show file tree
Hide file tree
Showing 12 changed files with 142 additions and 15 deletions.
1 change: 1 addition & 0 deletions .swiftlint.yml
Expand Up @@ -14,6 +14,7 @@ function_body_length:
identifier_name:
excluded:
- id
- rx

warning_threshold: 5

Expand Down
16 changes: 11 additions & 5 deletions Sources/Restler/Internal/Networking.swift
Expand Up @@ -9,6 +9,7 @@ typealias DataCompletion = (DataResult) -> Void
protocol NetworkingType: class {
func makeRequest(
urlRequest: URLRequest,
urlSession: URLSessionType?,
eventLogger: EventLoggerLogging,
completion: @escaping DataCompletion) -> Restler.Task

Expand Down Expand Up @@ -40,13 +41,16 @@ final class Networking {
extension Networking: NetworkingType {
func makeRequest(
urlRequest: URLRequest,
urlSession: URLSessionType?,
eventLogger: EventLoggerLogging,
completion: @escaping DataCompletion
) -> Restler.Task {
Restler.Task(task: self.runDataTask(
request: urlRequest,
eventLogger: eventLogger,
completion: completion))
Restler.Task(
task: self.runDataTask(
request: urlRequest,
urlSession: urlSession,
eventLogger: eventLogger,
completion: completion))
}

func buildRequest(
Expand Down Expand Up @@ -106,11 +110,13 @@ extension Networking {

private func runDataTask(
request: URLRequest,
urlSession: URLSessionType?,
eventLogger: EventLoggerLogging,
completion: @escaping DataCompletion
) -> URLSessionDataTaskType {
let session = urlSession ?? self.session
let startTime: DispatchTime = .now()
let task = self.session.dataTask(with: request) { response in
let task = session.dataTask(with: request) { response in
let elapsedTime: Milliseconds = DispatchTime.now().since(startTime).toMilliseconds()
eventLogger.log(.requestCompleted(
request: request,
Expand Down
6 changes: 6 additions & 0 deletions Sources/Restler/Internal/RestlerRequestInternal.swift
Expand Up @@ -2,6 +2,7 @@ import Foundation

protocol RestlerRequestInternal: class {
var dependencies: Restler.RequestDependencies { get }
var form: Restler.RequestForm { get }
func getCompletion() -> DataCompletion
}

Expand All @@ -13,6 +14,7 @@ extension RestlerRequestInternal {
let completion = self.getCompletion()
return self.dependencies.networking.makeRequest(
urlRequest: urlRequest,
urlSession: self.form.urlSession,
eventLogger: self.dependencies.eventLogger,
completion: completion)
}
Expand Down Expand Up @@ -55,4 +57,8 @@ extension Restler {
self.urlRequest = urlRequest
}
}

struct RequestForm {
var urlSession: URLSessionType?
}
}
6 changes: 6 additions & 0 deletions Sources/Restler/Public/Classes/Request/DecodableRequest.swift
Expand Up @@ -3,6 +3,7 @@ import Foundation
extension Restler {
public final class DecodableRequest<D: Decodable>: Request<D>, RestlerRequestInternal {
internal let dependencies: Restler.RequestDependencies
internal var form: Restler.RequestForm = .init()

private var successCompletionHandler: ((D) -> Void)?
private var failureCompletionHandler: ((Swift.Error) -> Void)?
Expand Down Expand Up @@ -36,6 +37,11 @@ extension Restler {
self.buildNetworkingRequest()
}

public override func using(session: URLSession) -> Self {
self.form.urlSession = session
return self
}

public override func subscribe(
onSuccess: ((D) -> Void)? = nil,
onFailure: ((Swift.Error) -> Void)? = nil,
Expand Down
Expand Up @@ -3,6 +3,7 @@ import Foundation
extension Restler {
public final class OptionalDecodableRequest<D: Decodable>: Request<D?>, RestlerRequestInternal {
internal let dependencies: Restler.RequestDependencies
internal var form: Restler.RequestForm = .init()

private var successCompletionHandler: ((D?) -> Void)?
private var failureCompletionHandler: ((Swift.Error) -> Void)?
Expand Down Expand Up @@ -36,6 +37,11 @@ extension Restler {
self.buildNetworkingRequest()
}

public override func using(session: URLSession) -> Self {
self.form.urlSession = session
return self
}

public override func subscribe(
onSuccess: ((D?) -> Void)? = nil,
onFailure: ((Swift.Error) -> Void)? = nil,
Expand Down
11 changes: 11 additions & 0 deletions Sources/Restler/Public/Classes/Request/Request.swift
Expand Up @@ -66,6 +66,17 @@ extension Restler {
return nil
}

/// Sets the request to use the provided `URLSession` instead of the default one.
///
/// - Parameters:
/// - session: A `URLSession` that will perform the built task. If not set, `shared` will be used.
///
/// - Returns: `self` for chaining.
///
open func using(session: URLSession) -> Self {
return self
}

/// Runs networking task with specified handlers at its completion.
///
/// - Parameters:
Expand Down
6 changes: 6 additions & 0 deletions Sources/Restler/Public/Classes/Request/VoidRequest.swift
Expand Up @@ -3,6 +3,7 @@ import Foundation
extension Restler {
public final class VoidRequest: Request<Void>, RestlerRequestInternal {
internal let dependencies: Restler.RequestDependencies
internal var form: Restler.RequestForm = .init()

private var successCompletionHandler: ((SuccessfulResponseObject) -> Void)?
private var failureCompletionHandler: ((Swift.Error) -> Void)?
Expand Down Expand Up @@ -35,6 +36,11 @@ extension Restler {
self.buildNetworkingRequest()
}

public override func using(session: URLSession) -> Self {
self.form.urlSession = session
return self
}

public override func subscribe(
onSuccess: ((SuccessfulResponseObject) -> Void)? = nil,
onFailure: ((Swift.Error) -> Void)? = nil,
Expand Down
2 changes: 2 additions & 0 deletions Sources/Restler/Public/Protocols/Request/RestlerRequest.swift
Expand Up @@ -15,6 +15,8 @@ public protocol RestlerRequest: class {
@available(*, deprecated, message: "Use `subscribe(onSuccess:onFailure:onCompletion:)`")
func start() -> RestlerTaskType?

func using(session: URLSession) -> Self

@discardableResult
func subscribe(
onSuccess: ((_ object: SuccessfulResponseObject) -> Void)?,
Expand Down
1 change: 0 additions & 1 deletion Sources/RxRestler/Request+Rx.swift
Expand Up @@ -3,7 +3,6 @@ import RxSwift
import Restler

extension Restler.Request {
// swiftlint:disable:next identifier_name
public var rx: Single<D> {
Single<D>.create { single in
let task = self.subscribe(
Expand Down
5 changes: 5 additions & 0 deletions Tests/RestlerTests/Mocks/NetworkingMock.swift
Expand Up @@ -11,6 +11,8 @@ final class NetworkingMock {
private(set) var makeRequestParams: [MakeRequestParams] = []
struct MakeRequestParams {
let urlRequest: URLRequest
let urlSession: URLSessionType?
let eventLogger: EventLoggerLogging
let completion: DataCompletion
}

Expand All @@ -33,11 +35,14 @@ final class NetworkingMock {
extension NetworkingMock: NetworkingType {
func makeRequest(
urlRequest: URLRequest,
urlSession: URLSessionType?,
eventLogger: EventLoggerLogging,
completion: @escaping DataCompletion
) -> Restler.Task {
self.makeRequestParams.append(MakeRequestParams(
urlRequest: urlRequest,
urlSession: urlSession,
eventLogger: eventLogger,
completion: completion))
return self.makeRequestReturnValue
}
Expand Down
Expand Up @@ -97,7 +97,8 @@ extension GetInterfaceIntegrationTests {
let sut = self.buildSUT()
let header = ["id": "1", "name": "name", "double": "1.23"]
// Act
let request = sut.get(self.endpoint)
let request = sut
.get(self.endpoint)
.query(header)
.urlRequest()
// Assert
Expand Down Expand Up @@ -128,6 +129,25 @@ extension GetInterfaceIntegrationTests {
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertNil(try XCTUnwrap(self.networking.makeRequestParams.last).urlSession)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}

func testGetVoid_withCustomSession_buildsRequest() throws {
// Arrange
let sut = self.buildSUT()
let session = URLSession()
var completionResult: Restler.VoidResult?
// Act
sut.get(self.endpoint)
.decode(Void.self)
.using(session: session)
.deprecatedOnCompletion({ completionResult = $0 })
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertEqual(self.networking.makeRequestParams.last?.urlSession as? URLSession, session)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}
Expand Down Expand Up @@ -333,6 +353,25 @@ extension GetInterfaceIntegrationTests {
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertNil(try XCTUnwrap(self.networking.makeRequestParams.last).urlSession)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}

func testGetOptionalDecodable_withCustomSession_buildsRequest() throws {
// Arrange
let sut = self.buildSUT()
let session = URLSession()
var completionResult: Restler.DecodableResult<SomeObject?>?
// Act
sut.get(self.endpoint)
.decode(SomeObject?.self)
.using(session: session)
.deprecatedOnCompletion({ completionResult = $0 })
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertEqual(self.networking.makeRequestParams.last?.urlSession as? URLSession, session)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}
Expand Down Expand Up @@ -546,6 +585,25 @@ extension GetInterfaceIntegrationTests {
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertNil(try XCTUnwrap(self.networking.makeRequestParams.last).urlSession)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}

func testGetDecodable_withCustomSession_buildsRequest() throws {
// Arrange
let sut = self.buildSUT()
let session = URLSession()
var completionResult: Restler.DecodableResult<SomeObject>?
// Act
sut.get(self.endpoint)
.decode(SomeObject.self)
.using(session: session)
.deprecatedOnCompletion({ completionResult = $0 })
.deprecatedStart()
// Assert
XCTAssertEqual(self.networking.makeRequestParams.count, 1)
XCTAssertEqual(self.networking.makeRequestParams.last?.urlSession as? URLSession, session)
XCTAssertEqual(self.networking.buildRequestParams.count, 1)
XCTAssertNil(completionResult)
}
Expand Down
37 changes: 29 additions & 8 deletions Tests/RestlerTests/Tests/Unit/NetworkingTests.swift
Expand Up @@ -26,7 +26,7 @@ extension NetworkingTests {
let urlRequest = URLRequest(url: url)
var completionResult: DataResult?
// Act
let task = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
let task = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
// Assert
Expand All @@ -38,6 +38,27 @@ extension NetworkingTests {
XCTAssertNotNil(task)
}

func testMakeRequest_providedCustomSession_makesProperRequest() throws {
// Arrange
let sut = self.buildSUT()
let url = try XCTUnwrap(URL(string: "https://www.example.com"))
let urlRequest = URLRequest(url: url)
let session = URLSessionMock()
var completionResult: DataResult?
// Act
let task = sut.makeRequest(urlRequest: urlRequest, urlSession: session, eventLogger: eventLogger) { result in
completionResult = result
}
// Assert
XCTAssertEqual(self.session.dataTaskParams.count, 0)
XCTAssertEqual(session.dataTaskParams.count, 1)
let request = try XCTUnwrap(session.dataTaskParams.last?.request)
XCTAssertEqual(urlRequest, request)
XCTAssertNil(completionResult)
XCTAssertEqual(session.dataTaskReturnValue.resumeParams.count, 1)
XCTAssertNotNil(task)
}

func testMakeRequest_successfulResponse() throws {
// Arrange
let sut = self.buildSUT()
Expand All @@ -49,7 +70,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: responseData, response: mockResponse, error: nil)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -65,7 +86,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: Data(), response: nil, error: nil)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -85,7 +106,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: Data(), response: mockResponse, error: nil)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -105,7 +126,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: Data(), response: mockResponse, error: TestError())
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -124,7 +145,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: nil, response: mockResponse, error: nil)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -143,7 +164,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: nil, response: mockResponse, error: returnedError)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand All @@ -161,7 +182,7 @@ extension NetworkingTests {
let response = HTTPRequestResponse(data: nil, response: nil, error: returnedError)
var completionResult: DataResult?
// Act
_ = sut.makeRequest(urlRequest: urlRequest, eventLogger: eventLogger) { result in
_ = sut.makeRequest(urlRequest: urlRequest, urlSession: nil, eventLogger: eventLogger) { result in
completionResult = result
}
try XCTUnwrap(self.session.dataTaskParams.last).completion(response)
Expand Down

0 comments on commit bad6b97

Please sign in to comment.