diff --git a/src/routes/v5/bcash/slp.js b/src/routes/v5/bcash/slp.js new file mode 100644 index 0000000..a364c68 --- /dev/null +++ b/src/routes/v5/bcash/slp.js @@ -0,0 +1,76 @@ +/* + Electrum API route +*/ + +"use strict"; + +const express = require("express"); +const router = express.Router(); +const axios = require("axios"); +const util = require("util"); +// const bitcore = require('bitcore-lib-cash') + +// const ElectrumCash = require('electrum-cash').ElectrumClient +// const ElectrumCash = require('/home/trout/work/personal/electrum-cash/electrum.js').Client // eslint-disable-line + +const wlogger = require("../../../util/winston-logging"); +const config = require("../../../../config"); + +const RouteUtils = require("../../../util/route-utils"); +const routeUtils = new RouteUtils(); + +// const BCHJS = require("@psf/bch-js"); +// const bchjs = new BCHJS(); + +let _this; + +class BcashSlp { + constructor() { + this.config = config; + this.axios = axios; + this.routeUtils = routeUtils; + // this.bchjs = bchjs; + // _this.bitcore = bitcore + + this.bcashServer = process.env.BCASH_SERVER; + if (!this.bcashServer) { + // console.warn('FULCRUM_API env var not set. Can not connect to Fulcrum indexer.') + throw new Error( + "BCASH_SERVER env var not set. Can not connect to bcash full node." + ); + } + + this.router = router; + this.router.get("/", this.root); + } + + // DRY error handler. + errorHandler(err, res) { + // Attempt to decode the error message. + const { msg, status } = _this.routeUtils.decodeError(err); + // console.log('errorHandler msg: ', msg) + // console.log('errorHandler status: ', status) + + if (msg) { + res.status(status); + return res.json({ success: false, error: msg }); + } + + // Handle error patterns specific to this route. + if (err.message) { + res.status(400); + return res.json({ success: false, error: err.message }); + } + + // If error can be handled, return the stack trace + res.status(500); + return res.json({ error: util.inspect(err) }); + } + + // Root API endpoint. Simply acknowledges that it exists. + root(req, res, next) { + return res.json({ status: "bcash-slp" }); + } +} + +module.exports = BcashSlp; diff --git a/test/v5/bcash-slp.js b/test/v5/bcash-slp.js new file mode 100644 index 0000000..0b1e50d --- /dev/null +++ b/test/v5/bcash-slp.js @@ -0,0 +1,99 @@ +/* + TESTS FOR THE bcash/slp.js LIBRARY +*/ + +"use strict"; + +const chai = require("chai"); +const assert = chai.assert; + +const sinon = require("sinon"); + +const BcashSlp = require("../../src/routes/v5/bcash/slp"); + +// Mocking data. +const { mockReq, mockRes } = require("./mocks/express-mocks"); +const mockData = require("./mocks/electrumx-mock"); + +// Used for debugging. +const util = require("util"); +util.inspect.defaultOptions = { depth: 1 }; + +if (!process.env.BCASH_SERVER) process.env.BCASH_SERVER = "http://localhost"; + +describe("#bcash-slp", () => { + let req, res; + let sandbox; + const bcashSlp = new BcashSlp(); + // let electrumxRoute + + before(async () => { + if (!process.env.TEST) { + process.env.TEST = "unit"; + } + console.log(`Testing type is: ${process.env.TEST}`); + + if (!process.env.NETWORK) process.env.NETWORK = "testnet"; + + // Connect to electrumx servers if this is an integration test. + // if (process.env.TEST === 'integration') { + // await electrumxRoute.connect() + // console.log('Connected to ElectrumX server') + // } + }); + + after(async () => { + // console.log(`electrumxRoute.electrumx: `, electrumxRoute.electrumx) + // Disconnect from the electrumx server if this is an integration test. + // if (process.env.TEST === 'integration') { + // await electrumxRoute.disconnect() + // console.log('Disconnected from ElectrumX server') + // } + }); + + // Setup the mocks before each test. + beforeEach(() => { + // Mock the req and res objects used by Express routes. + req = mockReq; + res = mockRes; + + // Explicitly reset the parmas and body. + req.params = {}; + req.body = {}; + req.query = {}; + + sandbox = sinon.createSandbox(); + + // electrumxRoute = new ElecrumxRoute() + }); + + afterEach(() => { + sandbox.restore(); + }); + + after(() => { + // + }); + + // A wrapper for stubbing with the Sinon sandbox. + // function stubMethodForUnitTests (obj, method, value) { + // if (process.env.TEST !== 'unit') return false + // + // electrumxRoute.isReady = true // Force flag. + // + // sandbox.stub(obj, method).resolves(value) + // + // return true + // } + + describe("#root", () => { + // root route handler. + const root = bcashSlp.root; + + it("should respond to GET for base route", async () => { + const result = root(req, res); + + assert.equal(result.status, "bcash-slp", "Returns static string"); + }); + }); +});