├── .github └── workflows │ └── nodejs.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── lib └── bcypher.js ├── package-lock.json ├── package.json └── tests └── unit ├── _del.js ├── _get.js ├── _post.js ├── addAddrWallet.js ├── createHDWallet.js ├── createHook.js ├── createPayFwd.js ├── createWallet.js ├── decodeTX.js ├── delAddrsWallet.js ├── delHDWallet.js ├── delHook.js ├── delPayFwd.js ├── delWallet.js ├── deriveAddrHDWallet.js ├── embedData.js ├── faucet.js ├── genAddr.js ├── genAddrWallet.js ├── getAddr.js ├── getAddrBal.js ├── getAddrFull.js ├── getAddrsHDWallet.js ├── getAddrsWallet.js ├── getBlock.js ├── getChain.js ├── getHDWallet.js ├── getHook.js ├── getTX.js ├── getTXConf.js ├── getUnTXs.js ├── getWallet.js ├── listHDWallets.js ├── listHooks.js ├── listPayFwds.js ├── listWallets.js ├── microTX.js ├── newTX.js ├── pushTX.js └── sendTX.js /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [10.x, 12.x, 14.x] 20 | 21 | steps: 22 | - uses: actions/checkout@v2 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v1 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | - run: npm ci 28 | - run: npm run build --if-present 29 | - run: npm test 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | node_modules 3 | coverage 4 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) [2020] [BlockCypher, Inc.] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Node.js CI](https://github.com/blockcypher/node-client/workflows/Node.js%20CI/badge.svg) 2 | 3 | node-client 4 | =========== 5 | 6 | Node.js SDK for the BlockCypher Web services. See [https://www.blockcypher.com/dev/bitcoin/](https://www.blockcypher.com/dev/bitcoin/) for detailed documentation. 7 | 8 | To install, just use npm: 9 | 10 | ```bash 11 | npm install blockcypher 12 | ``` 13 | 14 | Examples 15 | -------- 16 | 17 | ```javascript 18 | bcypher = require('blockcypher'); 19 | 20 | var bcapi = new bcypher('btc','main',process.env.TOKEN); 21 | 22 | function printResponse(err, data) { 23 | if (err !== null) { 24 | console.log(err); 25 | } else { 26 | console.log(data); 27 | } 28 | } 29 | 30 | //get chain info 31 | bcapi.getChain(printResponse); 32 | //get block height without any optional URL params 33 | bcapi.getBlock(300000, printResponse); 34 | //get block height with an optional "txstart" param, as outlined in docs here: http://dev.blockcypher.com/ 35 | bcapi.getBlock(300000, {txstart:2}, printResponse); 36 | 37 | //let's try a post request, like making a new webhook 38 | var webhook = { 39 | event: "unconfirmed-tx", 40 | address: "15qx9ug952GWGTNn7Uiv6vode4RcGrRemh", 41 | url: "https://my.domain.com/callbacks/new-tx" 42 | }; 43 | bcapi.createHook(webhook, printResponse); 44 | 45 | //Now let's list all of our webhooks 46 | bcapi.listHooks(printResponse); 47 | ``` 48 | -------------------------------------------------------------------------------- /lib/bcypher.js: -------------------------------------------------------------------------------- 1 | var request = require('superagent'); 2 | 3 | const URL_ROOT = 'https://api.blockcypher.com/v1/'; 4 | 5 | /** 6 | * BlockCypher API Client. 7 | * @constructor 8 | * @param {string} coin The coin for which you're using the BlockCypher API. Can be 'btc', 'ltc', 'doge', or 'bcy'. 9 | * @param {string} chain The chain for which you're using the BlockCypher API. Can be 'main', 'test', or 'test3'. 10 | * @param {string} token Your BlockCypher API Token. 11 | */ 12 | var Blockcy = function (coin, chain, token) { 13 | this.coin = coin; 14 | this.chain = chain; 15 | this.token = token; 16 | }; 17 | 18 | module.exports = Blockcy; 19 | 20 | /** 21 | * Helper for GET calls 22 | * 23 | * @private 24 | * @param {string} url Endpoint after URL_ROOT. 25 | * @param {Object} params Additional URL parameters. 26 | * @callback cb 27 | * @memberof Blockcy 28 | * @method get 29 | */ 30 | Blockcy.prototype._get = function (url, params, cb) { 31 | var urlr = URL_ROOT + this.coin + '/' + this.chain + url; 32 | params = Object.assign({}, params, { token: this.token }); 33 | request 34 | .get(urlr) 35 | .set('Accept', 'application/json') 36 | .query(params) 37 | .end(function (error, response) { 38 | if (error || response.statusCode !== 200) { 39 | cb(error || {}); 40 | } else { 41 | cb(null, response.body); 42 | } 43 | }); 44 | }; 45 | 46 | /** 47 | * Helper for POST calls 48 | * 49 | * @private 50 | * @param {string} url Endpoint after URL_ROOT. 51 | * @param {Object} params Optional additional URL parameters. 52 | * @param {Object} data Optional data to post. 53 | * @callback cb 54 | * @memberof Blockcy 55 | * @method post 56 | */ 57 | Blockcy.prototype._post = function (url, params, data, cb) { 58 | var urlr = URL_ROOT + this.coin + '/' + this.chain + url; 59 | params = Object.assign({}, params, { token: this.token }); 60 | request 61 | .post(urlr) 62 | .set('Content-Type', 'application/json') 63 | .query(params) 64 | .send(data) 65 | .end(function (error, response) { 66 | if (error || (response.statusCode !== 200 && response.statusCode !== 201)) { 67 | cb(error || {}); 68 | } else { 69 | cb(null, response.body); 70 | } 71 | }); 72 | }; 73 | 74 | /** 75 | * Helper for DELETE calls 76 | * 77 | * @private 78 | * @param {string} url Endpoint after URL_ROOT. 79 | * @param {Object} params Additional URL parameters. 80 | * @callback cb 81 | * @memberof Blockcy 82 | * @method get 83 | */ 84 | Blockcy.prototype._del = function (url, params, cb) { 85 | var urlr = URL_ROOT + this.coin + '/' + this.chain + url; 86 | params = Object.assign({}, params, { token: this.token }); 87 | request.del({ 88 | url: urlr, 89 | strictSSL: true, 90 | json: true, 91 | qs: params 92 | }, function (error, response, body) { 93 | if (error || response.statusCode !== 204) { 94 | cb(error, body || {}); 95 | } else { 96 | cb(null, body); 97 | } 98 | }); 99 | }; 100 | 101 | /** 102 | * Get Chain 103 | * Get info about the blockchain you're querying. 104 | * @callback cb 105 | * @memberof Blockcy 106 | * @method getChain 107 | */ 108 | Blockcy.prototype.getChain = function (cb) { 109 | this._get('/', {}, function (error, body) { 110 | cb(error, body); 111 | }); 112 | }; 113 | 114 | /** 115 | * Get Block 116 | * Get info about a block you're querying under your object's coin/chain, with additional parameters. Can use either block height or hash. 117 | * @param {(string|number)} hh Hash or height of the block you're querying. 118 | * @param {Object} [params] Optional URL parameters. 119 | * @callback cb 120 | * @memberof Blockcy 121 | * @method getBlock 122 | */ 123 | Blockcy.prototype.getBlock = function (hh, params, cb) { 124 | if (typeof params === 'function') { 125 | cb = params; 126 | params = {}; 127 | } 128 | this._get('/blocks/' + hh, params, function (error, body) { 129 | cb(error, body); 130 | }); 131 | }; 132 | 133 | /** 134 | * Get Addr Bal 135 | * Get balance information about an address. 136 | * @param {(string|number)} addr Address you're querying. 137 | * @param {Object} [params] Optional URL parameters. 138 | * @callback cb 139 | * @memberof Blockcy 140 | * @method getAddrBal 141 | */ 142 | Blockcy.prototype.getAddrBal = function (addr, params, cb) { 143 | if (typeof params === 'function') { 144 | cb = params; 145 | params = {}; 146 | } 147 | this._get('/addrs/' + addr + '/balance', params, function (error, body) { 148 | cb(error, body); 149 | }); 150 | }; 151 | 152 | /** 153 | * Get Addr 154 | * Get information about an address, including concise transaction references. 155 | * @param {(string|number)} addr Address you're querying. 156 | * @param {Object} [params] Optional URL parameters. 157 | * @callback cb 158 | * @memberof Blockcy 159 | * @method getAddr 160 | */ 161 | Blockcy.prototype.getAddr = function (addr, params, cb) { 162 | if (typeof params === 'function') { 163 | cb = params; 164 | params = {}; 165 | } 166 | this._get('/addrs/' + addr, params, function (error, body) { 167 | cb(error, body); 168 | }); 169 | }; 170 | 171 | /** 172 | * Get Addr Full 173 | * Get information about an address, including full transactions. 174 | * @param {(string|number)} addr Address you're querying. 175 | * @param {Object} [params] Optional URL parameters. 176 | * @callback cb 177 | * @memberof Blockcy 178 | * @method getAddrFull 179 | */ 180 | Blockcy.prototype.getAddrFull = function (addr, params, cb) { 181 | if (typeof params === 'function') { 182 | cb = params; 183 | params = {}; 184 | } 185 | this._get('/addrs/' + addr + '/full', params, function (error, body) { 186 | cb(error, body); 187 | }); 188 | }; 189 | 190 | /** 191 | * Gen Addr 192 | * Generates a new address and associate private/public keys. 193 | * @param {Object} data Optional JSON data, which could be used for generating multisig addresses, for exampl.JSON data, which could be used for generating multisig addresses, for example. 194 | * @param {Array[Strings]} data.pubKeys Optional pubKeys for multi sig address 195 | * @param {String} data.script_type Optional script type for multi sig address 196 | * @callback cb 197 | * @memberof Blockcy 198 | * @method genAddr 199 | */ 200 | Blockcy.prototype.genAddr = function (data, cb) { //TODO Allow function signature genAddr(cb) as well 201 | this._post('/addrs', {}, data, function (error, body) { 202 | cb(error, body); 203 | }); 204 | }; 205 | 206 | /** 207 | * Faucet 208 | * Funds an address. Must be used within a test blockchain (bcy-test or btc-test3). 209 | * @param {string} addr Address to be funded. 210 | * @param {number} value Amount to fund. 211 | * @callback cb 212 | * @memberof Blockcy 213 | * @method faucet 214 | */ 215 | Blockcy.prototype.faucet = function (addr, value, cb) { //TODO set default value if value is undefined/null. Maybe allow faucet(addr, cb). 216 | this._post('/faucet', {}, { address: addr, amount: value }, function (error, body) { 217 | cb(error, body); 218 | }); 219 | }; 220 | 221 | /** 222 | * Create Wallet 223 | * Creates a new wallet. 224 | * @param {Object} data JSON Data used to create wallet. 225 | * @param {String} data.name Name of wallet 226 | * @param {Array[String]} data.addresses Array of addresses 227 | * @callback cb 228 | * @memberof Blockcy 229 | * @method createWallet 230 | */ 231 | Blockcy.prototype.createWallet = function (data, cb) { //TODO check if they have name and address before making request 232 | this._post('/wallets', {}, data, function (error, body) { 233 | cb(error, body); 234 | }); 235 | }; 236 | 237 | /** 238 | * Create HD Wallet 239 | * Creates a new HD wallet. 240 | * @param {Object} data JSON Data used to create HD wallet. 241 | * @param {String} data.name Name of wallet 242 | * @param {String} data.extended_public_key extended public key 243 | * @param {Array[int]} data.subchain_indexes subchain indexes 244 | * @callback cb 245 | * @memberof Blockcy 246 | * @method createHDWallet 247 | */ 248 | Blockcy.prototype.createHDWallet = function (data, cb) { //TODO error validation on name and extended_public_key 249 | this._post('/wallets/hd', {}, data, function (error, body) { 250 | cb(error, body); 251 | }); 252 | }; 253 | 254 | /** 255 | * List Wallets 256 | * List wallets under token. 257 | * @callback cb 258 | * @memberof Blockcy 259 | * @method listWallets 260 | */ 261 | Blockcy.prototype.listWallets = function (cb) { 262 | this._get('/wallets', {}, function (error, body) { 263 | cb(error, body); 264 | }); 265 | }; 266 | 267 | /** 268 | * List HD Wallets 269 | * List HD wallets under token. 270 | * @callback cb 271 | * @memberof Blockcy 272 | * @method listHDWallets 273 | */ 274 | Blockcy.prototype.listHDWallets = function (cb) { 275 | this._get('/wallets/hd', {}, function (error, body) { 276 | cb(error, body); 277 | }); 278 | }; 279 | 280 | /** 281 | * Get Wallet 282 | * Get named wallet. 283 | * @callback cb 284 | * @param {string} name Name of the wallet you're querying. 285 | * @memberof Blockcy 286 | * @method getWallet 287 | */ 288 | Blockcy.prototype.getWallet = function (name, cb) { 289 | this._get('/wallets/' + name, {}, function (error, body) { 290 | cb(error, body); 291 | }); 292 | }; 293 | 294 | /** 295 | * Get HD Wallet 296 | * Get named HD wallet. 297 | * @callback cb 298 | * @param {string} name Name of the HD wallet you're querying. 299 | * @memberof Blockcy 300 | * @method getHDWallet 301 | */ 302 | Blockcy.prototype.getHDWallet = function (name, cb) { 303 | this._get('/wallets/hd/' + name, {}, function (error, body) { 304 | cb(error, body); 305 | }); 306 | }; 307 | 308 | /** 309 | * Add Addresses to Wallet 310 | * Add array of addresses to named wallet. 311 | * @callback cb 312 | * @param {string} name Name of the wallet you're querying. 313 | * @param {string[]} addrs Array of addresses you're adding. 314 | * @memberof Blockcy 315 | * @method addAddrWallet 316 | */ 317 | Blockcy.prototype.addAddrWallet = function (name, addrs, cb) { 318 | this._post('/wallets/' + name + '/addresses', {}, { addresses: addrs }, function (error, body) { 319 | cb(error, body); 320 | }); 321 | }; 322 | 323 | /** 324 | * Get Addresses from Wallet 325 | * Get array of addresses from named wallet. 326 | * @callback cb 327 | * @param {string} name Name of the wallet you're querying. 328 | * @memberof Blockcy 329 | * @method getAddrsWallet 330 | */ 331 | Blockcy.prototype.getAddrsWallet = function (name, cb) { 332 | this._get('/wallets/' + name + '/addresses', {}, function (error, body) { 333 | cb(error, body); 334 | }); 335 | }; 336 | 337 | /** 338 | * Get Addresses from HD Wallet 339 | * Get array of addresses from named HD wallet. 340 | * @callback cb 341 | * @param {string} name Name of the HD wallet you're querying. 342 | * @param {Object} [params] Optional URL parameters. 343 | * @memberof Blockcy 344 | * @method getAddrsHDWallet 345 | */ 346 | Blockcy.prototype.getAddrsHDWallet = function (name, params, cb) { 347 | if (typeof params === 'function') { 348 | cb = params; 349 | params = {}; 350 | } 351 | this._get('/wallets/hd/' + name + '/addresses', params, function (error, body) { 352 | cb(error, body); 353 | }); 354 | }; 355 | 356 | /** 357 | * Delete Addresses from Wallet 358 | * Delete addresses from named wallet. 359 | * @callback cb 360 | * @param {string} name Name of the wallet you're querying. 361 | * @param {string[]} addrs Array of addresses you're deleting. 362 | * @memberof Blockcy 363 | * @method delAddrsWallet 364 | */ 365 | Blockcy.prototype.delAddrsWallet = function (name, addrs, cb) { 366 | this._del('/wallets/' + name + '/addresses', { address: addrs.join([';']) }, function (error, body) { 367 | cb(error, body); 368 | }); 369 | }; 370 | 371 | /** 372 | * Generate Address in Wallet 373 | * Add a generated address to named wallet. 374 | * @callback cb 375 | * @param {string} name Name of the wallet you're querying. 376 | * @memberof Blockcy 377 | * @method genAddrWallet 378 | */ 379 | Blockcy.prototype.genAddrWallet = function (name, cb) { 380 | this._post('/wallets/' + name + '/addresses/generate', {}, {}, function (error, body) { 381 | cb(error, body); 382 | }); 383 | }; 384 | 385 | /** 386 | * Derive Address in Wallet 387 | * Derive an address in named HD wallet. 388 | * @callback cb 389 | * @param {string} name Name of the wallet you're querying. 390 | * @param {Object} [params] Optional URL parameters. 391 | * @memberof Blockcy 392 | * @method deriveAddrHDWallet 393 | */ 394 | Blockcy.prototype.deriveAddrHDWallet = function (name, params, cb) { 395 | if (typeof params === 'function') { 396 | cb = params; 397 | params = {}; 398 | } 399 | this._post('/wallets/hd/' + name + '/addresses/derive', params, {}, function (error, body) { 400 | cb(error, body); 401 | }); 402 | }; 403 | 404 | /** 405 | * Delete Wallet 406 | * Deletes named wallet. 407 | * @callback cb 408 | * @param {string} name Name of the wallet you're querying. 409 | * @memberof Blockcy 410 | * @method delWallet 411 | */ 412 | Blockcy.prototype.delWallet = function (name, cb) { 413 | this._del('/wallets/' + name, {}, function (error, body) { 414 | cb(error, body); 415 | }); 416 | }; 417 | 418 | /** 419 | * Delete HD Wallet 420 | * Deletes named HD wallet. 421 | * @callback cb 422 | * @param {string} name Name of the HD wallet you're querying. 423 | * @memberof Blockcy 424 | * @method delHDWallet 425 | */ 426 | Blockcy.prototype.delHDWallet = function (name, cb) { 427 | this._del('/wallets/hd/' + name, {}, function (error, body) { 428 | cb(error, body); 429 | }); 430 | }; 431 | 432 | /** 433 | * Get Transaction 434 | * Get transaction by hash. 435 | * @callback cb 436 | * @param {string} hash Hash of the transaction. 437 | * @param {Object} params Optional URL parameters. 438 | * @memberof Blockcy 439 | * @method getTX 440 | */ 441 | Blockcy.prototype.getTX = function (hash, params, cb) { //TODO allow params to be optional getTX(hash, cb) should work 442 | this._get('/txs/' + hash, params, function (error, body) { 443 | cb(error, body); 444 | }); 445 | }; 446 | 447 | /** 448 | * Get Unconfirmed Transactions 449 | * Get currently unconfirmed transactions. 450 | * @callback cb 451 | * @memberof Blockcy 452 | * @method getUnTXs 453 | */ 454 | Blockcy.prototype.getUnTXs = function (cb) { 455 | this._get('/txs', {}, function (error, body) { 456 | cb(error, body); 457 | }); 458 | }; 459 | 460 | /** 461 | * New Transaction 462 | * Creates a new transaction skeleton, which returns the transaction along with data that needs to be signed. You can see more information on how this process works here: http://dev.blockcypher.com/?javascript#creating-transactions 463 | * @callback cb 464 | * @param {Object} tx Transaction base you're using to build a TX. https://www.blockcypher.com/dev/bitcoin/#tx 465 | * @memberof Blockcy 466 | * @method newTX 467 | */ 468 | Blockcy.prototype.newTX = function (tx, cb) { 469 | this._post('/txs/new', {}, tx, function (error, body) { 470 | cb(error, body); 471 | }); 472 | }; 473 | 474 | /** 475 | * Send Transaction 476 | * Sends a signed transaction skeleton, which returns the completed transaction. You can read more information on how this process works here: http://dev.blockcypher.com/?javascript#creating-transactions 477 | * @callback cb 478 | * @param {Object} txskel Signed transaction skeleton you're sending. https://www.blockcypher.com/dev/bitcoin/#txskeleton 479 | * @memberof Blockcy 480 | * @method sendTX 481 | */ 482 | Blockcy.prototype.sendTX = function (txskel, cb) { 483 | this._post('/txs/send', {}, txskel, function (error, body) { 484 | cb(error, body); 485 | }); 486 | }; 487 | 488 | /** 489 | * Push Transaction 490 | * Pushes a raw, hex-serialized transaction. 491 | * @callback cb 492 | * @param {string} hex Hex-encoded transaction. 493 | * @memberof Blockcy 494 | * @method pushTX 495 | */ 496 | Blockcy.prototype.pushTX = function (hex, cb) { 497 | this._post('/txs/push', {}, { tx: hex }, function (error, body) { 498 | cb(error, body); 499 | }); 500 | }; 501 | 502 | /** 503 | * Decode Transaction 504 | * Decodes (but doesn't send!) a hex-serialized raw transaction. Useful for debugging issues with pushTX. 505 | * @callback cb 506 | * @param {string} hex Hex-encoded transaction. 507 | * @memberof Blockcy 508 | * @method pushTX 509 | */ 510 | Blockcy.prototype.decodeTX = function (hex, cb) { 511 | this._post('/txs/decode', {}, { tx: hex }, function (error, body) { 512 | cb(error, body); 513 | }); 514 | }; 515 | 516 | /** 517 | * Embed Transaction 518 | * Embeds data within a given blockchain. 519 | * @callback cb 520 | * @param {string} hex Hex-encoded data to embed. 521 | * @memberof Blockcy 522 | * @method pushTX 523 | */ 524 | Blockcy.prototype.embedData = function (hex, cb) { 525 | this._post('/txs/data', {}, { data: hex }, function (error, body) { 526 | cb(error, body); 527 | }); 528 | }; 529 | 530 | /** 531 | * Send Micro Transaction 532 | * Sends a transaction using private (or public) keys via the microtransaction API, as described here: http://dev.blockcypher.com/?javascript#microtransaction-endpoint 533 | * @callback cb 534 | * @param {Object} micro Microtransaction object. 535 | * @memberof Blockcy 536 | * @method microTX 537 | */ 538 | Blockcy.prototype.microTX = function (micro, cb) { 539 | this._post('/txs/micro', {}, micro, function (error, body) { 540 | cb(error, body); 541 | }); 542 | }; 543 | 544 | /** 545 | * Get Transaction Confidence 546 | * Get transaction confidence by hash. 547 | * @callback cb 548 | * @param {string} hash Hash of the transaction. 549 | * @memberof Blockcy 550 | * @method getTXConf 551 | */ 552 | Blockcy.prototype.getTXConf = function (hash, cb) { 553 | this._get('/txs/' + hash + '/confidence', {}, function (error, body) { 554 | cb(error, body); 555 | }); 556 | }; 557 | 558 | /** 559 | * Create Payment Forward 560 | * Creates a new payment forward. 561 | * @param {Object} data JSON Data used to create payment forward. 562 | * @param {String} data.destination Destination address 563 | * @param {String} data.callback_url callback url 564 | * @callback cb 565 | * @memberof Blockcy 566 | * @method createPayFwd 567 | */ 568 | Blockcy.prototype.createPayFwd = function (data, cb) { 569 | this._post('/payments', {}, data, function (error, body) { 570 | cb(error, body); 571 | }); 572 | }; 573 | 574 | /** 575 | * List Payment Forwards 576 | * Lists current payments associated with this blockchain and token. 577 | * @callback cb 578 | * @memberof Blockcy 579 | * @method listPayFwds 580 | */ 581 | Blockcy.prototype.listPayFwds = function (cb) { 582 | this._get('/payments', {}, function (error, body) { 583 | cb(error, body); 584 | }); 585 | }; 586 | 587 | /** 588 | * Delete Payment Forward 589 | * Deletes payment forward by id. 590 | * @callback cb 591 | * @param {string} id ID of the payment forward you're deleting. 592 | * @memberof Blockcy 593 | * @method delPayFwd 594 | */ 595 | Blockcy.prototype.delPayFwd = function (id, cb) { 596 | this._del('/payments/' + id, {}, function (error, body) { 597 | cb(error, body); 598 | }); 599 | }; 600 | 601 | /** 602 | * Create WebHook 603 | * Creates a new webhook. 604 | * @param {Object} data JSON Data used to create webhook. 605 | * @param {String} data.event Event name 606 | * @param {String} data.address address 607 | * @param {String} data.url url 608 | * @callback cb 609 | * @memberof Blockcy 610 | * @method createHook 611 | */ 612 | Blockcy.prototype.createHook = function (data, cb) { 613 | this._post('/hooks', {}, data, function (error, body) { 614 | cb(error, body); 615 | }); 616 | }; 617 | 618 | /** 619 | * List WebHooks 620 | * Lists current webhooks associated with this blockchain and token. 621 | * @callback cb 622 | * @memberof Blockcy 623 | * @method listHooks 624 | */ 625 | Blockcy.prototype.listHooks = function (cb) { 626 | this._get('/hooks', {}, function (error, body) { 627 | cb(error, body); 628 | }); 629 | }; 630 | 631 | /** 632 | * Get WebHook 633 | * Get information about a WebHook based on its ID. 634 | * @param {string} id ID of the WebHook you're querying. 635 | * @callback cb 636 | * @memberof Blockcy 637 | * @method getHook 638 | */ 639 | Blockcy.prototype.getHook = function (id, cb) { 640 | this._get('/hooks/' + id, {}, function (error, body) { 641 | cb(error, body); 642 | }); 643 | }; 644 | 645 | /** 646 | * Delete WebHook 647 | * Deletes WebHook by its id. 648 | * @callback cb 649 | * @param {string} id ID of the WebHook you're deleting. 650 | * @memberof Blockcy 651 | * @method delPayFwd 652 | */ 653 | Blockcy.prototype.delHook = function (id, cb) { 654 | this._del('/hooks/' + id, {}, function (error, body) { 655 | cb(error, body); 656 | }); 657 | }; 658 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockcypher", 3 | "version": "0.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sinonjs/commons": { 8 | "version": "1.7.2", 9 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", 10 | "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", 11 | "dev": true, 12 | "requires": { 13 | "type-detect": "4.0.8" 14 | } 15 | }, 16 | "@sinonjs/fake-timers": { 17 | "version": "6.0.1", 18 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", 19 | "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", 20 | "dev": true, 21 | "requires": { 22 | "@sinonjs/commons": "^1.7.0" 23 | } 24 | }, 25 | "@sinonjs/formatio": { 26 | "version": "5.0.1", 27 | "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", 28 | "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", 29 | "dev": true, 30 | "requires": { 31 | "@sinonjs/commons": "^1", 32 | "@sinonjs/samsam": "^5.0.2" 33 | } 34 | }, 35 | "@sinonjs/samsam": { 36 | "version": "5.0.3", 37 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", 38 | "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", 39 | "dev": true, 40 | "requires": { 41 | "@sinonjs/commons": "^1.6.0", 42 | "lodash.get": "^4.4.2", 43 | "type-detect": "^4.0.8" 44 | } 45 | }, 46 | "@sinonjs/text-encoding": { 47 | "version": "0.7.1", 48 | "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", 49 | "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", 50 | "dev": true 51 | }, 52 | "abbrev": { 53 | "version": "1.0.9", 54 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 55 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 56 | "dev": true 57 | }, 58 | "amdefine": { 59 | "version": "1.0.1", 60 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 61 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 62 | "dev": true, 63 | "optional": true 64 | }, 65 | "ansi-colors": { 66 | "version": "3.2.3", 67 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 68 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 69 | "dev": true 70 | }, 71 | "ansi-regex": { 72 | "version": "3.0.0", 73 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 74 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 75 | "dev": true 76 | }, 77 | "ansi-styles": { 78 | "version": "3.2.1", 79 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 80 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 81 | "dev": true, 82 | "requires": { 83 | "color-convert": "^1.9.0" 84 | } 85 | }, 86 | "anymatch": { 87 | "version": "3.1.1", 88 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 89 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 90 | "dev": true, 91 | "requires": { 92 | "normalize-path": "^3.0.0", 93 | "picomatch": "^2.0.4" 94 | } 95 | }, 96 | "argparse": { 97 | "version": "1.0.10", 98 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 99 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 100 | "dev": true, 101 | "requires": { 102 | "sprintf-js": "~1.0.2" 103 | } 104 | }, 105 | "assertion-error": { 106 | "version": "1.1.0", 107 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 108 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 109 | "dev": true 110 | }, 111 | "async": { 112 | "version": "1.5.2", 113 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 114 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 115 | "dev": true 116 | }, 117 | "asynckit": { 118 | "version": "0.4.0", 119 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 120 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 121 | }, 122 | "balanced-match": { 123 | "version": "1.0.0", 124 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 125 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 126 | "dev": true 127 | }, 128 | "binary-extensions": { 129 | "version": "2.0.0", 130 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 131 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 132 | "dev": true 133 | }, 134 | "brace-expansion": { 135 | "version": "1.1.11", 136 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 137 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 138 | "dev": true, 139 | "requires": { 140 | "balanced-match": "^1.0.0", 141 | "concat-map": "0.0.1" 142 | } 143 | }, 144 | "braces": { 145 | "version": "3.0.2", 146 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 147 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 148 | "dev": true, 149 | "requires": { 150 | "fill-range": "^7.0.1" 151 | } 152 | }, 153 | "browser-stdout": { 154 | "version": "1.3.1", 155 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 156 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 157 | "dev": true 158 | }, 159 | "camelcase": { 160 | "version": "5.3.1", 161 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 162 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 163 | "dev": true 164 | }, 165 | "chai": { 166 | "version": "4.2.0", 167 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 168 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 169 | "dev": true, 170 | "requires": { 171 | "assertion-error": "^1.1.0", 172 | "check-error": "^1.0.2", 173 | "deep-eql": "^3.0.1", 174 | "get-func-name": "^2.0.0", 175 | "pathval": "^1.1.0", 176 | "type-detect": "^4.0.5" 177 | } 178 | }, 179 | "chalk": { 180 | "version": "2.4.2", 181 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 182 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 183 | "dev": true, 184 | "requires": { 185 | "ansi-styles": "^3.2.1", 186 | "escape-string-regexp": "^1.0.5", 187 | "supports-color": "^5.3.0" 188 | }, 189 | "dependencies": { 190 | "has-flag": { 191 | "version": "3.0.0", 192 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 193 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 194 | "dev": true 195 | }, 196 | "supports-color": { 197 | "version": "5.5.0", 198 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 199 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 200 | "dev": true, 201 | "requires": { 202 | "has-flag": "^3.0.0" 203 | } 204 | } 205 | } 206 | }, 207 | "check-error": { 208 | "version": "1.0.2", 209 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 210 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 211 | "dev": true 212 | }, 213 | "chokidar": { 214 | "version": "3.3.0", 215 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 216 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 217 | "dev": true, 218 | "requires": { 219 | "anymatch": "~3.1.1", 220 | "braces": "~3.0.2", 221 | "fsevents": "~2.1.1", 222 | "glob-parent": "~5.1.0", 223 | "is-binary-path": "~2.1.0", 224 | "is-glob": "~4.0.1", 225 | "normalize-path": "~3.0.0", 226 | "readdirp": "~3.2.0" 227 | } 228 | }, 229 | "cliui": { 230 | "version": "5.0.0", 231 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 232 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 233 | "dev": true, 234 | "requires": { 235 | "string-width": "^3.1.0", 236 | "strip-ansi": "^5.2.0", 237 | "wrap-ansi": "^5.1.0" 238 | }, 239 | "dependencies": { 240 | "ansi-regex": { 241 | "version": "4.1.0", 242 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 243 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 244 | "dev": true 245 | }, 246 | "string-width": { 247 | "version": "3.1.0", 248 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 249 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 250 | "dev": true, 251 | "requires": { 252 | "emoji-regex": "^7.0.1", 253 | "is-fullwidth-code-point": "^2.0.0", 254 | "strip-ansi": "^5.1.0" 255 | } 256 | }, 257 | "strip-ansi": { 258 | "version": "5.2.0", 259 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 260 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 261 | "dev": true, 262 | "requires": { 263 | "ansi-regex": "^4.1.0" 264 | } 265 | } 266 | } 267 | }, 268 | "color-convert": { 269 | "version": "1.9.3", 270 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 271 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 272 | "dev": true, 273 | "requires": { 274 | "color-name": "1.1.3" 275 | } 276 | }, 277 | "color-name": { 278 | "version": "1.1.3", 279 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 280 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 281 | "dev": true 282 | }, 283 | "combined-stream": { 284 | "version": "1.0.8", 285 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 286 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 287 | "requires": { 288 | "delayed-stream": "~1.0.0" 289 | } 290 | }, 291 | "commander": { 292 | "version": "2.20.3", 293 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 294 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 295 | "dev": true, 296 | "optional": true 297 | }, 298 | "component-emitter": { 299 | "version": "1.3.0", 300 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 301 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 302 | }, 303 | "concat-map": { 304 | "version": "0.0.1", 305 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 306 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 307 | "dev": true 308 | }, 309 | "cookiejar": { 310 | "version": "2.1.2", 311 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", 312 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" 313 | }, 314 | "debug": { 315 | "version": "3.2.6", 316 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 317 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 318 | "dev": true, 319 | "requires": { 320 | "ms": "^2.1.1" 321 | } 322 | }, 323 | "decamelize": { 324 | "version": "1.2.0", 325 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 326 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 327 | "dev": true 328 | }, 329 | "deep-eql": { 330 | "version": "3.0.1", 331 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 332 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 333 | "dev": true, 334 | "requires": { 335 | "type-detect": "^4.0.0" 336 | } 337 | }, 338 | "deep-is": { 339 | "version": "0.1.3", 340 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 341 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 342 | "dev": true 343 | }, 344 | "define-properties": { 345 | "version": "1.1.3", 346 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 347 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 348 | "dev": true, 349 | "requires": { 350 | "object-keys": "^1.0.12" 351 | } 352 | }, 353 | "delayed-stream": { 354 | "version": "1.0.0", 355 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 356 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 357 | }, 358 | "diff": { 359 | "version": "3.5.0", 360 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 361 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 362 | "dev": true 363 | }, 364 | "emoji-regex": { 365 | "version": "7.0.3", 366 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 367 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 368 | "dev": true 369 | }, 370 | "es-abstract": { 371 | "version": "1.17.5", 372 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 373 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 374 | "dev": true, 375 | "requires": { 376 | "es-to-primitive": "^1.2.1", 377 | "function-bind": "^1.1.1", 378 | "has": "^1.0.3", 379 | "has-symbols": "^1.0.1", 380 | "is-callable": "^1.1.5", 381 | "is-regex": "^1.0.5", 382 | "object-inspect": "^1.7.0", 383 | "object-keys": "^1.1.1", 384 | "object.assign": "^4.1.0", 385 | "string.prototype.trimleft": "^2.1.1", 386 | "string.prototype.trimright": "^2.1.1" 387 | } 388 | }, 389 | "es-to-primitive": { 390 | "version": "1.2.1", 391 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 392 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 393 | "dev": true, 394 | "requires": { 395 | "is-callable": "^1.1.4", 396 | "is-date-object": "^1.0.1", 397 | "is-symbol": "^1.0.2" 398 | } 399 | }, 400 | "escape-string-regexp": { 401 | "version": "1.0.5", 402 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 403 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 404 | "dev": true 405 | }, 406 | "escodegen": { 407 | "version": "1.8.1", 408 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 409 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 410 | "dev": true, 411 | "requires": { 412 | "esprima": "^2.7.1", 413 | "estraverse": "^1.9.1", 414 | "esutils": "^2.0.2", 415 | "optionator": "^0.8.1", 416 | "source-map": "~0.2.0" 417 | } 418 | }, 419 | "esprima": { 420 | "version": "2.7.3", 421 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 422 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 423 | "dev": true 424 | }, 425 | "estraverse": { 426 | "version": "1.9.3", 427 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 428 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 429 | "dev": true 430 | }, 431 | "esutils": { 432 | "version": "2.0.3", 433 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 434 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 435 | "dev": true 436 | }, 437 | "fast-levenshtein": { 438 | "version": "2.0.6", 439 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 440 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 441 | "dev": true 442 | }, 443 | "fast-safe-stringify": { 444 | "version": "2.0.7", 445 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 446 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 447 | }, 448 | "fill-range": { 449 | "version": "7.0.1", 450 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 451 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 452 | "dev": true, 453 | "requires": { 454 | "to-regex-range": "^5.0.1" 455 | } 456 | }, 457 | "find-up": { 458 | "version": "3.0.0", 459 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 460 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 461 | "dev": true, 462 | "requires": { 463 | "locate-path": "^3.0.0" 464 | } 465 | }, 466 | "flat": { 467 | "version": "4.1.0", 468 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 469 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 470 | "dev": true, 471 | "requires": { 472 | "is-buffer": "~2.0.3" 473 | } 474 | }, 475 | "formidable": { 476 | "version": "1.2.2", 477 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 478 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" 479 | }, 480 | "fs.realpath": { 481 | "version": "1.0.0", 482 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 483 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 484 | "dev": true 485 | }, 486 | "fsevents": { 487 | "version": "2.1.3", 488 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 489 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 490 | "dev": true, 491 | "optional": true 492 | }, 493 | "function-bind": { 494 | "version": "1.1.1", 495 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 496 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 497 | "dev": true 498 | }, 499 | "get-caller-file": { 500 | "version": "2.0.5", 501 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 502 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 503 | "dev": true 504 | }, 505 | "get-func-name": { 506 | "version": "2.0.0", 507 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 508 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 509 | "dev": true 510 | }, 511 | "glob": { 512 | "version": "5.0.15", 513 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 514 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 515 | "dev": true, 516 | "requires": { 517 | "inflight": "^1.0.4", 518 | "inherits": "2", 519 | "minimatch": "2 || 3", 520 | "once": "^1.3.0", 521 | "path-is-absolute": "^1.0.0" 522 | } 523 | }, 524 | "glob-parent": { 525 | "version": "5.1.1", 526 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 527 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 528 | "dev": true, 529 | "requires": { 530 | "is-glob": "^4.0.1" 531 | } 532 | }, 533 | "growl": { 534 | "version": "1.10.5", 535 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 536 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 537 | "dev": true 538 | }, 539 | "handlebars": { 540 | "version": "4.7.6", 541 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", 542 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", 543 | "dev": true, 544 | "requires": { 545 | "minimist": "^1.2.5", 546 | "neo-async": "^2.6.0", 547 | "source-map": "^0.6.1", 548 | "uglify-js": "^3.1.4", 549 | "wordwrap": "^1.0.0" 550 | }, 551 | "dependencies": { 552 | "source-map": { 553 | "version": "0.6.1", 554 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 555 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 556 | "dev": true 557 | } 558 | } 559 | }, 560 | "has": { 561 | "version": "1.0.3", 562 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 563 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 564 | "dev": true, 565 | "requires": { 566 | "function-bind": "^1.1.1" 567 | } 568 | }, 569 | "has-flag": { 570 | "version": "1.0.0", 571 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 572 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 573 | "dev": true 574 | }, 575 | "has-symbols": { 576 | "version": "1.0.1", 577 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 578 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 579 | "dev": true 580 | }, 581 | "he": { 582 | "version": "1.2.0", 583 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 584 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 585 | "dev": true 586 | }, 587 | "inflight": { 588 | "version": "1.0.6", 589 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 590 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 591 | "dev": true, 592 | "requires": { 593 | "once": "^1.3.0", 594 | "wrappy": "1" 595 | } 596 | }, 597 | "inherits": { 598 | "version": "2.0.4", 599 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 600 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 601 | }, 602 | "is-binary-path": { 603 | "version": "2.1.0", 604 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 605 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 606 | "dev": true, 607 | "requires": { 608 | "binary-extensions": "^2.0.0" 609 | } 610 | }, 611 | "is-buffer": { 612 | "version": "2.0.4", 613 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 614 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 615 | "dev": true 616 | }, 617 | "is-callable": { 618 | "version": "1.1.5", 619 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 620 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 621 | "dev": true 622 | }, 623 | "is-date-object": { 624 | "version": "1.0.2", 625 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 626 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 627 | "dev": true 628 | }, 629 | "is-extglob": { 630 | "version": "2.1.1", 631 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 632 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 633 | "dev": true 634 | }, 635 | "is-fullwidth-code-point": { 636 | "version": "2.0.0", 637 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 638 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 639 | "dev": true 640 | }, 641 | "is-glob": { 642 | "version": "4.0.1", 643 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 644 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 645 | "dev": true, 646 | "requires": { 647 | "is-extglob": "^2.1.1" 648 | } 649 | }, 650 | "is-number": { 651 | "version": "7.0.0", 652 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 653 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 654 | "dev": true 655 | }, 656 | "is-regex": { 657 | "version": "1.0.5", 658 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 659 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 660 | "dev": true, 661 | "requires": { 662 | "has": "^1.0.3" 663 | } 664 | }, 665 | "is-symbol": { 666 | "version": "1.0.3", 667 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 668 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 669 | "dev": true, 670 | "requires": { 671 | "has-symbols": "^1.0.1" 672 | } 673 | }, 674 | "isarray": { 675 | "version": "0.0.1", 676 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 677 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 678 | "dev": true 679 | }, 680 | "isexe": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 683 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 684 | "dev": true 685 | }, 686 | "istanbul": { 687 | "version": "0.4.5", 688 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 689 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 690 | "dev": true, 691 | "requires": { 692 | "abbrev": "1.0.x", 693 | "async": "1.x", 694 | "escodegen": "1.8.x", 695 | "esprima": "2.7.x", 696 | "glob": "^5.0.15", 697 | "handlebars": "^4.0.1", 698 | "js-yaml": "3.x", 699 | "mkdirp": "0.5.x", 700 | "nopt": "3.x", 701 | "once": "1.x", 702 | "resolve": "1.1.x", 703 | "supports-color": "^3.1.0", 704 | "which": "^1.1.1", 705 | "wordwrap": "^1.0.0" 706 | } 707 | }, 708 | "js-yaml": { 709 | "version": "3.13.1", 710 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 711 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 712 | "dev": true, 713 | "requires": { 714 | "argparse": "^1.0.7", 715 | "esprima": "^4.0.0" 716 | }, 717 | "dependencies": { 718 | "esprima": { 719 | "version": "4.0.1", 720 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 721 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 722 | "dev": true 723 | } 724 | } 725 | }, 726 | "just-extend": { 727 | "version": "4.1.0", 728 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", 729 | "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", 730 | "dev": true 731 | }, 732 | "levn": { 733 | "version": "0.3.0", 734 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 735 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 736 | "dev": true, 737 | "requires": { 738 | "prelude-ls": "~1.1.2", 739 | "type-check": "~0.3.2" 740 | } 741 | }, 742 | "locate-path": { 743 | "version": "3.0.0", 744 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 745 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 746 | "dev": true, 747 | "requires": { 748 | "p-locate": "^3.0.0", 749 | "path-exists": "^3.0.0" 750 | } 751 | }, 752 | "lodash": { 753 | "version": "4.17.19", 754 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 755 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 756 | "dev": true 757 | }, 758 | "lodash.get": { 759 | "version": "4.4.2", 760 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 761 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", 762 | "dev": true 763 | }, 764 | "log-symbols": { 765 | "version": "3.0.0", 766 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 767 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 768 | "dev": true, 769 | "requires": { 770 | "chalk": "^2.4.2" 771 | } 772 | }, 773 | "methods": { 774 | "version": "1.1.2", 775 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 776 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 777 | }, 778 | "mime": { 779 | "version": "2.4.5", 780 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", 781 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" 782 | }, 783 | "mime-db": { 784 | "version": "1.44.0", 785 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 786 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 787 | }, 788 | "mime-types": { 789 | "version": "2.1.27", 790 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 791 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 792 | "requires": { 793 | "mime-db": "1.44.0" 794 | } 795 | }, 796 | "minimatch": { 797 | "version": "3.0.4", 798 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 799 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 800 | "dev": true, 801 | "requires": { 802 | "brace-expansion": "^1.1.7" 803 | } 804 | }, 805 | "minimist": { 806 | "version": "1.2.5", 807 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 808 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 809 | "dev": true 810 | }, 811 | "mkdirp": { 812 | "version": "0.5.5", 813 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 814 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 815 | "dev": true, 816 | "requires": { 817 | "minimist": "^1.2.5" 818 | } 819 | }, 820 | "mocha": { 821 | "version": "7.1.2", 822 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", 823 | "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", 824 | "dev": true, 825 | "requires": { 826 | "ansi-colors": "3.2.3", 827 | "browser-stdout": "1.3.1", 828 | "chokidar": "3.3.0", 829 | "debug": "3.2.6", 830 | "diff": "3.5.0", 831 | "escape-string-regexp": "1.0.5", 832 | "find-up": "3.0.0", 833 | "glob": "7.1.3", 834 | "growl": "1.10.5", 835 | "he": "1.2.0", 836 | "js-yaml": "3.13.1", 837 | "log-symbols": "3.0.0", 838 | "minimatch": "3.0.4", 839 | "mkdirp": "0.5.5", 840 | "ms": "2.1.1", 841 | "node-environment-flags": "1.0.6", 842 | "object.assign": "4.1.0", 843 | "strip-json-comments": "2.0.1", 844 | "supports-color": "6.0.0", 845 | "which": "1.3.1", 846 | "wide-align": "1.1.3", 847 | "yargs": "13.3.2", 848 | "yargs-parser": "13.1.2", 849 | "yargs-unparser": "1.6.0" 850 | }, 851 | "dependencies": { 852 | "glob": { 853 | "version": "7.1.3", 854 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 855 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 856 | "dev": true, 857 | "requires": { 858 | "fs.realpath": "^1.0.0", 859 | "inflight": "^1.0.4", 860 | "inherits": "2", 861 | "minimatch": "^3.0.4", 862 | "once": "^1.3.0", 863 | "path-is-absolute": "^1.0.0" 864 | } 865 | }, 866 | "has-flag": { 867 | "version": "3.0.0", 868 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 869 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 870 | "dev": true 871 | }, 872 | "supports-color": { 873 | "version": "6.0.0", 874 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 875 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 876 | "dev": true, 877 | "requires": { 878 | "has-flag": "^3.0.0" 879 | } 880 | } 881 | } 882 | }, 883 | "ms": { 884 | "version": "2.1.1", 885 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 886 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 887 | }, 888 | "neo-async": { 889 | "version": "2.6.1", 890 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", 891 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", 892 | "dev": true 893 | }, 894 | "nise": { 895 | "version": "4.0.3", 896 | "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", 897 | "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", 898 | "dev": true, 899 | "requires": { 900 | "@sinonjs/commons": "^1.7.0", 901 | "@sinonjs/fake-timers": "^6.0.0", 902 | "@sinonjs/text-encoding": "^0.7.1", 903 | "just-extend": "^4.0.2", 904 | "path-to-regexp": "^1.7.0" 905 | } 906 | }, 907 | "node-environment-flags": { 908 | "version": "1.0.6", 909 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 910 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 911 | "dev": true, 912 | "requires": { 913 | "object.getownpropertydescriptors": "^2.0.3", 914 | "semver": "^5.7.0" 915 | } 916 | }, 917 | "nopt": { 918 | "version": "3.0.6", 919 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 920 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 921 | "dev": true, 922 | "requires": { 923 | "abbrev": "1" 924 | } 925 | }, 926 | "normalize-path": { 927 | "version": "3.0.0", 928 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 929 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 930 | "dev": true 931 | }, 932 | "object-inspect": { 933 | "version": "1.7.0", 934 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 935 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 936 | "dev": true 937 | }, 938 | "object-keys": { 939 | "version": "1.1.1", 940 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 941 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 942 | "dev": true 943 | }, 944 | "object.assign": { 945 | "version": "4.1.0", 946 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 947 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 948 | "dev": true, 949 | "requires": { 950 | "define-properties": "^1.1.2", 951 | "function-bind": "^1.1.1", 952 | "has-symbols": "^1.0.0", 953 | "object-keys": "^1.0.11" 954 | } 955 | }, 956 | "object.getownpropertydescriptors": { 957 | "version": "2.1.0", 958 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 959 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 960 | "dev": true, 961 | "requires": { 962 | "define-properties": "^1.1.3", 963 | "es-abstract": "^1.17.0-next.1" 964 | } 965 | }, 966 | "once": { 967 | "version": "1.4.0", 968 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 969 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 970 | "dev": true, 971 | "requires": { 972 | "wrappy": "1" 973 | } 974 | }, 975 | "optionator": { 976 | "version": "0.8.3", 977 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 978 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 979 | "dev": true, 980 | "requires": { 981 | "deep-is": "~0.1.3", 982 | "fast-levenshtein": "~2.0.6", 983 | "levn": "~0.3.0", 984 | "prelude-ls": "~1.1.2", 985 | "type-check": "~0.3.2", 986 | "word-wrap": "~1.2.3" 987 | } 988 | }, 989 | "p-limit": { 990 | "version": "2.3.0", 991 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 992 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 993 | "dev": true, 994 | "requires": { 995 | "p-try": "^2.0.0" 996 | } 997 | }, 998 | "p-locate": { 999 | "version": "3.0.0", 1000 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1001 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1002 | "dev": true, 1003 | "requires": { 1004 | "p-limit": "^2.0.0" 1005 | } 1006 | }, 1007 | "p-try": { 1008 | "version": "2.2.0", 1009 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1010 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1011 | "dev": true 1012 | }, 1013 | "path-exists": { 1014 | "version": "3.0.0", 1015 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1016 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1017 | "dev": true 1018 | }, 1019 | "path-is-absolute": { 1020 | "version": "1.0.1", 1021 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1022 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1023 | "dev": true 1024 | }, 1025 | "path-to-regexp": { 1026 | "version": "1.8.0", 1027 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 1028 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 1029 | "dev": true, 1030 | "requires": { 1031 | "isarray": "0.0.1" 1032 | } 1033 | }, 1034 | "pathval": { 1035 | "version": "1.1.0", 1036 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1037 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1038 | "dev": true 1039 | }, 1040 | "picomatch": { 1041 | "version": "2.2.2", 1042 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1043 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1044 | "dev": true 1045 | }, 1046 | "prelude-ls": { 1047 | "version": "1.1.2", 1048 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1049 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1050 | "dev": true 1051 | }, 1052 | "readable-stream": { 1053 | "version": "3.6.0", 1054 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1055 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1056 | "requires": { 1057 | "inherits": "^2.0.3", 1058 | "string_decoder": "^1.1.1", 1059 | "util-deprecate": "^1.0.1" 1060 | } 1061 | }, 1062 | "readdirp": { 1063 | "version": "3.2.0", 1064 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 1065 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 1066 | "dev": true, 1067 | "requires": { 1068 | "picomatch": "^2.0.4" 1069 | } 1070 | }, 1071 | "require-directory": { 1072 | "version": "2.1.1", 1073 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1074 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1075 | "dev": true 1076 | }, 1077 | "require-main-filename": { 1078 | "version": "2.0.0", 1079 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1080 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1081 | "dev": true 1082 | }, 1083 | "resolve": { 1084 | "version": "1.1.7", 1085 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1086 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 1087 | "dev": true 1088 | }, 1089 | "safe-buffer": { 1090 | "version": "5.2.0", 1091 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 1092 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 1093 | }, 1094 | "semver": { 1095 | "version": "5.7.1", 1096 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1097 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1098 | "dev": true 1099 | }, 1100 | "set-blocking": { 1101 | "version": "2.0.0", 1102 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1103 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1104 | "dev": true 1105 | }, 1106 | "sinon": { 1107 | "version": "9.0.2", 1108 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz", 1109 | "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==", 1110 | "dev": true, 1111 | "requires": { 1112 | "@sinonjs/commons": "^1.7.2", 1113 | "@sinonjs/fake-timers": "^6.0.1", 1114 | "@sinonjs/formatio": "^5.0.1", 1115 | "@sinonjs/samsam": "^5.0.3", 1116 | "diff": "^4.0.2", 1117 | "nise": "^4.0.1", 1118 | "supports-color": "^7.1.0" 1119 | }, 1120 | "dependencies": { 1121 | "diff": { 1122 | "version": "4.0.2", 1123 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1124 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1125 | "dev": true 1126 | }, 1127 | "has-flag": { 1128 | "version": "4.0.0", 1129 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1130 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1131 | "dev": true 1132 | }, 1133 | "supports-color": { 1134 | "version": "7.1.0", 1135 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 1136 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 1137 | "dev": true, 1138 | "requires": { 1139 | "has-flag": "^4.0.0" 1140 | } 1141 | } 1142 | } 1143 | }, 1144 | "sinon-test": { 1145 | "version": "3.0.0", 1146 | "resolved": "https://registry.npmjs.org/sinon-test/-/sinon-test-3.0.0.tgz", 1147 | "integrity": "sha512-k2V042JwIS6SC3M8Ih3Uo6+6mlL5FKqvvobxoWQobFkACr61WpyAMKsfqXecLL+DrDD3s9T+eYSZdVQzMH1pkA==", 1148 | "dev": true 1149 | }, 1150 | "source-map": { 1151 | "version": "0.2.0", 1152 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 1153 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 1154 | "dev": true, 1155 | "optional": true, 1156 | "requires": { 1157 | "amdefine": ">=0.0.4" 1158 | } 1159 | }, 1160 | "sprintf-js": { 1161 | "version": "1.0.3", 1162 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1163 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1164 | "dev": true 1165 | }, 1166 | "string-width": { 1167 | "version": "2.1.1", 1168 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1169 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1170 | "dev": true, 1171 | "requires": { 1172 | "is-fullwidth-code-point": "^2.0.0", 1173 | "strip-ansi": "^4.0.0" 1174 | } 1175 | }, 1176 | "string.prototype.trimend": { 1177 | "version": "1.0.1", 1178 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1179 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1180 | "dev": true, 1181 | "requires": { 1182 | "define-properties": "^1.1.3", 1183 | "es-abstract": "^1.17.5" 1184 | } 1185 | }, 1186 | "string.prototype.trimleft": { 1187 | "version": "2.1.2", 1188 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 1189 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 1190 | "dev": true, 1191 | "requires": { 1192 | "define-properties": "^1.1.3", 1193 | "es-abstract": "^1.17.5", 1194 | "string.prototype.trimstart": "^1.0.0" 1195 | } 1196 | }, 1197 | "string.prototype.trimright": { 1198 | "version": "2.1.2", 1199 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 1200 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 1201 | "dev": true, 1202 | "requires": { 1203 | "define-properties": "^1.1.3", 1204 | "es-abstract": "^1.17.5", 1205 | "string.prototype.trimend": "^1.0.0" 1206 | } 1207 | }, 1208 | "string.prototype.trimstart": { 1209 | "version": "1.0.1", 1210 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1211 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1212 | "dev": true, 1213 | "requires": { 1214 | "define-properties": "^1.1.3", 1215 | "es-abstract": "^1.17.5" 1216 | } 1217 | }, 1218 | "string_decoder": { 1219 | "version": "1.3.0", 1220 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1221 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1222 | "requires": { 1223 | "safe-buffer": "~5.2.0" 1224 | } 1225 | }, 1226 | "strip-ansi": { 1227 | "version": "4.0.0", 1228 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1229 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1230 | "dev": true, 1231 | "requires": { 1232 | "ansi-regex": "^3.0.0" 1233 | } 1234 | }, 1235 | "strip-json-comments": { 1236 | "version": "2.0.1", 1237 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1238 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1239 | "dev": true 1240 | }, 1241 | "superagent": { 1242 | "version": "5.2.2", 1243 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz", 1244 | "integrity": "sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==", 1245 | "requires": { 1246 | "component-emitter": "^1.3.0", 1247 | "cookiejar": "^2.1.2", 1248 | "debug": "^4.1.1", 1249 | "fast-safe-stringify": "^2.0.7", 1250 | "form-data": "^3.0.0", 1251 | "formidable": "^1.2.1", 1252 | "methods": "^1.1.2", 1253 | "mime": "^2.4.4", 1254 | "qs": "^6.9.1", 1255 | "readable-stream": "^3.4.0", 1256 | "semver": "^6.3.0" 1257 | }, 1258 | "dependencies": { 1259 | "debug": { 1260 | "version": "4.1.1", 1261 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1262 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1263 | "requires": { 1264 | "ms": "^2.1.1" 1265 | } 1266 | }, 1267 | "form-data": { 1268 | "version": "3.0.0", 1269 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 1270 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 1271 | "requires": { 1272 | "asynckit": "^0.4.0", 1273 | "combined-stream": "^1.0.8", 1274 | "mime-types": "^2.1.12" 1275 | } 1276 | }, 1277 | "qs": { 1278 | "version": "6.9.4", 1279 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 1280 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 1281 | }, 1282 | "semver": { 1283 | "version": "6.3.0", 1284 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1285 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1286 | } 1287 | } 1288 | }, 1289 | "supports-color": { 1290 | "version": "3.2.3", 1291 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1292 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1293 | "dev": true, 1294 | "requires": { 1295 | "has-flag": "^1.0.0" 1296 | } 1297 | }, 1298 | "to-regex-range": { 1299 | "version": "5.0.1", 1300 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1301 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1302 | "dev": true, 1303 | "requires": { 1304 | "is-number": "^7.0.0" 1305 | } 1306 | }, 1307 | "type-check": { 1308 | "version": "0.3.2", 1309 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1310 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1311 | "dev": true, 1312 | "requires": { 1313 | "prelude-ls": "~1.1.2" 1314 | } 1315 | }, 1316 | "type-detect": { 1317 | "version": "4.0.8", 1318 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1319 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1320 | "dev": true 1321 | }, 1322 | "uglify-js": { 1323 | "version": "3.9.2", 1324 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.2.tgz", 1325 | "integrity": "sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q==", 1326 | "dev": true, 1327 | "optional": true, 1328 | "requires": { 1329 | "commander": "~2.20.3" 1330 | } 1331 | }, 1332 | "util-deprecate": { 1333 | "version": "1.0.2", 1334 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1335 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1336 | }, 1337 | "which": { 1338 | "version": "1.3.1", 1339 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1340 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1341 | "dev": true, 1342 | "requires": { 1343 | "isexe": "^2.0.0" 1344 | } 1345 | }, 1346 | "which-module": { 1347 | "version": "2.0.0", 1348 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1349 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1350 | "dev": true 1351 | }, 1352 | "wide-align": { 1353 | "version": "1.1.3", 1354 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1355 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1356 | "dev": true, 1357 | "requires": { 1358 | "string-width": "^1.0.2 || 2" 1359 | } 1360 | }, 1361 | "word-wrap": { 1362 | "version": "1.2.3", 1363 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1364 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1365 | "dev": true 1366 | }, 1367 | "wordwrap": { 1368 | "version": "1.0.0", 1369 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1370 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1371 | "dev": true 1372 | }, 1373 | "wrap-ansi": { 1374 | "version": "5.1.0", 1375 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1376 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1377 | "dev": true, 1378 | "requires": { 1379 | "ansi-styles": "^3.2.0", 1380 | "string-width": "^3.0.0", 1381 | "strip-ansi": "^5.0.0" 1382 | }, 1383 | "dependencies": { 1384 | "ansi-regex": { 1385 | "version": "4.1.0", 1386 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1387 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1388 | "dev": true 1389 | }, 1390 | "string-width": { 1391 | "version": "3.1.0", 1392 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1393 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1394 | "dev": true, 1395 | "requires": { 1396 | "emoji-regex": "^7.0.1", 1397 | "is-fullwidth-code-point": "^2.0.0", 1398 | "strip-ansi": "^5.1.0" 1399 | } 1400 | }, 1401 | "strip-ansi": { 1402 | "version": "5.2.0", 1403 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1404 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1405 | "dev": true, 1406 | "requires": { 1407 | "ansi-regex": "^4.1.0" 1408 | } 1409 | } 1410 | } 1411 | }, 1412 | "wrappy": { 1413 | "version": "1.0.2", 1414 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1415 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1416 | "dev": true 1417 | }, 1418 | "xtend": { 1419 | "version": "4.0.2", 1420 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1421 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1422 | }, 1423 | "y18n": { 1424 | "version": "4.0.0", 1425 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1426 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1427 | "dev": true 1428 | }, 1429 | "yargs": { 1430 | "version": "13.3.2", 1431 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 1432 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 1433 | "dev": true, 1434 | "requires": { 1435 | "cliui": "^5.0.0", 1436 | "find-up": "^3.0.0", 1437 | "get-caller-file": "^2.0.1", 1438 | "require-directory": "^2.1.1", 1439 | "require-main-filename": "^2.0.0", 1440 | "set-blocking": "^2.0.0", 1441 | "string-width": "^3.0.0", 1442 | "which-module": "^2.0.0", 1443 | "y18n": "^4.0.0", 1444 | "yargs-parser": "^13.1.2" 1445 | }, 1446 | "dependencies": { 1447 | "ansi-regex": { 1448 | "version": "4.1.0", 1449 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1450 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1451 | "dev": true 1452 | }, 1453 | "string-width": { 1454 | "version": "3.1.0", 1455 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1456 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1457 | "dev": true, 1458 | "requires": { 1459 | "emoji-regex": "^7.0.1", 1460 | "is-fullwidth-code-point": "^2.0.0", 1461 | "strip-ansi": "^5.1.0" 1462 | } 1463 | }, 1464 | "strip-ansi": { 1465 | "version": "5.2.0", 1466 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1467 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1468 | "dev": true, 1469 | "requires": { 1470 | "ansi-regex": "^4.1.0" 1471 | } 1472 | } 1473 | } 1474 | }, 1475 | "yargs-parser": { 1476 | "version": "13.1.2", 1477 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1478 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1479 | "dev": true, 1480 | "requires": { 1481 | "camelcase": "^5.0.0", 1482 | "decamelize": "^1.2.0" 1483 | } 1484 | }, 1485 | "yargs-unparser": { 1486 | "version": "1.6.0", 1487 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1488 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1489 | "dev": true, 1490 | "requires": { 1491 | "flat": "^4.1.0", 1492 | "lodash": "^4.17.15", 1493 | "yargs": "^13.3.0" 1494 | } 1495 | } 1496 | } 1497 | } 1498 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blockcypher", 3 | "main": "./lib/bcypher.js", 4 | "version": "0.3.0", 5 | "description": "A REST API client for BlockCypher", 6 | "repository": "https://github.com/blockcypher/node-client", 7 | "license": "MIT", 8 | "engines": { 9 | "node": ">=4.0.0" 10 | }, 11 | "dependencies": { 12 | "superagent": "^5.2.2", 13 | "xtend": "^4.0.1" 14 | }, 15 | "scripts": { 16 | "test": "istanbul cover _mocha -- --reporter list --recursive ./tests/unit/" 17 | }, 18 | "devDependencies": { 19 | "chai": "^4.2.0", 20 | "istanbul": "^0.4.5", 21 | "mocha": "^7.1.2", 22 | "sinon": "^9.0.2", 23 | "sinon-test": "^3.0.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/unit/_del.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | 11 | let BlockCypher = require('../../lib/bcypher'); 12 | let chain = 'btc'; 13 | let network = 'main'; 14 | let token = process.env.TOKEN; 15 | let bcapi = new BlockCypher(chain, network, token); 16 | 17 | 18 | describe('Blockcypher _del Method: ', function () { 19 | 20 | it('should return success statusCode 204 and return data', test(function (done) { 21 | let del = this.spy(bcapi._del).bind(bcapi); 22 | let validReturn = { data: { key1: 'value', key2: 2 } }; 23 | 24 | this.stub(request, 'del').yields(null, { statusCode: 204 }, validReturn); 25 | bcapi._del('/', {}, function (e, r) { 26 | 27 | var callArgs = request.del.getCall(0).args[0]; 28 | expect(callArgs.qs).to.deep.equal({ token: token }); 29 | expect(callArgs.strictSSL).to.equal(true); 30 | expect(callArgs.json).to.equal(true); 31 | 32 | expect(Object.keys(callArgs).length).to.equal(4); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | it('should return success statusCode 200 and return data', test(function (done) { 41 | let del = this.spy(bcapi._del).bind(bcapi); 42 | let validReturn = { data: { key1: 'value', key2: 2 } }; 43 | 44 | this.stub(request, 'del').yields(null, { statusCode: 200 }, validReturn); 45 | bcapi._del('/', {}, function (e, r) { 46 | 47 | var callArgs = request.del.getCall(0).args[0]; 48 | expect(callArgs.qs).to.deep.equal({ token: token }); 49 | expect(callArgs.strictSSL).to.equal(true); 50 | expect(callArgs.json).to.equal(true); 51 | 52 | expect(Object.keys(callArgs).length).to.equal(4); 53 | 54 | expect(e).to.equal(null); 55 | expect(r).to.deep.equal(validReturn); 56 | done(); 57 | }); 58 | })); 59 | 60 | 61 | it('should return error and empty data when response body is null', test(function (done) { 62 | let del = this.spy(bcapi._del).bind(bcapi); 63 | let badRequestError = "Bad Request"; 64 | 65 | this.stub(request, 'del').yields(badRequestError, { statusCode: 400 }); 66 | bcapi._del('/', {}, function (e, r) { 67 | 68 | var callArgs = request.del.getCall(0).args[0]; 69 | expect(callArgs.qs).to.deep.equal({ token: token }); 70 | expect(callArgs.strictSSL).to.equal(true); 71 | expect(callArgs.json).to.equal(true); 72 | expect(Object.keys(callArgs).length).to.equal(4); 73 | 74 | expect(e).to.equal(badRequestError); 75 | expect(r).to.deep.equal({}); 76 | done(); 77 | }); 78 | })); 79 | 80 | it('should return error and data when response body exists', test(function (done) { 81 | let del = this.spy(bcapi._del).bind(bcapi); 82 | let badRequestError = "Bad Request"; 83 | let badRequestData = { message: 'badRequeset' }; 84 | 85 | this.stub(request, 'del').yields(badRequestError, { statusCode: 400 }, badRequestData); 86 | bcapi._del('/', {}, function (e, r) { 87 | 88 | var callArgs = request.del.getCall(0).args[0]; 89 | expect(callArgs.qs).to.deep.equal({ token: token }); 90 | expect(callArgs.strictSSL).to.equal(true); 91 | expect(callArgs.json).to.equal(true); 92 | expect(Object.keys(callArgs).length).to.equal(4); 93 | 94 | expect(e).to.equal(badRequestError); 95 | expect(r).to.deep.equal(badRequestData); 96 | done(); 97 | }); 98 | })); 99 | 100 | });//end of _del 101 | -------------------------------------------------------------------------------- /tests/unit/_get.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | 11 | let BlockCypher = require('../../lib/bcypher'); 12 | let chain = 'btc'; 13 | let network = 'main'; 14 | let token = process.env.TOKEN; 15 | let bcapi = new BlockCypher(chain, network, token); 16 | 17 | /* 18 | describe('Blockcypher _get Method: ', function () { 19 | 20 | it('should return success and return data', test(function (done) { 21 | let get = this.spy(bcapi._get).bind(bcapi); 22 | let validReturn = { data: { key1: 'value', key2: 2 } }; 23 | this.stub(request, 'get').yields(null, { statusCode: 200 }, validReturn); 24 | bcapi._get('/', {}, function (e, r) { 25 | 26 | var callArgs = request.get.getCall(0).args[0]; 27 | expect(callArgs.qs).to.deep.equal({ token: token }); 28 | expect(callArgs.strictSSL).to.equal(true); 29 | expect(callArgs.json).to.equal(true); 30 | expect(Object.keys(callArgs).length).to.equal(4); 31 | 32 | expect(e).to.equal(null); 33 | expect(r).to.deep.equal(validReturn); 34 | done(); 35 | }); 36 | })); 37 | 38 | 39 | it('should return error and empty data when response body is null', test(function (done) { 40 | let get = this.spy(bcapi._get).bind(bcapi); 41 | let badRequestError = "Bad Request"; 42 | this.stub(request, 'get').yields(badRequestError, { statusCode: 400 }); 43 | bcapi._get('/', {}, function (e, r) { 44 | 45 | var callArgs = request.get.getCall(0).args[0]; 46 | expect(callArgs.qs).to.deep.equal({ token: token }); 47 | expect(callArgs.strictSSL).to.equal(true); 48 | expect(callArgs.json).to.equal(true); 49 | expect(Object.keys(callArgs).length).to.equal(4); 50 | 51 | expect(e).to.equal(badRequestError); 52 | expect(r).to.deep.equal({}); 53 | done(); 54 | }); 55 | })); 56 | 57 | it('should return error and data when response body exists', test(function (done) { 58 | let get = this.spy(bcapi._get).bind(bcapi); 59 | let badRequestError = "Bad Request"; 60 | let badRequestData = { message: 'badRequeset' }; 61 | this.stub(request, 'get').yields(badRequestError, { statusCode: 400 }, badRequestData); 62 | bcapi._get('/', {}, function (e, r) { 63 | 64 | var callArgs = request.get.getCall(0).args[0]; 65 | expect(callArgs.qs).to.deep.equal({ token: token }); 66 | expect(callArgs.strictSSL).to.equal(true); 67 | expect(callArgs.json).to.equal(true); 68 | expect(Object.keys(callArgs).length).to.equal(4); 69 | 70 | expect(e).to.equal(badRequestError); 71 | expect(r).to.deep.equal(badRequestData); 72 | done(); 73 | }); 74 | })); 75 | 76 | });//end of _get 77 | */ -------------------------------------------------------------------------------- /tests/unit/_post.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | 11 | let BlockCypher = require('../../lib/bcypher'); 12 | let chain = 'btc'; 13 | let network = 'main'; 14 | let token = process.env.TOKEN; 15 | let bcapi = new BlockCypher(chain, network, token); 16 | 17 | /* 18 | describe('Blockcypher _post Method: ', function () { 19 | 20 | it('should return success statusCode 200 and return data', test(function (done) { 21 | let post = this.spy(bcapi._post).bind(bcapi); 22 | let validReturn = { data: { key1: 'value', key2: 2 } }; 23 | let inputBody = { data: {} }; 24 | 25 | this.stub(request, 'post').yields(null, { statusCode: 200 }, validReturn); 26 | bcapi._post('/', {}, inputBody, function (e, r) { 27 | 28 | var callArgs = request.post.getCall(0).args[0]; 29 | expect(callArgs.qs).to.deep.equal({ token: token }); 30 | expect(callArgs.strictSSL).to.equal(true); 31 | expect(callArgs.json).to.equal(true); 32 | expect(callArgs.body).to.deep.equal(inputBody); 33 | expect(Object.keys(callArgs).length).to.equal(5); 34 | 35 | expect(e).to.equal(null); 36 | expect(r).to.deep.equal(validReturn); 37 | done(); 38 | }); 39 | })); 40 | 41 | it('should return success statusCode 201 and return data', test(function (done) { 42 | let post = this.spy(bcapi._post).bind(bcapi); 43 | let validReturn = { data: { key1: 'value', key2: 2 } }; 44 | let inputBody = { data: {} }; 45 | 46 | this.stub(request, 'post').yields(null, { statusCode: 201 }, validReturn); 47 | bcapi._post('/', {}, inputBody, function (e, r) { 48 | 49 | var callArgs = request.post.getCall(0).args[0]; 50 | expect(callArgs.qs).to.deep.equal({ token: token }); 51 | expect(callArgs.strictSSL).to.equal(true); 52 | expect(callArgs.json).to.equal(true); 53 | expect(callArgs.body).to.deep.equal(inputBody); 54 | expect(Object.keys(callArgs).length).to.equal(5); 55 | 56 | expect(e).to.equal(null); 57 | expect(r).to.deep.equal(validReturn); 58 | done(); 59 | }); 60 | })); 61 | 62 | 63 | it('should return error and empty data when response body is null', test(function (done) { 64 | let post = this.spy(bcapi._post).bind(bcapi); 65 | let badRequestError = "Bad Request"; 66 | let inputBody = { data: {} }; 67 | 68 | this.stub(request, 'post').yields(badRequestError, { statusCode: 400 }); 69 | bcapi._post('/', {}, inputBody, function (e, r) { 70 | 71 | var callArgs = request.post.getCall(0).args[0]; 72 | expect(callArgs.qs).to.deep.equal({ token: token }); 73 | expect(callArgs.strictSSL).to.equal(true); 74 | expect(callArgs.json).to.equal(true); 75 | expect(callArgs.body).to.deep.equal(inputBody); 76 | expect(Object.keys(callArgs).length).to.equal(5); 77 | 78 | expect(e).to.equal(badRequestError); 79 | expect(r).to.deep.equal({}); 80 | done(); 81 | }); 82 | })); 83 | 84 | it('should return error and data when response body exists', test(function (done) { 85 | let post = this.spy(bcapi._post).bind(bcapi); 86 | let badRequestError = "Bad Request"; 87 | let badRequestData = { message: 'badRequeset' }; 88 | let inputBody = { data: {} }; 89 | 90 | this.stub(request, 'post').yields(badRequestError, { statusCode: 400 }, badRequestData); 91 | bcapi._post('/', {}, inputBody, function (e, r) { 92 | 93 | var callArgs = request.post.getCall(0).args[0]; 94 | expect(callArgs.qs).to.deep.equal({ token: token }); 95 | expect(callArgs.strictSSL).to.equal(true); 96 | expect(callArgs.json).to.equal(true); 97 | expect(callArgs.body).to.deep.equal(inputBody); 98 | expect(Object.keys(callArgs).length).to.equal(5); 99 | 100 | expect(e).to.equal(badRequestError); 101 | expect(r).to.deep.equal(badRequestData); 102 | done(); 103 | }); 104 | })); 105 | 106 | });//end of _post 107 | */ -------------------------------------------------------------------------------- /tests/unit/addAddrWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher addAddrWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When addrs and name exist', test(function (done) { 23 | 24 | let addrs = ['12345']; 25 | let name = 'human'; 26 | 27 | let validData = { addresses: addrs } 28 | let params = {}; 29 | let validEndpoint = '/wallets/' + name + '/addresses'; 30 | 31 | let validReturn = { data: { key1: 'value', key2: 2 } }; 32 | this.stub(bcapi, '_post').yields(null, validReturn); 33 | bcapi.addAddrWallet(name, addrs, function (e, r) { 34 | 35 | var callArgs = bcapi._post.getCall(0).args; 36 | expect(callArgs[0]).to.equal(validEndpoint); 37 | expect(callArgs[1]).to.deep.equal(params); 38 | expect(callArgs[2]).to.deep.equal(validData); 39 | expect(typeof callArgs[3]).to.equal('function'); 40 | expect(Object.keys(callArgs).length).to.equal(4); 41 | 42 | expect(e).to.equal(null); 43 | expect(r).to.deep.equal(validReturn); 44 | done(); 45 | }); 46 | })); 47 | 48 | 49 | });//end of success cases; 50 | 51 | describe('Errors: ', function () { 52 | 53 | it('bubbles up error when _post returns error', test(function (done) { 54 | 55 | let addrs = ['12345']; 56 | let name = 10; 57 | let validData = { addresses: addrs } 58 | let params = {}; 59 | let badRequestError = "Bad Request"; 60 | let validEndpoint = '/wallets/' + name + '/addresses'; 61 | 62 | 63 | let validReturn = { data: { key1: 'value', key2: 2 } }; 64 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 65 | bcapi.addAddrWallet(name, addrs, function (e, r) { 66 | 67 | var callArgs = bcapi._post.getCall(0).args; 68 | expect(callArgs[0]).to.equal(validEndpoint); 69 | expect(callArgs[1]).to.deep.equal(params); 70 | expect(callArgs[2]).to.deep.equal(validData); 71 | expect(typeof callArgs[3]).to.equal('function'); 72 | expect(Object.keys(callArgs).length).to.equal(4); 73 | 74 | expect(e).to.equal(badRequestError); 75 | expect(r).to.deep.equal(validReturn); 76 | done(); 77 | }); 78 | })); 79 | 80 | it.skip('When addrs is null/undefined', function (done) { done(); }); //TODO Error out when addrs does not exist 81 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 82 | 83 | });//end of error cases; 84 | 85 | 86 | 87 | });//end of addAddrWallet 88 | -------------------------------------------------------------------------------- /tests/unit/createHDWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher createHDWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When data.name and data.extended_public_key exist', test(function (done) { 23 | 24 | let data = { name: 'name', extended_public_key: 'aRealKey' }; 25 | let params = {}; 26 | let validEndpoint = '/wallets/hd'; 27 | 28 | 29 | let validReturn = { data: { key1: 'value', key2: 2 } }; 30 | this.stub(bcapi, '_post').yields(null, validReturn); 31 | bcapi.createHDWallet(data, function (e, r) { 32 | 33 | var callArgs = bcapi._post.getCall(0).args; 34 | expect(callArgs[0]).to.equal(validEndpoint); 35 | expect(callArgs[1]).to.deep.equal(params); 36 | expect(callArgs[2]).to.deep.equal(data); 37 | expect(typeof callArgs[3]).to.equal('function'); 38 | expect(Object.keys(callArgs).length).to.equal(4); 39 | 40 | expect(e).to.equal(null); 41 | expect(r).to.deep.equal(validReturn); 42 | done(); 43 | }); 44 | })); 45 | 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let data = { name: 'name', extended_public_key: 'aRealKey' }; 54 | let params = {}; 55 | let badRequestError = "Bad Request"; 56 | let validEndpoint = '/wallets/hd'; 57 | 58 | let validReturn = { data: { key1: 'value', key2: 2 } }; 59 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 60 | bcapi.createHDWallet(data, function (e, r) { 61 | 62 | var callArgs = bcapi._post.getCall(0).args; 63 | expect(callArgs[0]).to.equal(validEndpoint); 64 | expect(callArgs[1]).to.deep.equal(params); 65 | expect(callArgs[2]).to.deep.equal(data); 66 | expect(typeof callArgs[3]).to.equal('function'); 67 | expect(Object.keys(callArgs).length).to.equal(4); 68 | 69 | expect(e).to.equal(badRequestError); 70 | expect(r).to.deep.equal(validReturn); 71 | done(); 72 | }); 73 | })); 74 | 75 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 76 | it.skip('When extended_public_key is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 77 | 78 | });//end of error cases; 79 | 80 | 81 | 82 | });//end of createHDWallet 83 | -------------------------------------------------------------------------------- /tests/unit/createHook.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher createHook Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When data.event && data.address && data.url exist', test(function (done) { 23 | 24 | let event = 'hook'; 25 | let address = 'hexString'; 26 | let url = 'http://a.url.com'; 27 | let data = { event: event, address: address, url: url }; 28 | let validData = data; 29 | let params = {}; 30 | let validEndpoint = '/hooks'; 31 | 32 | let validReturn = { data: { key1: 'value', key2: 2 } }; 33 | this.stub(bcapi, '_post').yields(null, validReturn); 34 | bcapi.createHook(data, function (e, r) { 35 | 36 | var callArgs = bcapi._post.getCall(0).args; 37 | expect(callArgs[0]).to.equal(validEndpoint); 38 | expect(callArgs[1]).to.deep.equal(params); 39 | expect(callArgs[2]).to.deep.equal(validData); 40 | expect(typeof callArgs[3]).to.equal('function'); 41 | expect(Object.keys(callArgs).length).to.equal(4); 42 | 43 | expect(e).to.equal(null); 44 | expect(r).to.deep.equal(validReturn); 45 | done(); 46 | }); 47 | })); 48 | 49 | });//end of success cases; 50 | 51 | describe('Errors: ', function () { 52 | 53 | it('bubbles up error when _post returns error', test(function (done) { 54 | 55 | let event = 'hook'; 56 | let address = 'hexString'; 57 | let url = 'http://a.url.com'; 58 | let data = { event: event, address: address, url: url }; 59 | let validData = data; 60 | let params = {}; 61 | let badRequestError = "Bad Request"; 62 | let validEndpoint = '/hooks'; 63 | 64 | 65 | let validReturn = { data: { key1: 'value', key2: 2 } }; 66 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 67 | bcapi.createHook(data, function (e, r) { 68 | 69 | var callArgs = bcapi._post.getCall(0).args; 70 | expect(callArgs[0]).to.equal(validEndpoint); 71 | expect(callArgs[1]).to.deep.equal(params); 72 | expect(callArgs[2]).to.deep.equal(validData); 73 | expect(typeof callArgs[3]).to.equal('function'); 74 | expect(Object.keys(callArgs).length).to.equal(4); 75 | 76 | expect(e).to.equal(badRequestError); 77 | expect(r).to.deep.equal(validReturn); 78 | done(); 79 | }); 80 | })); 81 | 82 | it.skip('When data.event is null/undefined', function (done) { done(); }); //TODO Error out when event does not exist 83 | it.skip('When data.address is null/undefined', function (done) { done(); }); //TODO Error out when address does not exist 84 | it.skip('When data.url is null/undefined', function (done) { done(); }); //TODO Error out when url does not exist 85 | 86 | });//end of error cases; 87 | 88 | 89 | 90 | });//end of createHook 91 | -------------------------------------------------------------------------------- /tests/unit/createPayFwd.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher createPayFwd Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When data.destination && data.callback_url exist', test(function (done) { 23 | 24 | let data = { destination: 'hexString', callback_url: 'https://a.url.com' }; 25 | let validData = data; 26 | let params = {}; 27 | let validEndpoint = '/payments'; 28 | 29 | let validReturn = { data: { key1: 'value', key2: 2 } }; 30 | this.stub(bcapi, '_post').yields(null, validReturn); 31 | bcapi.createPayFwd(data, function (e, r) { 32 | 33 | var callArgs = bcapi._post.getCall(0).args; 34 | expect(callArgs[0]).to.equal(validEndpoint); 35 | expect(callArgs[1]).to.deep.equal(params); 36 | expect(callArgs[2]).to.deep.equal(validData); 37 | expect(typeof callArgs[3]).to.equal('function'); 38 | expect(Object.keys(callArgs).length).to.equal(4); 39 | 40 | expect(e).to.equal(null); 41 | expect(r).to.deep.equal(validReturn); 42 | done(); 43 | }); 44 | })); 45 | 46 | });//end of success cases; 47 | 48 | describe('Errors: ', function () { 49 | 50 | it('bubbles up error when _post returns error', test(function (done) { 51 | 52 | let data = { destination: 'hexString', callback_url: 'https://a.url.com' }; 53 | let validData = data; 54 | let params = {}; 55 | let badRequestError = "Bad Request"; 56 | let validEndpoint = '/payments'; 57 | 58 | 59 | let validReturn = { data: { key1: 'value', key2: 2 } }; 60 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 61 | bcapi.createPayFwd(data, function (e, r) { 62 | 63 | var callArgs = bcapi._post.getCall(0).args; 64 | expect(callArgs[0]).to.equal(validEndpoint); 65 | expect(callArgs[1]).to.deep.equal(params); 66 | expect(callArgs[2]).to.deep.equal(validData); 67 | expect(typeof callArgs[3]).to.equal('function'); 68 | expect(Object.keys(callArgs).length).to.equal(4); 69 | 70 | expect(e).to.equal(badRequestError); 71 | expect(r).to.deep.equal(validReturn); 72 | done(); 73 | }); 74 | })); 75 | 76 | it.skip('When data.destination is null/undefined', function (done) { done(); }); //TODO Error out when destination does not exist 77 | it.skip('When data.callback_url is null/undefined', function (done) { done(); }); //TODO Error out when callback_url does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of createPayFwd 84 | -------------------------------------------------------------------------------- /tests/unit/createWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher createWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When addr and value exist', test(function (done) { 23 | 24 | let data = { name: 'name', addresses: ['arealaddress'] }; 25 | let params = {}; 26 | let validEndpoint = '/wallets'; 27 | 28 | 29 | let validReturn = { data: { key1: 'value', key2: 2 } }; 30 | this.stub(bcapi, '_post').yields(null, validReturn); 31 | bcapi.createWallet(data, function (e, r) { 32 | 33 | var callArgs = bcapi._post.getCall(0).args; 34 | expect(callArgs[0]).to.equal(validEndpoint); 35 | expect(callArgs[1]).to.deep.equal(params); 36 | expect(callArgs[2]).to.deep.equal(data); 37 | expect(typeof callArgs[3]).to.equal('function'); 38 | expect(Object.keys(callArgs).length).to.equal(4); 39 | 40 | expect(e).to.equal(null); 41 | expect(r).to.deep.equal(validReturn); 42 | done(); 43 | }); 44 | })); 45 | 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let data = { name: 'name', addresses: ['arealaddress'] }; 54 | let params = {}; 55 | let badRequestError = "Bad Request"; 56 | let validEndpoint = '/wallets'; 57 | 58 | let validReturn = { data: { key1: 'value', key2: 2 } }; 59 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 60 | bcapi.createWallet(data, function (e, r) { 61 | 62 | var callArgs = bcapi._post.getCall(0).args; 63 | expect(callArgs[0]).to.equal(validEndpoint); 64 | expect(callArgs[1]).to.deep.equal(params); 65 | expect(callArgs[2]).to.deep.equal(data); 66 | expect(typeof callArgs[3]).to.equal('function'); 67 | expect(Object.keys(callArgs).length).to.equal(4); 68 | 69 | expect(e).to.equal(badRequestError); 70 | expect(r).to.deep.equal(validReturn); 71 | done(); 72 | }); 73 | })); 74 | 75 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 76 | it.skip('When addresses is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 77 | 78 | });//end of error cases; 79 | 80 | 81 | 82 | });//end of createWallet 83 | -------------------------------------------------------------------------------- /tests/unit/decodeTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher decodeTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When hex exist', test(function (done) { 23 | 24 | let hex = 'fancyHex'; 25 | 26 | let validData = { tx: hex }; 27 | let params = {}; 28 | let validEndpoint = '/txs/decode'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.decodeTX(hex, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let hex = 'fancyHex'; 54 | let validData = { tx: hex }; 55 | let params = {}; 56 | let badRequestError = "Bad Request"; 57 | let validEndpoint = '/txs/decode'; 58 | 59 | 60 | let validReturn = { data: { key1: 'value', key2: 2 } }; 61 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 62 | bcapi.decodeTX(hex, function (e, r) { 63 | 64 | var callArgs = bcapi._post.getCall(0).args; 65 | expect(callArgs[0]).to.equal(validEndpoint); 66 | expect(callArgs[1]).to.deep.equal(params); 67 | expect(callArgs[2]).to.deep.equal(validData); 68 | expect(typeof callArgs[3]).to.equal('function'); 69 | expect(Object.keys(callArgs).length).to.equal(4); 70 | 71 | expect(e).to.equal(badRequestError); 72 | expect(r).to.deep.equal(validReturn); 73 | done(); 74 | }); 75 | })); 76 | 77 | it.skip('When hex is null/undefined', function (done) { done(); }); //TODO Error out when hex does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of decodeTX 84 | -------------------------------------------------------------------------------- /tests/unit/delAddrsWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher delAddrsWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name && addr exist', test(function (done) { 23 | 24 | let name = 'myName'; 25 | let addrs = ['addr1', 'addr2']; 26 | let validParams = { address: addrs.join([';']) }; 27 | let validEndpoint = '/wallets/' + name + '/addresses'; 28 | 29 | let validReturn = { data: { key1: 'value', key2: 2 } }; 30 | this.stub(bcapi, '_del').yields(null, validReturn); 31 | bcapi.delAddrsWallet(name, addrs, function (e, r) { 32 | 33 | var callArgs = bcapi._del.getCall(0).args; 34 | expect(callArgs[0]).to.equal(validEndpoint); 35 | expect(callArgs[1]).to.deep.equal(validParams); 36 | expect(typeof callArgs[2]).to.equal('function'); 37 | expect(Object.keys(callArgs).length).to.equal(3); 38 | 39 | expect(e).to.equal(null); 40 | expect(r).to.deep.equal(validReturn); 41 | done(); 42 | }); 43 | })); 44 | 45 | });//end of success cases; 46 | 47 | describe('Errors: ', function () { 48 | 49 | it('bubbles up error when _del returns error', test(function (done) { 50 | 51 | let name = 'myName'; 52 | let addrs = ['addr1', 'addr2']; 53 | let validParams = { address: addrs.join([';']) }; 54 | let badRequestError = "Bad Request"; 55 | let validEndpoint = '/wallets/' + name + '/addresses'; 56 | 57 | 58 | let validReturn = { data: { key1: 'value', key2: 2 } }; 59 | this.stub(bcapi, '_del').yields(badRequestError, validReturn); 60 | bcapi.delAddrsWallet(name, addrs, function (e, r) { 61 | 62 | var callArgs = bcapi._del.getCall(0).args; 63 | expect(callArgs[0]).to.equal(validEndpoint); 64 | expect(callArgs[1]).to.deep.equal(validParams); 65 | expect(typeof callArgs[2]).to.equal('function'); 66 | expect(Object.keys(callArgs).length).to.equal(3); 67 | 68 | expect(e).to.equal(badRequestError); 69 | expect(r).to.deep.equal(validReturn); 70 | done(); 71 | }); 72 | })); 73 | 74 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 75 | it.skip('When addrs is null/undefined', function (done) { done(); }); //TODO Error out when addrs does not exist 76 | 77 | });//end of error cases; 78 | 79 | 80 | 81 | });//end of delAddrsWallet 82 | -------------------------------------------------------------------------------- /tests/unit/delHDWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher delHDWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name exists', test(function (done) { 23 | 24 | let name = 'myName'; 25 | let validParams = {}; 26 | let validEndpoint = '/wallets/hd/' + name; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_del').yields(null, validReturn); 30 | bcapi.delHDWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._del.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(validParams); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _del returns error', test(function (done) { 49 | 50 | let name = 'myName'; 51 | let validParams = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/hd/' + name; 54 | 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_del').yields(badRequestError, validReturn); 58 | bcapi.delHDWallet(name, function (e, r) { 59 | 60 | var callArgs = bcapi._del.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(validParams); 63 | expect(typeof callArgs[2]).to.equal('function'); 64 | expect(Object.keys(callArgs).length).to.equal(3); 65 | 66 | expect(e).to.equal(badRequestError); 67 | expect(r).to.deep.equal(validReturn); 68 | done(); 69 | }); 70 | })); 71 | 72 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of delHDWallet 79 | -------------------------------------------------------------------------------- /tests/unit/delHook.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher delHook Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When id exists', test(function (done) { 23 | 24 | let id = 'myName'; 25 | let validParams = {}; 26 | let validEndpoint = '/hooks/' + id; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_del').yields(null, validReturn); 30 | bcapi.delHook(id, function (e, r) { 31 | 32 | var callArgs = bcapi._del.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(validParams); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _del returns error', test(function (done) { 49 | 50 | let id = 'myName'; 51 | let validParams = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/hooks/' + id; 54 | 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_del').yields(badRequestError, validReturn); 58 | bcapi.delHook(id, function (e, r) { 59 | 60 | var callArgs = bcapi._del.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(validParams); 63 | expect(typeof callArgs[2]).to.equal('function'); 64 | expect(Object.keys(callArgs).length).to.equal(3); 65 | 66 | expect(e).to.equal(badRequestError); 67 | expect(r).to.deep.equal(validReturn); 68 | done(); 69 | }); 70 | })); 71 | 72 | it.skip('When id is null/undefined', function (done) { done(); }); //TODO Error out when id does not exist 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of delPayFwd 79 | -------------------------------------------------------------------------------- /tests/unit/delPayFwd.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher delPayFwd Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When id exists', test(function (done) { 23 | 24 | let id = 'myName'; 25 | let validParams = {}; 26 | let validEndpoint = '/payments/' + id; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_del').yields(null, validReturn); 30 | bcapi.delPayFwd(id, function (e, r) { 31 | 32 | var callArgs = bcapi._del.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(validParams); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _del returns error', test(function (done) { 49 | 50 | let id = 'myName'; 51 | let validParams = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/payments/' + id; 54 | 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_del').yields(badRequestError, validReturn); 58 | bcapi.delPayFwd(id, function (e, r) { 59 | 60 | var callArgs = bcapi._del.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(validParams); 63 | expect(typeof callArgs[2]).to.equal('function'); 64 | expect(Object.keys(callArgs).length).to.equal(3); 65 | 66 | expect(e).to.equal(badRequestError); 67 | expect(r).to.deep.equal(validReturn); 68 | done(); 69 | }); 70 | })); 71 | 72 | it.skip('When id is null/undefined', function (done) { done(); }); //TODO Error out when id does not exist 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of delPayFwd 79 | -------------------------------------------------------------------------------- /tests/unit/delWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher delWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name exists', test(function (done) { 23 | 24 | let name = 'myName'; 25 | let validParams = {}; 26 | let validEndpoint = '/wallets/' + name; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_del').yields(null, validReturn); 30 | bcapi.delWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._del.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(validParams); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _del returns error', test(function (done) { 49 | 50 | let name = 'myName'; 51 | let validParams = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/' + name; 54 | 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_del').yields(badRequestError, validReturn); 58 | bcapi.delWallet(name, function (e, r) { 59 | 60 | var callArgs = bcapi._del.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(validParams); 63 | expect(typeof callArgs[2]).to.equal('function'); 64 | expect(Object.keys(callArgs).length).to.equal(3); 65 | 66 | expect(e).to.equal(badRequestError); 67 | expect(r).to.deep.equal(validReturn); 68 | done(); 69 | }); 70 | })); 71 | 72 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of delWallet 79 | -------------------------------------------------------------------------------- /tests/unit/deriveAddrHDWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher deriveAddrHDWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name and params exist', test(function (done) { 23 | 24 | let name = 'human'; 25 | 26 | let validData = {} 27 | let params = {}; 28 | let validEndpoint = '/wallets/hd/' + name + '/addresses/derive'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.deriveAddrHDWallet(name, params, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | 48 | it('When name and params does NOT exist', test(function (done) { 49 | 50 | let name = 'human'; 51 | 52 | let validData = {} 53 | let params = {}; 54 | let validEndpoint = '/wallets/hd/' + name + '/addresses/derive'; 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_post').yields(null, validReturn); 58 | bcapi.deriveAddrHDWallet(name, function (e, r) { 59 | 60 | var callArgs = bcapi._post.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(params); 63 | expect(callArgs[2]).to.deep.equal(validData); 64 | expect(typeof callArgs[3]).to.equal('function'); 65 | expect(Object.keys(callArgs).length).to.equal(4); 66 | 67 | expect(e).to.equal(null); 68 | expect(r).to.deep.equal(validReturn); 69 | done(); 70 | }); 71 | })); 72 | 73 | });//end of success cases; 74 | 75 | describe('Errors: ', function () { 76 | 77 | it('bubbles up error when _post returns error', test(function (done) { 78 | 79 | let name = 10; 80 | let validData = {} 81 | let params = {}; 82 | let badRequestError = "Bad Request"; 83 | let validEndpoint = '/wallets/hd/' + name + '/addresses/derive'; 84 | 85 | 86 | let validReturn = { data: { key1: 'value', key2: 2 } }; 87 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 88 | bcapi.deriveAddrHDWallet(name, function (e, r) { 89 | 90 | var callArgs = bcapi._post.getCall(0).args; 91 | expect(callArgs[0]).to.equal(validEndpoint); 92 | expect(callArgs[1]).to.deep.equal(params); 93 | expect(callArgs[2]).to.deep.equal(validData); 94 | expect(typeof callArgs[3]).to.equal('function'); 95 | expect(Object.keys(callArgs).length).to.equal(4); 96 | 97 | expect(e).to.equal(badRequestError); 98 | expect(r).to.deep.equal(validReturn); 99 | done(); 100 | }); 101 | })); 102 | 103 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 104 | 105 | });//end of error cases; 106 | 107 | 108 | 109 | });//end of deriveAddrHDWallet 110 | -------------------------------------------------------------------------------- /tests/unit/embedData.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher embedData Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When hex exist', test(function (done) { 23 | 24 | let hex = 'fancyHex'; 25 | 26 | let validData = { data: hex }; 27 | let params = {}; 28 | let validEndpoint = '/txs/data'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.embedData(hex, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let hex = 'fancyHex'; 54 | let validData = { data: hex }; 55 | let params = {}; 56 | let badRequestError = "Bad Request"; 57 | let validEndpoint = '/txs/data'; 58 | 59 | 60 | let validReturn = { data: { key1: 'value', key2: 2 } }; 61 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 62 | bcapi.embedData(hex, function (e, r) { 63 | 64 | var callArgs = bcapi._post.getCall(0).args; 65 | expect(callArgs[0]).to.equal(validEndpoint); 66 | expect(callArgs[1]).to.deep.equal(params); 67 | expect(callArgs[2]).to.deep.equal(validData); 68 | expect(typeof callArgs[3]).to.equal('function'); 69 | expect(Object.keys(callArgs).length).to.equal(4); 70 | 71 | expect(e).to.equal(badRequestError); 72 | expect(r).to.deep.equal(validReturn); 73 | done(); 74 | }); 75 | })); 76 | 77 | it.skip('When hex is null/undefined', function (done) { done(); }); //TODO Error out when hex does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of embedData 84 | -------------------------------------------------------------------------------- /tests/unit/faucet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher faucet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When addr and value exist', test(function (done) { 23 | 24 | let addr = '12345'; 25 | let value = 10; 26 | let params = {}; 27 | let validEndpoint = '/faucet'; 28 | let validData = { address: addr, amount: value }; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.faucet(addr, value, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | it.skip('When value is null', function (done) { done(); }); //TODO Set default value if null/undefined? 48 | 49 | });//end of success cases; 50 | 51 | describe('Errors: ', function () { 52 | 53 | it('bubbles up error when _post returns error', test(function (done) { 54 | 55 | let addr = '12345'; 56 | let value = 10; 57 | let params = {}; 58 | let badRequestError = "Bad Request"; 59 | let validEndpoint = '/faucet'; 60 | let validData = { address: addr, amount: value }; 61 | 62 | let validReturn = { data: { key1: 'value', key2: 2 } }; 63 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 64 | bcapi.faucet(addr, value, function (e, r) { 65 | 66 | var callArgs = bcapi._post.getCall(0).args; 67 | expect(callArgs[0]).to.equal(validEndpoint); 68 | expect(callArgs[1]).to.deep.equal(params); 69 | expect(callArgs[2]).to.deep.equal(validData); 70 | expect(typeof callArgs[3]).to.equal('function'); 71 | expect(Object.keys(callArgs).length).to.equal(4); 72 | 73 | expect(e).to.equal(badRequestError); 74 | expect(r).to.deep.equal(validReturn); 75 | done(); 76 | }); 77 | })); 78 | 79 | it.skip('When addr is null', function (done) { done(); }); //TODO Error out when addr is null. dont need to make an api call to know this is bad 80 | 81 | });//end of error cases; 82 | 83 | 84 | 85 | });//end of faucet 86 | -------------------------------------------------------------------------------- /tests/unit/genAddr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher genAddr Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When data is an empty object', test(function (done) { 23 | 24 | let data = {}; 25 | let params = {}; 26 | let validEndpoint = '/addrs'; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_post').yields(null, validReturn); 30 | bcapi.genAddr(data, function (e, r) { 31 | 32 | var callArgs = bcapi._post.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(callArgs[2]).to.deep.equal(data); 36 | expect(typeof callArgs[3]).to.equal('function'); 37 | expect(Object.keys(callArgs).length).to.equal(4); 38 | 39 | expect(e).to.equal(null); 40 | expect(r).to.deep.equal(validReturn); 41 | done(); 42 | }); 43 | })); 44 | 45 | 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let data = {}; 54 | let params = {}; 55 | let badRequestError = "Bad Request"; 56 | let validEndpoint = '/addrs'; 57 | 58 | let validReturn = { data: { key1: 'value', key2: 2 } }; 59 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 60 | bcapi.genAddr(data, function (e, r) { 61 | 62 | var callArgs = bcapi._post.getCall(0).args; 63 | expect(callArgs[0]).to.equal(validEndpoint); 64 | expect(callArgs[1]).to.deep.equal(params); 65 | expect(callArgs[2]).to.deep.equal(data); 66 | expect(typeof callArgs[3]).to.equal('function'); 67 | expect(Object.keys(callArgs).length).to.equal(4); 68 | 69 | expect(e).to.equal(badRequestError); 70 | expect(r).to.deep.equal(validReturn); 71 | done(); 72 | }); 73 | })); 74 | 75 | });//end of error cases; 76 | 77 | 78 | 79 | });//end of genAddr 80 | -------------------------------------------------------------------------------- /tests/unit/genAddrWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher genAddrWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name exist', test(function (done) { 23 | 24 | let name = 'human'; 25 | 26 | let validData = {} 27 | let params = {}; 28 | let validEndpoint = '/wallets/' + name + '/addresses/generate'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.genAddrWallet(name, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | 48 | });//end of success cases; 49 | 50 | describe('Errors: ', function () { 51 | 52 | it('bubbles up error when _post returns error', test(function (done) { 53 | 54 | let name = 10; 55 | let validData = {} 56 | let params = {}; 57 | let badRequestError = "Bad Request"; 58 | let validEndpoint = '/wallets/' + name + '/addresses/generate'; 59 | 60 | 61 | let validReturn = { data: { key1: 'value', key2: 2 } }; 62 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 63 | bcapi.genAddrWallet(name, function (e, r) { 64 | 65 | var callArgs = bcapi._post.getCall(0).args; 66 | expect(callArgs[0]).to.equal(validEndpoint); 67 | expect(callArgs[1]).to.deep.equal(params); 68 | expect(callArgs[2]).to.deep.equal(validData); 69 | expect(typeof callArgs[3]).to.equal('function'); 70 | expect(Object.keys(callArgs).length).to.equal(4); 71 | 72 | expect(e).to.equal(badRequestError); 73 | expect(r).to.deep.equal(validReturn); 74 | done(); 75 | }); 76 | })); 77 | 78 | it.skip('When name is null/undefined', function (done) { done(); }); //TODO Error out when name does not exist 79 | 80 | });//end of error cases; 81 | 82 | 83 | 84 | });//end of genAddrWallet 85 | -------------------------------------------------------------------------------- /tests/unit/getAddr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getAddr Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When addr a string and params exists', test(function (done) { 23 | 24 | let addr = '12345'; 25 | let params = {}; 26 | let validEndpoint = '/addrs/' + addr; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getAddr(addr, params, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | it('When addr is an int and params exists', test(function (done) { 45 | 46 | let addr = 12345; 47 | let params = {}; 48 | let validEndpoint = '/addrs/' + addr; 49 | 50 | let validReturn = { data: { key1: 'value', key2: 2 } }; 51 | this.stub(bcapi, '_get').yields(null, validReturn); 52 | bcapi.getAddr(addr, params, function (e, r) { 53 | 54 | var callArgs = bcapi._get.getCall(0).args; 55 | expect(callArgs[0]).to.equal(validEndpoint); 56 | expect(callArgs[1]).to.deep.equal(params); 57 | expect(typeof callArgs[2]).to.equal('function'); 58 | expect(Object.keys(callArgs).length).to.equal(3); 59 | 60 | expect(e).to.equal(null); 61 | expect(r).to.deep.equal(validReturn); 62 | done(); 63 | }); 64 | })); 65 | 66 | it('When addr is a string and params does NOT exist', test(function (done) { 67 | 68 | let addr = '12345'; 69 | let params = {}; 70 | let validEndpoint = '/addrs/' + addr; 71 | 72 | let validReturn = { data: { key1: 'value', key2: 2 } }; 73 | this.stub(bcapi, '_get').yields(null, validReturn); 74 | bcapi.getAddr(addr, function (e, r) { 75 | 76 | var callArgs = bcapi._get.getCall(0).args; 77 | expect(callArgs[0]).to.equal(validEndpoint); 78 | expect(callArgs[1]).to.deep.equal(params); 79 | expect(typeof callArgs[2]).to.equal('function'); 80 | expect(Object.keys(callArgs).length).to.equal(3); 81 | 82 | expect(e).to.equal(null); 83 | expect(r).to.deep.equal(validReturn); 84 | done(); 85 | }); 86 | })); 87 | 88 | it('When addr is an int and params does NOT exist', test(function (done) { 89 | 90 | let addr = 12345; 91 | let params = {}; 92 | let validEndpoint = '/addrs/' + addr; 93 | 94 | let validReturn = { data: { key1: 'value', key2: 2 } }; 95 | this.stub(bcapi, '_get').yields(null, validReturn); 96 | bcapi.getAddr(addr, function (e, r) { 97 | 98 | var callArgs = bcapi._get.getCall(0).args; 99 | expect(callArgs[0]).to.equal(validEndpoint); 100 | expect(callArgs[1]).to.deep.equal(params); 101 | expect(typeof callArgs[2]).to.equal('function'); 102 | expect(Object.keys(callArgs).length).to.equal(3); 103 | 104 | expect(e).to.equal(null); 105 | expect(r).to.deep.equal(validReturn); 106 | done(); 107 | }); 108 | })); 109 | 110 | });//end of success cases; 111 | 112 | describe('Errors: ', function () { 113 | 114 | it('bubbles up error when _get returns error', test(function (done) { 115 | 116 | let addr = '12345'; 117 | let params = {}; 118 | let badRequestError = "Bad Request"; 119 | let validEndpoint = '/addrs/' + addr; 120 | 121 | let validReturn = { data: { key1: 'value', key2: 2 } }; 122 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 123 | bcapi.getAddr(addr, params, function (e, r) { 124 | 125 | var callArgs = bcapi._get.getCall(0).args; 126 | expect(callArgs[0]).to.equal(validEndpoint); 127 | expect(callArgs[1]).to.deep.equal(params); 128 | expect(typeof callArgs[2]).to.equal('function'); 129 | expect(Object.keys(callArgs).length).to.equal(3); 130 | 131 | expect(e).to.equal(badRequestError); 132 | expect(r).to.deep.equal(validReturn); 133 | done(); 134 | }); 135 | })); 136 | 137 | it.skip('should return error when addr is missing', function (done) { done() }); 138 | 139 | 140 | });//end of error cases; 141 | 142 | 143 | 144 | });//end of getAddr 145 | -------------------------------------------------------------------------------- /tests/unit/getAddrBal.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getAddrBal Method: ', function () { 18 | 19 | describe('Success: ', function () { 20 | 21 | it('When addr a string and params exists', test(function (done) { 22 | 23 | let addr = '12345'; 24 | let params = {}; 25 | let validEndpoint = '/addrs/' + addr + '/balance'; 26 | 27 | let validReturn = { data: { key1: 'value', key2: 2 } }; 28 | this.stub(bcapi, '_get').yields(null, validReturn); 29 | bcapi.getAddrBal(addr, params, function (e, r) { 30 | 31 | var callArgs = bcapi._get.getCall(0).args; 32 | expect(callArgs[0]).to.equal(validEndpoint); 33 | expect(callArgs[1]).to.deep.equal(params); 34 | expect(typeof callArgs[2]).to.equal('function'); 35 | expect(Object.keys(callArgs).length).to.equal(3); 36 | 37 | expect(e).to.equal(null); 38 | expect(r).to.deep.equal(validReturn); 39 | done(); 40 | }); 41 | })); 42 | 43 | it('When addr is an int and params exists', test(function (done) { 44 | 45 | let addr = 12345; 46 | let params = {}; 47 | let validEndpoint = '/addrs/' + addr + '/balance'; 48 | 49 | let validReturn = { data: { key1: 'value', key2: 2 } }; 50 | this.stub(bcapi, '_get').yields(null, validReturn); 51 | bcapi.getAddrBal(addr, params, function (e, r) { 52 | 53 | var callArgs = bcapi._get.getCall(0).args; 54 | expect(callArgs[0]).to.equal(validEndpoint); 55 | expect(callArgs[1]).to.deep.equal(params); 56 | expect(typeof callArgs[2]).to.equal('function'); 57 | expect(Object.keys(callArgs).length).to.equal(3); 58 | 59 | expect(e).to.equal(null); 60 | expect(r).to.deep.equal(validReturn); 61 | done(); 62 | }); 63 | })); 64 | 65 | it('When addr is a string and params does NOT exist', test(function (done) { 66 | 67 | let addr = '12345'; 68 | let params = {}; 69 | let validEndpoint = '/addrs/' + addr + '/balance'; 70 | 71 | let validReturn = { data: { key1: 'value', key2: 2 } }; 72 | this.stub(bcapi, '_get').yields(null, validReturn); 73 | bcapi.getAddrBal(addr, function (e, r) { 74 | 75 | var callArgs = bcapi._get.getCall(0).args; 76 | expect(callArgs[0]).to.equal(validEndpoint); 77 | expect(callArgs[1]).to.deep.equal(params); 78 | expect(typeof callArgs[2]).to.equal('function'); 79 | expect(Object.keys(callArgs).length).to.equal(3); 80 | 81 | expect(e).to.equal(null); 82 | expect(r).to.deep.equal(validReturn); 83 | done(); 84 | }); 85 | })); 86 | 87 | it('When addr is an int and params does NOT exist', test(function (done) { 88 | 89 | let addr = 12345; 90 | let params = {}; 91 | let validEndpoint = '/addrs/' + addr + '/balance'; 92 | 93 | let validReturn = { data: { key1: 'value', key2: 2 } }; 94 | this.stub(bcapi, '_get').yields(null, validReturn); 95 | bcapi.getAddrBal(addr, function (e, r) { 96 | 97 | var callArgs = bcapi._get.getCall(0).args; 98 | expect(callArgs[0]).to.equal(validEndpoint); 99 | expect(callArgs[1]).to.deep.equal(params); 100 | expect(typeof callArgs[2]).to.equal('function'); 101 | expect(Object.keys(callArgs).length).to.equal(3); 102 | 103 | expect(e).to.equal(null); 104 | expect(r).to.deep.equal(validReturn); 105 | done(); 106 | }); 107 | })); 108 | 109 | });//end of success cases; 110 | 111 | describe('Errors: ', function () { 112 | 113 | it('bubbles up error when _get returns error', test(function (done) { 114 | 115 | let addr = '12345'; 116 | let params = {}; 117 | let badRequestError = "Bad Request"; 118 | let validEndpoint = '/addrs/' + addr + '/balance'; 119 | 120 | let validReturn = { data: { key1: 'value', key2: 2 } }; 121 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 122 | bcapi.getAddrBal(addr, params, function (e, r) { 123 | 124 | var callArgs = bcapi._get.getCall(0).args; 125 | expect(callArgs[0]).to.equal(validEndpoint); 126 | expect(callArgs[1]).to.deep.equal(params); 127 | expect(typeof callArgs[2]).to.equal('function'); 128 | expect(Object.keys(callArgs).length).to.equal(3); 129 | 130 | expect(e).to.equal(badRequestError); 131 | expect(r).to.deep.equal(validReturn); 132 | done(); 133 | }); 134 | })); 135 | 136 | it.skip('should return error when addr is missing', function (done) { done() }); 137 | 138 | 139 | });//end of error cases; 140 | 141 | 142 | 143 | });//end of getAddrBal 144 | -------------------------------------------------------------------------------- /tests/unit/getAddrFull.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getAddrFull Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When addr a string and params exists', test(function (done) { 23 | 24 | let addr = '12345'; 25 | let params = {}; 26 | let validEndpoint = '/addrs/' + addr + '/full'; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getAddrFull(addr, params, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | it('When addr is an int and params exists', test(function (done) { 45 | 46 | let addr = 12345; 47 | let params = {}; 48 | let validEndpoint = '/addrs/' + addr + '/full'; 49 | 50 | let validReturn = { data: { key1: 'value', key2: 2 } }; 51 | this.stub(bcapi, '_get').yields(null, validReturn); 52 | bcapi.getAddrFull(addr, params, function (e, r) { 53 | 54 | var callArgs = bcapi._get.getCall(0).args; 55 | expect(callArgs[0]).to.equal(validEndpoint); 56 | expect(callArgs[1]).to.deep.equal(params); 57 | expect(typeof callArgs[2]).to.equal('function'); 58 | expect(Object.keys(callArgs).length).to.equal(3); 59 | 60 | expect(e).to.equal(null); 61 | expect(r).to.deep.equal(validReturn); 62 | done(); 63 | }); 64 | })); 65 | 66 | it('When addr is a string and params does NOT exist', test(function (done) { 67 | 68 | let addr = '12345'; 69 | let params = {}; 70 | let validEndpoint = '/addrs/' + addr + '/full'; 71 | 72 | let validReturn = { data: { key1: 'value', key2: 2 } }; 73 | this.stub(bcapi, '_get').yields(null, validReturn); 74 | bcapi.getAddrFull(addr, function (e, r) { 75 | 76 | var callArgs = bcapi._get.getCall(0).args; 77 | expect(callArgs[0]).to.equal(validEndpoint); 78 | expect(callArgs[1]).to.deep.equal(params); 79 | expect(typeof callArgs[2]).to.equal('function'); 80 | expect(Object.keys(callArgs).length).to.equal(3); 81 | 82 | expect(e).to.equal(null); 83 | expect(r).to.deep.equal(validReturn); 84 | done(); 85 | }); 86 | })); 87 | 88 | it('When addr is an int and params does NOT exist', test(function (done) { 89 | 90 | let addr = 12345; 91 | let params = {}; 92 | let validEndpoint = '/addrs/' + addr + '/full'; 93 | 94 | let validReturn = { data: { key1: 'value', key2: 2 } }; 95 | this.stub(bcapi, '_get').yields(null, validReturn); 96 | bcapi.getAddrFull(addr, function (e, r) { 97 | 98 | var callArgs = bcapi._get.getCall(0).args; 99 | expect(callArgs[0]).to.equal(validEndpoint); 100 | expect(callArgs[1]).to.deep.equal(params); 101 | expect(typeof callArgs[2]).to.equal('function'); 102 | expect(Object.keys(callArgs).length).to.equal(3); 103 | 104 | expect(e).to.equal(null); 105 | expect(r).to.deep.equal(validReturn); 106 | done(); 107 | }); 108 | })); 109 | 110 | });//end of success cases; 111 | 112 | describe('Errors: ', function () { 113 | 114 | it('bubbles up error when _get returns error', test(function (done) { 115 | 116 | let addr = '12345'; 117 | let params = {}; 118 | let badRequestError = "Bad Request"; 119 | let validEndpoint = '/addrs/' + addr + '/full'; 120 | 121 | let validReturn = { data: { key1: 'value', key2: 2 } }; 122 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 123 | bcapi.getAddrFull(addr, params, function (e, r) { 124 | 125 | var callArgs = bcapi._get.getCall(0).args; 126 | expect(callArgs[0]).to.equal(validEndpoint); 127 | expect(callArgs[1]).to.deep.equal(params); 128 | expect(typeof callArgs[2]).to.equal('function'); 129 | expect(Object.keys(callArgs).length).to.equal(3); 130 | 131 | expect(e).to.equal(badRequestError); 132 | expect(r).to.deep.equal(validReturn); 133 | done(); 134 | }); 135 | })); 136 | 137 | it.skip('should return error when addr is missing', function (done) { done() }); 138 | 139 | 140 | });//end of error cases; 141 | 142 | 143 | 144 | });//end of getAddrFull 145 | -------------------------------------------------------------------------------- /tests/unit/getAddrsHDWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getAddrsHDWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name a string and params exists', test(function (done) { 23 | 24 | let name = 'human'; 25 | let params = {}; 26 | let validEndpoint = '/wallets/hd/' + name + '/addresses'; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getAddrsHDWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _get returns error', test(function (done) { 49 | 50 | let name = 'human'; 51 | let params = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/hd/' + name + '/addresses'; 54 | 55 | let validReturn = { data: { key1: 'value', key2: 2 } }; 56 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 57 | bcapi.getAddrsHDWallet(name, function (e, r) { 58 | 59 | var callArgs = bcapi._get.getCall(0).args; 60 | expect(callArgs[0]).to.equal(validEndpoint); 61 | expect(callArgs[1]).to.deep.equal(params); 62 | expect(typeof callArgs[2]).to.equal('function'); 63 | expect(Object.keys(callArgs).length).to.equal(3); 64 | 65 | expect(e).to.equal(badRequestError); 66 | expect(r).to.deep.equal(validReturn); 67 | done(); 68 | }); 69 | })); 70 | 71 | it.skip('should return error when name is missing', function (done) { done() }); 72 | 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of getAddrsHDWallet 79 | -------------------------------------------------------------------------------- /tests/unit/getAddrsWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getAddrsWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name a string and params exists', test(function (done) { 23 | 24 | let name = 'human'; 25 | let params = {}; 26 | let validEndpoint = '/wallets/' + name + '/addresses'; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getAddrsWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _get returns error', test(function (done) { 49 | 50 | let name = 'human'; 51 | let params = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/' + name + '/addresses'; 54 | 55 | let validReturn = { data: { key1: 'value', key2: 2 } }; 56 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 57 | bcapi.getAddrsWallet(name, function (e, r) { 58 | 59 | var callArgs = bcapi._get.getCall(0).args; 60 | expect(callArgs[0]).to.equal(validEndpoint); 61 | expect(callArgs[1]).to.deep.equal(params); 62 | expect(typeof callArgs[2]).to.equal('function'); 63 | expect(Object.keys(callArgs).length).to.equal(3); 64 | 65 | expect(e).to.equal(badRequestError); 66 | expect(r).to.deep.equal(validReturn); 67 | done(); 68 | }); 69 | })); 70 | 71 | it.skip('should return error when name is missing', function (done) { done() }); 72 | 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of getAddrsWallet 79 | -------------------------------------------------------------------------------- /tests/unit/getBlock.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getBlock Method: ', function () { 18 | 19 | describe('Success: ', function () { 20 | 21 | it('When block hash/heightis a string and params exists', test(function (done) { 22 | 23 | let hh = '12345'; 24 | let params = {}; 25 | 26 | let validReturn = { data: { key1: 'value', key2: 2 } }; 27 | this.stub(bcapi, '_get').yields(null, validReturn); 28 | bcapi.getBlock(hh, params, function (e, r) { 29 | 30 | var callArgs = bcapi._get.getCall(0).args; 31 | expect(callArgs[0]).to.equal('/blocks/' + hh); 32 | expect(callArgs[1]).to.deep.equal(params); 33 | expect(typeof callArgs[2]).to.equal('function'); 34 | expect(Object.keys(callArgs).length).to.equal(3); 35 | 36 | expect(e).to.equal(null); 37 | expect(r).to.deep.equal(validReturn); 38 | done(); 39 | }); 40 | })); 41 | 42 | it('When block hash/height is an int and params exists', test(function (done) { 43 | 44 | let hh = 12345; 45 | let params = {}; 46 | 47 | let validReturn = { data: { key1: 'value', key2: 2 } }; 48 | this.stub(bcapi, '_get').yields(null, validReturn); 49 | bcapi.getBlock(hh, params, function (e, r) { 50 | 51 | var callArgs = bcapi._get.getCall(0).args; 52 | expect(callArgs[0]).to.equal('/blocks/' + hh); 53 | expect(callArgs[1]).to.deep.equal(params); 54 | expect(typeof callArgs[2]).to.equal('function'); 55 | expect(Object.keys(callArgs).length).to.equal(3); 56 | 57 | expect(e).to.equal(null); 58 | expect(r).to.deep.equal(validReturn); 59 | done(); 60 | }); 61 | })); 62 | 63 | it('When block hash/heightis is a string and params does NOT exist', test(function (done) { 64 | 65 | let hh = '12345'; 66 | let params = {}; 67 | 68 | let validReturn = { data: { key1: 'value', key2: 2 } }; 69 | this.stub(bcapi, '_get').yields(null, validReturn); 70 | bcapi.getBlock(hh, function (e, r) { 71 | 72 | var callArgs = bcapi._get.getCall(0).args; 73 | expect(callArgs[0]).to.equal('/blocks/' + hh); 74 | expect(callArgs[1]).to.deep.equal(params); 75 | expect(typeof callArgs[2]).to.equal('function'); 76 | expect(Object.keys(callArgs).length).to.equal(3); 77 | 78 | expect(e).to.equal(null); 79 | expect(r).to.deep.equal(validReturn); 80 | done(); 81 | }); 82 | })); 83 | 84 | it('When block hash/height is an int and params does NOT exist', test(function (done) { 85 | 86 | let hh = 12345; 87 | let params = {}; 88 | 89 | let validReturn = { data: { key1: 'value', key2: 2 } }; 90 | this.stub(bcapi, '_get').yields(null, validReturn); 91 | bcapi.getBlock(hh, function (e, r) { 92 | 93 | var callArgs = bcapi._get.getCall(0).args; 94 | expect(callArgs[0]).to.equal('/blocks/' + hh); 95 | expect(callArgs[1]).to.deep.equal(params); 96 | expect(typeof callArgs[2]).to.equal('function'); 97 | expect(Object.keys(callArgs).length).to.equal(3); 98 | 99 | expect(e).to.equal(null); 100 | expect(r).to.deep.equal(validReturn); 101 | done(); 102 | }); 103 | })); 104 | 105 | });//end of success cases; 106 | 107 | describe('Errors: ', function () { 108 | 109 | it('bubbles up error when _get returns error', test(function (done) { 110 | 111 | let hh = '12345'; 112 | let params = {}; 113 | let badRequestError = "Bad Request"; 114 | 115 | let validReturn = { data: { key1: 'value', key2: 2 } }; 116 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 117 | bcapi.getBlock(hh, params, function (e, r) { 118 | 119 | var callArgs = bcapi._get.getCall(0).args; 120 | expect(callArgs[0]).to.equal('/blocks/' + hh); 121 | expect(callArgs[1]).to.deep.equal(params); 122 | expect(typeof callArgs[2]).to.equal('function'); 123 | expect(Object.keys(callArgs).length).to.equal(3); 124 | 125 | expect(e).to.equal(badRequestError); 126 | expect(r).to.deep.equal(validReturn); 127 | done(); 128 | }); 129 | })); 130 | 131 | it.skip('should return error when block hash/height is missing', function (done) { done() }); 132 | 133 | 134 | });//end of error cases; 135 | 136 | 137 | 138 | });//end of getBlock 139 | -------------------------------------------------------------------------------- /tests/unit/getChain.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getChain Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.getChain(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | 43 | let validEndpoint = '/'; 44 | let params = {}; 45 | 46 | let validReturn = {}; 47 | let badRequestError = "Bad Request"; 48 | this.stub(bcapi, '_get').yields(badRequestError, null); 49 | bcapi.getChain(function (e, r) { 50 | 51 | var callArgs = bcapi._get.getCall(0).args; 52 | expect(callArgs[0]).to.equal(validEndpoint); 53 | expect(callArgs[1]).to.deep.equal(params); 54 | expect(typeof callArgs[2]).to.equal('function'); 55 | expect(Object.keys(callArgs).length).to.equal(3); 56 | 57 | expect(e).to.equal(badRequestError); 58 | expect(r).to.deep.equal(null); 59 | done(); 60 | }); 61 | })); 62 | 63 | });//end of getChain 64 | -------------------------------------------------------------------------------- /tests/unit/getHDWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getHDWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name a string and params exists', test(function (done) { 23 | 24 | let name = 'human'; 25 | let params = {}; 26 | let validEndpoint = '/wallets/hd/' + name; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getHDWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _get returns error', test(function (done) { 49 | 50 | let name = '12345'; 51 | let params = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/hd/' + name; 54 | 55 | let validReturn = { data: { key1: 'value', key2: 2 } }; 56 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 57 | bcapi.getHDWallet(name, function (e, r) { 58 | 59 | var callArgs = bcapi._get.getCall(0).args; 60 | expect(callArgs[0]).to.equal(validEndpoint); 61 | expect(callArgs[1]).to.deep.equal(params); 62 | expect(typeof callArgs[2]).to.equal('function'); 63 | expect(Object.keys(callArgs).length).to.equal(3); 64 | 65 | expect(e).to.equal(badRequestError); 66 | expect(r).to.deep.equal(validReturn); 67 | done(); 68 | }); 69 | })); 70 | 71 | it.skip('should return error when name is missing', function (done) { done() }); 72 | 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of getHDWallet 79 | -------------------------------------------------------------------------------- /tests/unit/getHook.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getHook Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When id exists', test(function (done) { 23 | 24 | let id = '12345'; 25 | let params = {}; 26 | let validEndpoint = '/hooks/' + id; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getHook(id, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | 45 | });//end of success cases; 46 | 47 | describe('Errors: ', function () { 48 | 49 | it('bubbles up error when _get returns error', test(function (done) { 50 | 51 | let id = '12345'; 52 | let params = {}; 53 | let badRequestError = "Bad Request"; 54 | let validEndpoint = '/hooks/' + id; 55 | 56 | let validReturn = { data: { key1: 'value', key2: 2 } }; 57 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 58 | bcapi.getHook(id, function (e, r) { 59 | 60 | var callArgs = bcapi._get.getCall(0).args; 61 | expect(callArgs[0]).to.equal(validEndpoint); 62 | expect(callArgs[1]).to.deep.equal(params); 63 | expect(typeof callArgs[2]).to.equal('function'); 64 | expect(Object.keys(callArgs).length).to.equal(3); 65 | 66 | expect(e).to.equal(badRequestError); 67 | expect(r).to.deep.equal(validReturn); 68 | done(); 69 | }); 70 | })); 71 | 72 | it.skip('should return error when id is missing', function (done) { done() }); 73 | 74 | 75 | });//end of error cases; 76 | 77 | 78 | 79 | });//end of getHook 80 | -------------------------------------------------------------------------------- /tests/unit/getTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When hash is a string and params exists', test(function (done) { 23 | 24 | let hash = '12345'; 25 | let params = {}; 26 | let validEndpoint = '/txs/' + hash; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getTX(hash, params, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | it.skip('When hash is a string and params does NOT exist', test(function (done) { 45 | 46 | let hash = '12345'; 47 | let params = {}; 48 | let validEndpoint = '/txs/' + hash; 49 | 50 | let validReturn = { data: { key1: 'value', key2: 2 } }; 51 | this.stub(bcapi, '_get').yields(null, validReturn); 52 | bcapi.getTX(hash, function (e, r) { 53 | 54 | var callArgs = bcapi._get.getCall(0).args; 55 | expect(callArgs[0]).to.equal(validEndpoint); 56 | expect(callArgs[1]).to.deep.equal(params); 57 | expect(typeof callArgs[2]).to.equal('function'); 58 | expect(Object.keys(callArgs).length).to.equal(3); 59 | 60 | expect(e).to.equal(null); 61 | expect(r).to.deep.equal(validReturn); 62 | done(); 63 | }); 64 | })); 65 | 66 | 67 | });//end of success cases; 68 | 69 | describe('Errors: ', function () { 70 | 71 | it('bubbles up error when _get returns error', test(function (done) { 72 | 73 | let hash = '12345'; 74 | let params = {}; 75 | let badRequestError = "Bad Request"; 76 | let validEndpoint = '/txs/' + hash; 77 | 78 | let validReturn = { data: { key1: 'value', key2: 2 } }; 79 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 80 | bcapi.getTX(hash, params, function (e, r) { 81 | 82 | var callArgs = bcapi._get.getCall(0).args; 83 | expect(callArgs[0]).to.equal(validEndpoint); 84 | expect(callArgs[1]).to.deep.equal(params); 85 | expect(typeof callArgs[2]).to.equal('function'); 86 | expect(Object.keys(callArgs).length).to.equal(3); 87 | 88 | expect(e).to.equal(badRequestError); 89 | expect(r).to.deep.equal(validReturn); 90 | done(); 91 | }); 92 | })); 93 | 94 | it.skip('should return error when hash is missing', function (done) { done() }); 95 | 96 | 97 | });//end of error cases; 98 | 99 | 100 | 101 | });//end of getTX 102 | -------------------------------------------------------------------------------- /tests/unit/getTXConf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getTXConf Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When hash is a string and params exists', test(function (done) { 23 | 24 | let hash = '12345'; 25 | let params = {}; 26 | let validEndpoint = '/txs/' + hash + '/confidence'; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getTXConf(hash, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _get returns error', test(function (done) { 49 | 50 | let hash = '12345'; 51 | let params = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/txs/' + hash + '/confidence'; 54 | 55 | let validReturn = { data: { key1: 'value', key2: 2 } }; 56 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 57 | bcapi.getTXConf(hash, function (e, r) { 58 | 59 | var callArgs = bcapi._get.getCall(0).args; 60 | expect(callArgs[0]).to.equal(validEndpoint); 61 | expect(callArgs[1]).to.deep.equal(params); 62 | expect(typeof callArgs[2]).to.equal('function'); 63 | expect(Object.keys(callArgs).length).to.equal(3); 64 | 65 | expect(e).to.equal(badRequestError); 66 | expect(r).to.deep.equal(validReturn); 67 | done(); 68 | }); 69 | })); 70 | 71 | it.skip('should return error when hash is missing', function (done) { done() }); 72 | 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of getTXConf 79 | -------------------------------------------------------------------------------- /tests/unit/getUnTXs.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getUnTXs Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/txs'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.getUnTXs(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | let validReturn = {}; 43 | let validEndpoint = '/txs'; 44 | 45 | let badRequestError = "Bad Request"; 46 | this.stub(bcapi, '_get').yields(badRequestError, null); 47 | bcapi.getUnTXs(function (e, r) { 48 | 49 | var callArgs = bcapi._get.getCall(0).args; 50 | expect(callArgs[0]).to.equal(validEndpoint); 51 | expect(callArgs[1]).to.deep.equal({}); 52 | expect(typeof callArgs[2]).to.equal('function'); 53 | expect(Object.keys(callArgs).length).to.equal(3); 54 | 55 | expect(e).to.equal(badRequestError); 56 | expect(r).to.deep.equal(null); 57 | done(); 58 | }); 59 | })); 60 | 61 | });//end of getUnTXs 62 | -------------------------------------------------------------------------------- /tests/unit/getWallet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher getWallet Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When name is a string and params exists', test(function (done) { 23 | 24 | let name = 'human'; 25 | let params = {}; 26 | let validEndpoint = '/wallets/' + name; 27 | 28 | let validReturn = { data: { key1: 'value', key2: 2 } }; 29 | this.stub(bcapi, '_get').yields(null, validReturn); 30 | bcapi.getWallet(name, function (e, r) { 31 | 32 | var callArgs = bcapi._get.getCall(0).args; 33 | expect(callArgs[0]).to.equal(validEndpoint); 34 | expect(callArgs[1]).to.deep.equal(params); 35 | expect(typeof callArgs[2]).to.equal('function'); 36 | expect(Object.keys(callArgs).length).to.equal(3); 37 | 38 | expect(e).to.equal(null); 39 | expect(r).to.deep.equal(validReturn); 40 | done(); 41 | }); 42 | })); 43 | 44 | });//end of success cases; 45 | 46 | describe('Errors: ', function () { 47 | 48 | it('bubbles up error when _get returns error', test(function (done) { 49 | 50 | let name = '12345'; 51 | let params = {}; 52 | let badRequestError = "Bad Request"; 53 | let validEndpoint = '/wallets/' + name; 54 | 55 | let validReturn = { data: { key1: 'value', key2: 2 } }; 56 | this.stub(bcapi, '_get').yields(badRequestError, validReturn); 57 | bcapi.getWallet(name, function (e, r) { 58 | 59 | var callArgs = bcapi._get.getCall(0).args; 60 | expect(callArgs[0]).to.equal(validEndpoint); 61 | expect(callArgs[1]).to.deep.equal(params); 62 | expect(typeof callArgs[2]).to.equal('function'); 63 | expect(Object.keys(callArgs).length).to.equal(3); 64 | 65 | expect(e).to.equal(badRequestError); 66 | expect(r).to.deep.equal(validReturn); 67 | done(); 68 | }); 69 | })); 70 | 71 | it.skip('should return error when name is missing', function (done) { done() }); 72 | 73 | 74 | });//end of error cases; 75 | 76 | 77 | 78 | });//end of getWallet 79 | -------------------------------------------------------------------------------- /tests/unit/listHDWallets.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher listHDWallets Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/wallets/hd'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.listHDWallets(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | let validReturn = {}; 43 | let validEndpoint = '/wallets/hd'; 44 | 45 | let badRequestError = "Bad Request"; 46 | this.stub(bcapi, '_get').yields(badRequestError, null); 47 | bcapi.listHDWallets(function (e, r) { 48 | 49 | var callArgs = bcapi._get.getCall(0).args; 50 | expect(callArgs[0]).to.equal(validEndpoint); 51 | expect(callArgs[1]).to.deep.equal({}); 52 | expect(typeof callArgs[2]).to.equal('function'); 53 | expect(Object.keys(callArgs).length).to.equal(3); 54 | 55 | expect(e).to.equal(badRequestError); 56 | expect(r).to.deep.equal(null); 57 | done(); 58 | }); 59 | })); 60 | 61 | });//end of listHDWallets 62 | -------------------------------------------------------------------------------- /tests/unit/listHooks.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher listHooks Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/hooks'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.listHooks(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | let validReturn = {}; 43 | let validEndpoint = '/hooks'; 44 | 45 | let badRequestError = "Bad Request"; 46 | this.stub(bcapi, '_get').yields(badRequestError, null); 47 | bcapi.listHooks(function (e, r) { 48 | 49 | var callArgs = bcapi._get.getCall(0).args; 50 | expect(callArgs[0]).to.equal(validEndpoint); 51 | expect(callArgs[1]).to.deep.equal({}); 52 | expect(typeof callArgs[2]).to.equal('function'); 53 | expect(Object.keys(callArgs).length).to.equal(3); 54 | 55 | expect(e).to.equal(badRequestError); 56 | expect(r).to.deep.equal(null); 57 | done(); 58 | }); 59 | })); 60 | 61 | });//end of listHooks 62 | -------------------------------------------------------------------------------- /tests/unit/listPayFwds.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher listPayFwds Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/payments'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.listPayFwds(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | let validReturn = {}; 43 | let validEndpoint = '/payments'; 44 | 45 | let badRequestError = "Bad Request"; 46 | this.stub(bcapi, '_get').yields(badRequestError, null); 47 | bcapi.listPayFwds(function (e, r) { 48 | 49 | var callArgs = bcapi._get.getCall(0).args; 50 | expect(callArgs[0]).to.equal(validEndpoint); 51 | expect(callArgs[1]).to.deep.equal({}); 52 | expect(typeof callArgs[2]).to.equal('function'); 53 | expect(Object.keys(callArgs).length).to.equal(3); 54 | 55 | expect(e).to.equal(badRequestError); 56 | expect(r).to.deep.equal(null); 57 | done(); 58 | }); 59 | })); 60 | 61 | });//end of listPayFwds 62 | -------------------------------------------------------------------------------- /tests/unit/listWallets.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher listWallets Method: ', function () { 18 | 19 | it('should return success', test(function (done) { 20 | 21 | let validEndpoint = '/wallets'; 22 | let params = {}; 23 | 24 | let validReturn = { data: { key1: 'value', key2: 2 } }; 25 | this.stub(bcapi, '_get').yields(null, validReturn); 26 | bcapi.listWallets(function (e, r) { 27 | 28 | var callArgs = bcapi._get.getCall(0).args; 29 | expect(callArgs[0]).to.equal(validEndpoint); 30 | expect(callArgs[1]).to.deep.equal(params); 31 | expect(typeof callArgs[2]).to.equal('function'); 32 | expect(Object.keys(callArgs).length).to.equal(3); 33 | 34 | expect(e).to.equal(null); 35 | expect(r).to.deep.equal(validReturn); 36 | done(); 37 | }); 38 | })); 39 | 40 | 41 | it('should return error', test(function (done) { 42 | let validReturn = {}; 43 | let validEndpoint = '/wallets'; 44 | 45 | let badRequestError = "Bad Request"; 46 | this.stub(bcapi, '_get').yields(badRequestError, null); 47 | bcapi.listWallets(function (e, r) { 48 | 49 | var callArgs = bcapi._get.getCall(0).args; 50 | expect(callArgs[0]).to.equal(validEndpoint); 51 | expect(callArgs[1]).to.deep.equal({}); 52 | expect(typeof callArgs[2]).to.equal('function'); 53 | expect(Object.keys(callArgs).length).to.equal(3); 54 | 55 | expect(e).to.equal(badRequestError); 56 | expect(r).to.deep.equal(null); 57 | done(); 58 | }); 59 | })); 60 | 61 | });//end of listWallets 62 | -------------------------------------------------------------------------------- /tests/unit/microTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher microTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When data.destination && data.callback_url exist', test(function (done) { 23 | 24 | let data = {}; //micro tx obj 25 | let validData = data; 26 | let params = {}; 27 | let validEndpoint = '/txs/micro'; 28 | 29 | let validReturn = { data: { key1: 'value', key2: 2 } }; 30 | this.stub(bcapi, '_post').yields(null, validReturn); 31 | bcapi.microTX(data, function (e, r) { 32 | 33 | var callArgs = bcapi._post.getCall(0).args; 34 | expect(callArgs[0]).to.equal(validEndpoint); 35 | expect(callArgs[1]).to.deep.equal(params); 36 | expect(callArgs[2]).to.deep.equal(validData); 37 | expect(typeof callArgs[3]).to.equal('function'); 38 | expect(Object.keys(callArgs).length).to.equal(4); 39 | 40 | expect(e).to.equal(null); 41 | expect(r).to.deep.equal(validReturn); 42 | done(); 43 | }); 44 | })); 45 | 46 | });//end of success cases; 47 | 48 | describe('Errors: ', function () { 49 | 50 | it('bubbles up error when _post returns error', test(function (done) { 51 | 52 | let data = {}; //micro tx obj 53 | let validData = data; 54 | let params = {}; 55 | let badRequestError = "Bad Request"; 56 | let validEndpoint = '/txs/micro'; 57 | 58 | 59 | let validReturn = { data: { key1: 'value', key2: 2 } }; 60 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 61 | bcapi.microTX(data, function (e, r) { 62 | 63 | var callArgs = bcapi._post.getCall(0).args; 64 | expect(callArgs[0]).to.equal(validEndpoint); 65 | expect(callArgs[1]).to.deep.equal(params); 66 | expect(callArgs[2]).to.deep.equal(validData); 67 | expect(typeof callArgs[3]).to.equal('function'); 68 | expect(Object.keys(callArgs).length).to.equal(4); 69 | 70 | expect(e).to.equal(badRequestError); 71 | expect(r).to.deep.equal(validReturn); 72 | done(); 73 | }); 74 | })); 75 | 76 | it.skip('When micro is null/undefined', function (done) { done(); }); //TODO Error out when micro does not exist 77 | 78 | });//end of error cases; 79 | 80 | 81 | 82 | });//end of microTX 83 | -------------------------------------------------------------------------------- /tests/unit/newTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher newTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When tx exist', test(function (done) { 23 | 24 | let tx = {}; //TODO make actual tx 25 | 26 | let validData = tx; 27 | let params = {}; 28 | let validEndpoint = '/txs/new'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.newTX(tx, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let tx = {}; //TODO make actual tx 54 | let validData = tx; 55 | let params = {}; 56 | let badRequestError = "Bad Request"; 57 | let validEndpoint = '/txs/new'; 58 | 59 | 60 | let validReturn = { data: { key1: 'value', key2: 2 } }; 61 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 62 | bcapi.newTX(tx, function (e, r) { 63 | 64 | var callArgs = bcapi._post.getCall(0).args; 65 | expect(callArgs[0]).to.equal(validEndpoint); 66 | expect(callArgs[1]).to.deep.equal(params); 67 | expect(callArgs[2]).to.deep.equal(validData); 68 | expect(typeof callArgs[3]).to.equal('function'); 69 | expect(Object.keys(callArgs).length).to.equal(4); 70 | 71 | expect(e).to.equal(badRequestError); 72 | expect(r).to.deep.equal(validReturn); 73 | done(); 74 | }); 75 | })); 76 | 77 | it.skip('When tx is null/undefined', function (done) { done(); }); //TODO Error out when tx does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of newTX 84 | -------------------------------------------------------------------------------- /tests/unit/pushTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher pushTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When hex exist', test(function (done) { 23 | 24 | let hex = 'fancyHex'; 25 | 26 | let validData = { tx: hex }; 27 | let params = {}; 28 | let validEndpoint = '/txs/push'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.pushTX(hex, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let hex = 'fancyHex'; 54 | let validData = { tx: hex }; 55 | let params = {}; 56 | let badRequestError = "Bad Request"; 57 | let validEndpoint = '/txs/push'; 58 | 59 | 60 | let validReturn = { data: { key1: 'value', key2: 2 } }; 61 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 62 | bcapi.pushTX(hex, function (e, r) { 63 | 64 | var callArgs = bcapi._post.getCall(0).args; 65 | expect(callArgs[0]).to.equal(validEndpoint); 66 | expect(callArgs[1]).to.deep.equal(params); 67 | expect(callArgs[2]).to.deep.equal(validData); 68 | expect(typeof callArgs[3]).to.equal('function'); 69 | expect(Object.keys(callArgs).length).to.equal(4); 70 | 71 | expect(e).to.equal(badRequestError); 72 | expect(r).to.deep.equal(validReturn); 73 | done(); 74 | }); 75 | })); 76 | 77 | it.skip('When hex is null/undefined', function (done) { done(); }); //TODO Error out when hex does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of pushTX 84 | -------------------------------------------------------------------------------- /tests/unit/sendTX.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const sinon = require('sinon'); 4 | const sinonTest = require('sinon-test'); 5 | var test = sinonTest(sinon); 6 | const expect = require('chai').expect; 7 | let request = require('superagent'); 8 | 9 | 10 | let BlockCypher = require('../../lib/bcypher'); 11 | let chain = 'btc'; 12 | let network = 'main'; 13 | let token = process.env.TOKEN; 14 | let bcapi = new BlockCypher(chain, network, token); 15 | 16 | 17 | describe('Blockcypher sendTX Method: ', function () { 18 | 19 | 20 | describe('Success: ', function () { 21 | 22 | it('When txskel exist', test(function (done) { 23 | 24 | let txskel = {}; //TODO make actual txskel 25 | 26 | let validData = txskel; 27 | let params = {}; 28 | let validEndpoint = '/txs/send'; 29 | 30 | let validReturn = { data: { key1: 'value', key2: 2 } }; 31 | this.stub(bcapi, '_post').yields(null, validReturn); 32 | bcapi.sendTX(txskel, function (e, r) { 33 | 34 | var callArgs = bcapi._post.getCall(0).args; 35 | expect(callArgs[0]).to.equal(validEndpoint); 36 | expect(callArgs[1]).to.deep.equal(params); 37 | expect(callArgs[2]).to.deep.equal(validData); 38 | expect(typeof callArgs[3]).to.equal('function'); 39 | expect(Object.keys(callArgs).length).to.equal(4); 40 | 41 | expect(e).to.equal(null); 42 | expect(r).to.deep.equal(validReturn); 43 | done(); 44 | }); 45 | })); 46 | 47 | });//end of success cases; 48 | 49 | describe('Errors: ', function () { 50 | 51 | it('bubbles up error when _post returns error', test(function (done) { 52 | 53 | let txskel = {}; //TODO make actual txskel 54 | let validData = txskel; 55 | let params = {}; 56 | let badRequestError = "Bad Request"; 57 | let validEndpoint = '/txs/send'; 58 | 59 | 60 | let validReturn = { data: { key1: 'value', key2: 2 } }; 61 | this.stub(bcapi, '_post').yields(badRequestError, validReturn); 62 | bcapi.sendTX(txskel, function (e, r) { 63 | 64 | var callArgs = bcapi._post.getCall(0).args; 65 | expect(callArgs[0]).to.equal(validEndpoint); 66 | expect(callArgs[1]).to.deep.equal(params); 67 | expect(callArgs[2]).to.deep.equal(validData); 68 | expect(typeof callArgs[3]).to.equal('function'); 69 | expect(Object.keys(callArgs).length).to.equal(4); 70 | 71 | expect(e).to.equal(badRequestError); 72 | expect(r).to.deep.equal(validReturn); 73 | done(); 74 | }); 75 | })); 76 | 77 | it.skip('When tx is null/undefined', function (done) { done(); }); //TODO Error out when tx does not exist 78 | 79 | });//end of error cases; 80 | 81 | 82 | 83 | });//end of sendTX 84 | --------------------------------------------------------------------------------