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
36 changes: 36 additions & 0 deletions src/routes/v5/price.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Price {
this.router.get('/rates', _this.getBCHRate)
this.router.get('/bchausd', _this.getBCHAUSD)
this.router.get('/bchusd', _this.getBCHUSD)
this.router.get('/getcurrencyinfo', this.getCurrencyInfo)
}

// DRY error handler.
Expand All @@ -56,6 +57,41 @@ class Price {
return res.json({ status: 'price' })
}

/**
* @api {get} /price/getcurrencyinfo Get information about the currency.
* @apiName getcurrencyinfo
* @apiGroup Price
* @apiDescription Returns an object containing the currency's ticker, satoshisperunit and decimals.
*
*
* @apiExample Example usage:
* curl -X GET "https://api.fullstack.cash/v5/price/getcurrencyinfo" -H "accept: application/json"
*
*
*/
async getCurrencyInfo (req, res, next) {
try {
const {
BitboxHTTP,
// username,
// password,
requestConfig
} = routeUtils.setEnvVars()

requestConfig.data.id = 'getcurrencyinfo'
requestConfig.data.method = 'getcurrencyinfo'

const response = await BitboxHTTP(requestConfig)

return res.json(response.data.result)
} catch (err) {
// Write out error to error log.
wlogger.error('Error in price.js/getCurrencyInfo().', err)

return _this.errorHandler(err, res)
}
}

/**
* @api {get} /price/usd Get the USD price of BCH
* @apiName Get the USD price of BCH
Expand Down
11 changes: 10 additions & 1 deletion test/v5/integration/price.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const assert = require('chai').assert
const util = require('util')
util.inspect.defaultOptions = { depth: 1 }

const Price = require('../../../src/routes/v4/price')
const Price = require('../../../src/routes/v5/price')
const price = new Price()

const { mockReq, mockRes } = require('../mocks/express-mocks')
Expand Down Expand Up @@ -50,4 +50,13 @@ describe('#price', () => {
assert.isNumber(result.usd)
})
})
describe('#getCurrencyInfo', () => {
it('should get the full node currency settings', async () => {
const result = await price.getCurrencyInfo(req, res)
console.log(`result: ${util.inspect(result)}`)

assert.isNumber(result.satoshisperunit)
assert.isNumber(result.decimals)
})
})
})
7 changes: 7 additions & 0 deletions test/v5/mocks/price-mock.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,14 @@ const mockCoinexFeed = {
message: 'OK'
}

const mockCurrencyInfo = {
ticker: 'BCHA',
satoshisperunit: 100000000,
decimals: 8
}

module.exports = {
mockCoinbaseFeed,
mockCurrencyInfo,
mockCoinexFeed
}
41 changes: 40 additions & 1 deletion test/v5/price.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
const chai = require('chai')
const assert = chai.assert
const sinon = require('sinon')

const nock = require('nock') // HTTP mocking
const Price = require('../../src/routes/v5/price')

let uut

// Mocking data.
Expand All @@ -31,6 +32,7 @@ describe('#PriceRouter', () => {
before(() => {
// Set default environment variables for unit tests.
if (!process.env.TEST) process.env.TEST = 'unit'
process.env.RPC_BASEURL = 'http://fakenode:fakeport'
})

// Setup the mocks before each test.
Expand All @@ -44,12 +46,19 @@ describe('#PriceRouter', () => {
req.body = {}
req.query = {}

// Activate nock if it's inactive.
if (!nock.isActive()) nock.activate()

sandbox = sinon.createSandbox()

uut = new Price()
})

afterEach(() => {
// Clean up HTTP mocks.
nock.cleanAll() // clear interceptor list.
nock.restore()

// Restore Sandbox
sandbox.restore()
})
Expand Down Expand Up @@ -343,4 +352,34 @@ describe('#PriceRouter', () => {
assert.isNumber(result.usd)
})
})

describe('#getCurrencyInfo', async () => {
it('should throw 500 when network issues', async () => {
await uut.getCurrencyInfo(req, res)

assert.isAbove(
res.statusCode,
499,
'HTTP status code 500 or greater expected.'
)
// console.log(res)
assert.include(
res.output.error,
'Network error: Could not communicate with full node or other external service'
)
})

it('should get the currency settings of the full node', async () => {
// Mock the RPC call for unit tests.
if (process.env.TEST === 'unit') {
// intercept the RPC_BASEURL parameter
nock(`${process.env.RPC_BASEURL}`)
.post((uri) => uri.includes('/'))
.reply(200, { result: mockData.mockCurrencyInfo })
}

const result = await uut.getCurrencyInfo(req, res)
assert.hasAllKeys(result, ['ticker', 'satoshisperunit', 'decimals'])
})
})
})