Skip to content

Commit

Permalink
Merge pull request #46 from keefertaylor/result
Browse files Browse the repository at this point in the history
Migrate to Swift's `Result` type
  • Loading branch information
keefertaylor authored Mar 19, 2019
2 parents 8811b7f + a4e50fe commit 656c6f0
Show file tree
Hide file tree
Showing 11 changed files with 454 additions and 217 deletions.
9 changes: 7 additions & 2 deletions Extensions/PromiseKit/AbstractClient+Promises.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@ extension AbstractClient {
/// - Returns: A promise which will resolve to the result of the RPC.
public func send<T>(_ rpc: RPC<T>) -> Promise<T> {
return Promise { seal in
send(rpc) { result, error in
seal.resolve(result, error)
send(rpc) { result in
switch result {
case .success(let data):
seal.fulfill(data)
case .failure(let error):
seal.reject(error)
}
}
}
}
Expand Down
18 changes: 14 additions & 4 deletions Extensions/PromiseKit/TezosNodeClient+Promises.swift
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,13 @@ extension TezosNodeClient {
keys: Keys
) -> Promise<String> {
return Promise { seal in
forgeSignPreapplyAndInject(operations, source: source, keys: keys) { result, error in
seal.resolve(result, error)
forgeSignPreapplyAndInject(operations, source: source, keys: keys) { result in
switch result {
case .success(let data):
seal.fulfill(data)
case .failure(let error):
seal.reject(error)
}
}
}
}
Expand All @@ -263,8 +268,13 @@ extension TezosNodeClient {
/// - Returns: A promise which resolves to the result of running the operation.
public func runOperation(_ operation: Operation, from wallet: Wallet) -> Promise<[String: Any]> {
return Promise { seal in
runOperation(operation, from: wallet) { result, error in
seal.resolve(result, error)
runOperation(operation, from: wallet) { result in
switch result {
case .success(let data):
seal.fulfill(data)
case .failure(let error):
seal.reject(error)
}
}
}
}
Expand Down
65 changes: 37 additions & 28 deletions IntegrationTests/TezosKit/IntegrationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,15 @@ class TezosNodeIntegrationTests: XCTestCase {
public func testGetAccountBalance() {
let expectation = XCTestExpectation(description: "completion called")

nodeClient.getBalance(wallet: .testWallet) { (result, error) in
XCTAssertNotNil(result)
XCTAssertNil(error)
let balance = Double(result!.humanReadableRepresentation)!
XCTAssertGreaterThan(balance, 0.0, "Balance in account was not greater than 0")

expectation.fulfill()
nodeClient.getBalance(wallet: .testWallet) { result in
switch result {
case .failure:
XCTFail()
case .success(let balance):
let humanReadableBalance = Double(balance.humanReadableRepresentation)!
XCTAssertGreaterThan(humanReadableBalance, 0.0, "Balance in account was not greater than 0")
expectation.fulfill()
}
}

wait(for: [expectation], timeout: .expectationTimeout)
Expand All @@ -71,11 +73,13 @@ class TezosNodeIntegrationTests: XCTestCase {
to: "tz3WXYtyDUNL91qfiCJtVUX746QpNv5i5ve5",
from: Wallet.testWallet.address,
keys: Wallet.testWallet.keys
) { (hash, error) in
XCTAssertNotNil(hash)
XCTAssertNil(error)

expectation.fulfill()
) { result in
switch result {
case .failure:
XCTFail()
case .success:
expectation.fulfill()
}
}

wait(for: [expectation], timeout: .expectationTimeout)
Expand All @@ -85,18 +89,21 @@ class TezosNodeIntegrationTests: XCTestCase {
let expectation = XCTestExpectation(description: "completion called")

let operation = OriginateAccountOperation(wallet: .testWallet)
self.nodeClient.runOperation(operation, from: .testWallet) { result, error in
XCTAssertNil(error)
guard let result = result,
let contents = result["contents"] as? [[String: Any]],
let metadata = contents[0]["metadata"] as? [String: Any],
let operationResult = metadata["operation_result"] as? [String: Any],
let consumedGas = operationResult["consumed_gas"] as? String else {
XCTFail()
return
self.nodeClient.runOperation(operation, from: .testWallet) { result in
switch result {
case .failure:
XCTFail()
case .success(let data):
guard let contents = data["contents"] as? [[String: Any]],
let metadata = contents[0]["metadata"] as? [String: Any],
let operationResult = metadata["operation_result"] as? [String: Any],
let consumedGas = operationResult["consumed_gas"] as? String else {
XCTFail()
return
}
XCTAssertEqual(consumedGas, "10000")
expectation.fulfill()
}
XCTAssertEqual(consumedGas, "10000")
expectation.fulfill()
}

wait(for: [expectation], timeout: .expectationTimeout)
Expand All @@ -122,11 +129,13 @@ class TezosNodeIntegrationTests: XCTestCase {
ops,
source: Wallet.testWallet.address,
keys: Wallet.testWallet.keys
) { (hash: String?, error: Error?) in
XCTAssertNil(error)
XCTAssertNotNil(hash)

expectation.fulfill()
) { result in
switch result {
case .failure:
XCTFail()
case .success:
expectation.fulfill()
}
}
wait(for: [expectation], timeout: .expectationTimeout)
}
Expand Down
4 changes: 2 additions & 2 deletions Tests/Extensions/PromiseKit/AbstractClientTest+Promises.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ extension AbstractClientTest {

// RPC endpoint will not resolve to a valid URL.
let rpc = RPC(endpoint: "/ /\"test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (_, _) in
abstractClient?.send(rpc) { _ in
if #available(iOS 10, OSX 10.12, *) {
dispatchPrecondition(condition: .onQueue(self.callbackQueue))
}
Expand All @@ -23,7 +23,7 @@ extension AbstractClientTest {
public func testCallbackOnCorrectQueue_promises() {
let expectation = XCTestExpectation(description: "Promise is resolved")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (_, _) in
abstractClient?.send(rpc) { _ in
if #available(iOS 10, OSX 10.12, *) {
dispatchPrecondition(condition: .onQueue(self.callbackQueue))
}
Expand Down
78 changes: 45 additions & 33 deletions Tests/TezosKit/AbstractClientTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class AbstractClientTest: XCTestCase {

// RPC endpoint will not resolve to a valid URL.
let rpc = RPC(endpoint: "/ /\"test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (_, _) in
abstractClient?.send(rpc) { _ in
if #available(iOS 10, OSX 10.12, *) {
dispatchPrecondition(condition: .onQueue(self.callbackQueue))
}
Expand All @@ -81,7 +81,7 @@ class AbstractClientTest: XCTestCase {
public func testCallbackOnCorrectQueue() {
let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (_, _) in
abstractClient?.send(rpc) { _ in
if #available(iOS 10, OSX 10.12, *) {
dispatchPrecondition(condition: .onQueue(self.callbackQueue))
}
Expand All @@ -96,11 +96,13 @@ class AbstractClientTest: XCTestCase {

// RPC endpoint will not resolve to a valid URL.
let rpc = RPC(endpoint: "/ /\"test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNil(result)
XCTAssertNotNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
expectation.fulfill()
case .success:
XCTFail()
}
}

wait(for: [expectation], timeout: 10)
Expand All @@ -118,11 +120,13 @@ class AbstractClientTest: XCTestCase {

let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNil(result)
XCTAssertNotNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
expectation.fulfill()
case .success:
XCTFail()
}
}

wait(for: [expectation], timeout: 10)
Expand All @@ -141,11 +145,13 @@ class AbstractClientTest: XCTestCase {

let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNil(result)
XCTAssertNotNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
expectation.fulfill()
case .success:
XCTFail()
}
}

wait(for: [expectation], timeout: 10)
Expand All @@ -162,11 +168,13 @@ class AbstractClientTest: XCTestCase {

let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNil(result)
XCTAssertNotNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
expectation.fulfill()
case .success:
XCTFail()
}
}

wait(for: [expectation], timeout: 10)
Expand All @@ -183,11 +191,13 @@ class AbstractClientTest: XCTestCase {

let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: IntegerResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNil(result)
XCTAssertNotNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
expectation.fulfill()
case .success:
XCTFail()
}
}

wait(for: [expectation], timeout: 10)
Expand All @@ -206,12 +216,14 @@ class AbstractClientTest: XCTestCase {

let expectation = XCTestExpectation(description: "Completion is Called")
let rpc = RPC(endpoint: "/test", responseAdapterClass: StringResponseAdapter.self)
abstractClient?.send(rpc) { (result, error) in
XCTAssertNotNil(result)
XCTAssertEqual(result, expectedString)
XCTAssertNil(error)

expectation.fulfill()
abstractClient?.send(rpc) { result in
switch result {
case .failure:
XCTFail()
case .success(let data):
XCTAssertEqual(data, expectedString)
expectation.fulfill()
}
}

wait(for: [expectation], timeout: 10)
Expand Down
Loading

0 comments on commit 656c6f0

Please sign in to comment.