diff --git a/src/routes/v5/price.js b/src/routes/v5/price.js index 8053eee..7e93c73 100644 --- a/src/routes/v5/price.js +++ b/src/routes/v5/price.js @@ -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. @@ -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 diff --git a/test/v5/integration/price.js b/test/v5/integration/price.js index 0b96988..5e5ce43 100644 --- a/test/v5/integration/price.js +++ b/test/v5/integration/price.js @@ -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') @@ -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) + }) + }) }) diff --git a/test/v5/mocks/price-mock.js b/test/v5/mocks/price-mock.js index 5bf3569..874b0a1 100644 --- a/test/v5/mocks/price-mock.js +++ b/test/v5/mocks/price-mock.js @@ -235,7 +235,14 @@ const mockCoinexFeed = { message: 'OK' } +const mockCurrencyInfo = { + ticker: 'BCHA', + satoshisperunit: 100000000, + decimals: 8 +} + module.exports = { mockCoinbaseFeed, + mockCurrencyInfo, mockCoinexFeed } diff --git a/test/v5/price.js b/test/v5/price.js index 1e795f9..1ffbca3 100644 --- a/test/v5/price.js +++ b/test/v5/price.js @@ -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. @@ -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. @@ -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() }) @@ -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']) + }) + }) })