2020-07-27 21:32:51 -07:00
|
|
|
const chai = require("chai")
|
|
|
|
|
const assert = chai.assert
|
|
|
|
|
const axios = require("axios")
|
|
|
|
|
const sinon = require("sinon")
|
|
|
|
|
|
|
|
|
|
const BCHJS = require("../../src/bch-js")
|
|
|
|
|
const bchjs = new BCHJS()
|
|
|
|
|
|
|
|
|
|
const mockData = require("./fixtures/electrumx-mock")
|
|
|
|
|
|
|
|
|
|
describe(`#ElectrumX`, () => {
|
|
|
|
|
let sandbox
|
|
|
|
|
beforeEach(() => (sandbox = sinon.createSandbox()))
|
|
|
|
|
afterEach(() => sandbox.restore())
|
|
|
|
|
|
|
|
|
|
describe(`#utxo`, () => {
|
|
|
|
|
it(`should throw an error for improper input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const addr = 12345
|
|
|
|
|
|
|
|
|
|
await bchjs.Electrumx.utxo(addr)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(
|
|
|
|
|
err.message,
|
|
|
|
|
`Input address must be a string or array of strings`
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should GET utxos for a single address`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "get").resolves({ data: mockData.utxo })
|
|
|
|
|
|
|
|
|
|
const addr = "bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9"
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.utxo(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "utxos")
|
|
|
|
|
assert.isArray(result.utxos)
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0], "height")
|
|
|
|
|
assert.property(result.utxos[0], "tx_hash")
|
|
|
|
|
assert.property(result.utxos[0], "tx_pos")
|
|
|
|
|
assert.property(result.utxos[0], "value")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should POST utxo details for an array of addresses`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "post").resolves({ data: mockData.utxos })
|
|
|
|
|
|
|
|
|
|
const addr = [
|
|
|
|
|
"bitcoincash:qrdka2205f4hyukutc2g0s6lykperc8nsu5u2ddpqf",
|
|
|
|
|
"bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.utxo(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "utxos")
|
|
|
|
|
assert.isArray(result.utxos)
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0], "utxos")
|
|
|
|
|
assert.isArray(result.utxos[0].utxos)
|
|
|
|
|
assert.property(result.utxos[0], "address")
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "height")
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "tx_hash")
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "tx_pos")
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "value")
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
describe(`#balance`, () => {
|
|
|
|
|
it(`should throw an error for improper input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const addr = 12345
|
|
|
|
|
|
|
|
|
|
await bchjs.Electrumx.balance(addr)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(
|
|
|
|
|
err.message,
|
|
|
|
|
`Input address must be a string or array of strings`
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should GET balance for a single address`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "get").resolves({ data: mockData.balance })
|
|
|
|
|
|
|
|
|
|
const addr = "bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9"
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.balance(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "balance")
|
|
|
|
|
assert.property(result.balance, "confirmed")
|
|
|
|
|
assert.property(result.balance, "unconfirmed")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should POST balance for an array of addresses`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "post").resolves({ data: mockData.balances })
|
|
|
|
|
|
|
|
|
|
const addr = [
|
|
|
|
|
"bitcoincash:qrdka2205f4hyukutc2g0s6lykperc8nsu5u2ddpqf",
|
|
|
|
|
"bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.balance(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "balances")
|
|
|
|
|
assert.isArray(result.balances)
|
|
|
|
|
|
|
|
|
|
assert.property(result.balances[0], "address")
|
|
|
|
|
assert.property(result.balances[0], "balance")
|
|
|
|
|
assert.property(result.balances[0].balance, "confirmed")
|
|
|
|
|
assert.property(result.balances[0].balance, "unconfirmed")
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
describe(`#transactions`, () => {
|
|
|
|
|
it(`should throw an error for improper input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const addr = 12345
|
|
|
|
|
|
|
|
|
|
await bchjs.Electrumx.transactions(addr)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(
|
|
|
|
|
err.message,
|
|
|
|
|
`Input address must be a string or array of strings`
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should GET transactions for a single address`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "get").resolves({ data: mockData.transaction })
|
|
|
|
|
|
|
|
|
|
const addr = "bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9"
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.transactions(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "transactions")
|
|
|
|
|
assert.isArray(result.transactions)
|
|
|
|
|
assert.property(result.transactions[0], "height")
|
|
|
|
|
assert.property(result.transactions[0], "tx_hash")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should POST transaction history for an array of addresses`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "post").resolves({ data: mockData.transactions })
|
|
|
|
|
|
|
|
|
|
const addr = [
|
|
|
|
|
"bitcoincash:qrdka2205f4hyukutc2g0s6lykperc8nsu5u2ddpqf",
|
|
|
|
|
"bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.transactions(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "transactions")
|
|
|
|
|
assert.isArray(result.transactions)
|
|
|
|
|
|
|
|
|
|
assert.property(result.transactions[0], "address")
|
|
|
|
|
assert.property(result.transactions[0], "transactions")
|
|
|
|
|
assert.isArray(result.transactions[0].transactions)
|
|
|
|
|
assert.property(result.transactions[0].transactions[0], "height")
|
|
|
|
|
assert.property(result.transactions[0].transactions[0], "tx_hash")
|
|
|
|
|
})
|
|
|
|
|
})
|
2020-08-04 22:58:22 +09:00
|
|
|
|
|
|
|
|
describe(`#unconfirmed`, () => {
|
|
|
|
|
it(`should throw an error for improper input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const addr = 12345
|
|
|
|
|
|
|
|
|
|
await bchjs.Electrumx.unconfirmed(addr)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(
|
|
|
|
|
err.message,
|
|
|
|
|
`Input address must be a string or array of strings`
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should GET unconfirmed utxos for a single address`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "get").resolves({ data: mockData.unconfirmed })
|
|
|
|
|
|
|
|
|
|
const addr = "bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9"
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.unconfirmed(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "utxos")
|
|
|
|
|
assert.isArray(result.utxos)
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0], "height")
|
|
|
|
|
assert.property(result.utxos[0], "tx_hash")
|
|
|
|
|
assert.property(result.utxos[0], "fee")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it(`should POST unconfirmed utxo details for an array of addresses`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "post").resolves({ data: mockData.unconfirmedArray })
|
|
|
|
|
|
|
|
|
|
const addr = [
|
|
|
|
|
"bitcoincash:qrdka2205f4hyukutc2g0s6lykperc8nsu5u2ddpqf",
|
|
|
|
|
"bitcoincash:qpdh9s677ya8tnx7zdhfrn8qfyvy22wj4qa7nwqa5v"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.unconfirmed(addr)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "success")
|
|
|
|
|
assert.equal(result.success, true)
|
|
|
|
|
|
|
|
|
|
assert.property(result, "utxos")
|
|
|
|
|
assert.isArray(result.utxos)
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0], "utxos")
|
|
|
|
|
assert.isArray(result.utxos[0].utxos)
|
|
|
|
|
assert.property(result.utxos[0], "address")
|
|
|
|
|
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "height")
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "tx_hash")
|
|
|
|
|
assert.property(result.utxos[0].utxos[0], "fee")
|
|
|
|
|
})
|
|
|
|
|
})
|
2020-09-01 23:52:50 +09:00
|
|
|
|
|
|
|
|
describe(`#blockHeader`, () => {
|
|
|
|
|
it(`should throw an error for improper height input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const height = -10
|
|
|
|
|
await bchjs.Electrumx.blockHeader(height)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(err.error, `height must be a positive number`)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
it(`should throw an error for improper count input`, async () => {
|
|
|
|
|
try {
|
|
|
|
|
const height = 42
|
|
|
|
|
const count = -10
|
|
|
|
|
|
|
|
|
|
await bchjs.Electrumx.blockHeader(height, count)
|
|
|
|
|
assert.equal(true, false, "Unexpected result!")
|
|
|
|
|
} catch (err) {
|
|
|
|
|
// console.log(`err: `, err)
|
|
|
|
|
assert.include(err.error, `count must be a positive number`)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
it(`should GET block headers for a given height`, async () => {
|
|
|
|
|
// Stub the network call.
|
|
|
|
|
sandbox.stub(axios, "get").resolves({ data: mockData.blockHeaders })
|
|
|
|
|
|
|
|
|
|
const height = 42
|
|
|
|
|
|
|
|
|
|
const result = await bchjs.Electrumx.blockHeader(height)
|
|
|
|
|
// console.log(`result: ${JSON.stringify(result, null, 2)}`)
|
|
|
|
|
assert.isArray(result)
|
|
|
|
|
assert.equal(result.length, 2)
|
|
|
|
|
})
|
|
|
|
|
})
|
2020-07-27 21:32:51 -07:00
|
|
|
})
|