Skip to content

Commit

Permalink
Updated unit tests and readme, conformed to new interface on execute …
Browse files Browse the repository at this point in the history
…method
  • Loading branch information
JFejza authored and aronbalog committed Mar 26, 2018
1 parent 1202384 commit ca79f5d
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 14 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,10 +334,11 @@ Deserializer can also be declared without generic parameter but in that case the

#### Client protocol

Implement following method from `Client` protocol:
Implement following method from `Client` protocol - userInfo contains custom data you can pass to the client to do some internal logic: e.g. add some extra headers, add encryption etc.:

```swift
func executeRequest(path: String,
func executeRequest(userInfo: [String: Any],
path: String,
method: String,
queryItems: [URLQueryItem],
bodyParameters: [String : Any]?,
Expand Down Expand Up @@ -676,6 +677,7 @@ dataSource
- [x] DataSource with router and client when deleting resource client receives correct data from router for execution
- [x] DataSource with path and client when creating resource invokes execute request on client
- [x] DataSource with path and client when creating resource client receives correct data for execution
- [x] DataSource with path and client when creating resource client receives userInfo for execution
- [x] DataSource with path and client when fetching single resource invokes execute request on client
- [x] DataSource with path and client when fetching single resource client receives correct data for execution
- [x] DataSource with path and client when fetching resource collection with custom pagination invokes execute request on client
Expand Down
6 changes: 3 additions & 3 deletions Vox/Core/Networking/Class/Request.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class Request<ResourceType: Resource, SuccessCallbackType>: DataSourceRes
func execute() throws {
let parameters: [String: Any]? = try resource?.documentDictionary()

client.executeRequest(request: unsafeBitCast(self, to: Request<Resource, Any>.self), path: path, method: httpMethod, queryItems: queryItems, bodyParameters: parameters, success: { (response, data) in
client.executeRequest(path: path, method: httpMethod, queryItems: queryItems, bodyParameters: parameters, success: { (response, data) in
if let success = self.successBlock as? DataSource<ResourceType>.ResourceSuccessBlock {
guard let data = data else {
fatalError("Unhandled exception")
Expand Down Expand Up @@ -76,7 +76,7 @@ public class Request<ResourceType: Resource, SuccessCallbackType>: DataSourceRes
} else if let success = self.successBlock as? DataSource<ResourceType>.DeleteSuccessBlock {
success()
}
}) { (error, data) in
}, failure: { (error, data) in
guard let data = data else {
self.failureBlock?(error)
return
Expand All @@ -87,7 +87,7 @@ public class Request<ResourceType: Resource, SuccessCallbackType>: DataSourceRes
} catch let __error {
self.failureBlock?(__error)
}
}
}, userInfo: userInfo)
}
}

Expand Down
2 changes: 1 addition & 1 deletion Vox/Core/Networking/Protocol/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ public typealias ClientSuccessBlock = (_ response: HTTPURLResponse?, _ data: Dat
public typealias ClientFailureBlock = (_ error: Error?, _ data: Data?) -> Void

public protocol Client: class {
func executeRequest(request: Request<Resource, Any>, path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String: Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock)
func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String: Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock, userInfo: [String: Any])
}

2 changes: 1 addition & 1 deletion Vox/Plugins/Alamofire/JSONAPIClient_Alamofire.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ extension JSONAPIClient {
self.baseURL = baseURL
}

public func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock) {
public func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock, userInfo: [String: Any]) {
let sessionManager = SessionManager.default
let url = baseURL.appendingPathComponent(path)
let headers: HTTPHeaders = [
Expand Down
28 changes: 22 additions & 6 deletions VoxTests/DataSource/DataSourceSpec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,17 @@ fileprivate class MockClient: Client {
class ExecuteRequestInspector {
var path: String!
var queryItems: [URLQueryItem] = []
var userInfo: [String: Any] = [:]
}

let invocation = Invocation()
let executeRequestInspector = ExecuteRequestInspector()

func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock) {
func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock, userInfo: [String: Any]) {
invocation.executeRequest.invoke()
executeRequestInspector.path = path
executeRequestInspector.queryItems = queryItems
executeRequestInspector.userInfo = userInfo
}
}

Expand All @@ -119,6 +121,13 @@ fileprivate class MockResource: Resource {
}
}

fileprivate extension Request {
func mockConfiguration() -> Self {
self.userInfo["key"] = "value"
return self
}
}

class DataSourceSpec: QuickSpec {

override func spec() {
Expand All @@ -129,11 +138,14 @@ class DataSourceSpec: QuickSpec {
let sut = DataSource(strategy: .router(router), client: client)
let resource = MockResource()

try! sut.create(resource).result({ (document) in

}, { (error) in

})
try! sut
.create(resource)
.mockConfiguration()
.result({ (document) in

}, { (error) in

})

it("invokes execute request on client", closure: {
expect(client.invocation.executeRequest.isInvokedOnce).to(beTrue())
Expand All @@ -150,6 +162,10 @@ class DataSourceSpec: QuickSpec {
it("client receives correct data from router for execution", closure: {
expect(client.executeRequestInspector.path).to(equal(createPath))
})

it("client receives correct data from request for execution", closure: {
expect(client.executeRequestInspector.userInfo as NSDictionary).to(equal(["key": "value"] as NSDictionary))
})
})

context("when fetching single resource", {
Expand Down
2 changes: 1 addition & 1 deletion VoxTests/DataSource/PaginationSpec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ fileprivate class MockClient: Client {
var nextPath: String?
var queryItems: [URLQueryItem]?

func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock) {
func executeRequest(path: String, method: String, queryItems: [URLQueryItem], bodyParameters: [String : Any]?, success: @escaping ClientSuccessBlock, failure: @escaping ClientFailureBlock, userInfo: [String: Any]) {

if count == 0 {
count += 1
Expand Down

0 comments on commit ca79f5d

Please sign in to comment.