From 1c6939ab4354faebbef626a9400b284ce1e93f20 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 23 Nov 2025 10:30:23 -0800 Subject: [PATCH] fix(integration tests): Only supporting BCH, all tests in one directory --- package.json | 8 +- .../integration/chains/bchn/rawtransaction.js | 71 ----- test/integration/chains/bchn/slp.js | 301 ------------------ .../chains/bchn/transaction-integration.js | 38 --- test/integration/chains/bchn/util.js | 27 -- test/integration/{chains/bchn => }/dsproof.js | 2 +- .../bchn => }/psf-slp-indexer.integration.js | 2 +- test/integration/rawtransaction.js | 34 ++ test/integration/slp.js | 142 +++++++++ test/integration/transaction-integration.js | 24 ++ .../{chains/bchn => }/utxo-integration.js | 2 +- 11 files changed, 207 insertions(+), 444 deletions(-) delete mode 100644 test/integration/chains/bchn/rawtransaction.js delete mode 100644 test/integration/chains/bchn/slp.js delete mode 100644 test/integration/chains/bchn/transaction-integration.js delete mode 100644 test/integration/chains/bchn/util.js rename test/integration/{chains/bchn => }/dsproof.js (93%) rename test/integration/{chains/bchn => }/psf-slp-indexer.integration.js (99%) rename test/integration/{chains/bchn => }/utxo-integration.js (99%) diff --git a/package.json b/package.json index b0fab3b..0152a5f 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ "scripts": { "test": "c8 mocha --trace-warnings --unhandled-rejections=strict --timeout 30000 test/unit/", "test:integration": "npm run test:integration:bchn", - "test:integration:nft": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 -g '#nft1' test/integration/chains/bchn/slp.js", - "test:integration:bchn": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/", - "test:integration:local:bchn": "export RESTURL=http://localhost:5942/v6/ && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/", - "test:integration:decatur:bchn": "export RESTURL=http://192.168.2.127:5942/v6/ && mocha --timeout 30000 test/integration/ && mocha --timeout 30000 test/integration/chains/bchn/", + "test:integration:nft": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 -g '#nft1' test/integration/slp.js", + "test:integration:bchn": "export RESTURL=https://bchn.fullstack.cash/v6/ && export IS_USING_FREE_TIER=true && mocha --timeout 30000 test/integration/", + "test:integration:local:bchn": "export RESTURL=http://localhost:5942/v6/ && mocha --timeout 30000 test/integration/", + "test:integration:decatur:bchn": "export RESTURL=http://192.168.2.127:5942/v6/ && mocha --timeout 30000 test/integration/", "test:integration:decatur:abc": "export RESTURL=http://192.168.2.142:5942/v6/ && mocha --timeout 30000 test/integration && mocha --timeout 30000 test/integration/chains/abc/", "test:integration:temp:bchn": "export RESTURL=http://157.90.174.219:5942/v6/ && mocha --timeout 30000 test/integration/", "coverage": "nyc --reporter=html mocha --timeout 25000 test/unit/", diff --git a/test/integration/chains/bchn/rawtransaction.js b/test/integration/chains/bchn/rawtransaction.js deleted file mode 100644 index a7670f2..0000000 --- a/test/integration/chains/bchn/rawtransaction.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - Integration tests for the bchjs. Only covers calls made to - rest.bitcoin.com. - - TODO -*/ - -import chai from 'chai' -import BCHJS from '../../../../src/bch-js.js' - -// Inspect utility used for debugging. -import util from 'util' -const assert = chai.assert -const bchjs = new BCHJS() -util.inspect.defaultOptions = { - showHidden: true, - colors: true, - depth: 3 -} - -describe('#rawtransaction', () => { - beforeEach(async () => { - if (process.env.IS_USING_FREE_TIER) await sleep(3000) - }) - - /* - Testing sentRawTransaction isn't really possible with an integration test, - as the endpoint really needs an e2e test to be properly tested. The tests - below expect error messages returned from the server, but at least test - that the server is responding on those endpoints, and responds consistently. - */ - describe('sendRawTransaction', () => { - it('should send a single transaction hex', async () => { - try { - const hex = - '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000' - - await bchjs.RawTransactions.sendRawTransaction(hex) - // console.log(`result ${JSON.stringify(result, null, 2)}`) - - assert.equal(true, false, 'Unexpected result!') - } catch (err) { - // console.log(`err: ${util.inspect(err)}`) - - assert.hasAllKeys(err, ['error']) - assert.include(err.error, 'Missing inputs') - } - }) - - it('should send an array of tx hexes', async () => { - try { - const hexes = [ - '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000', - '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000' - ] - - const result = await bchjs.RawTransactions.sendRawTransaction(hexes) - console.log(`result ${JSON.stringify(result, null, 2)}`) - } catch (err) { - // console.log(`err: ${util.inspect(err)}`) - - assert.hasAllKeys(err, ['error']) - assert.include(err.error, 'Missing inputs') - } - }) - }) -}) - -function sleep (ms) { - return new Promise(resolve => setTimeout(resolve, ms)) -} diff --git a/test/integration/chains/bchn/slp.js b/test/integration/chains/bchn/slp.js deleted file mode 100644 index c668014..0000000 --- a/test/integration/chains/bchn/slp.js +++ /dev/null @@ -1,301 +0,0 @@ -/* - Integration tests for the bchjs covering SLP tokens. - These tests are specific to the ABC chain. -*/ - -import chai from 'chai' - -import BCHJS from '../../../../src/bch-js.js' - -// Inspect utility used for debugging. -import util from 'util' -const assert = chai.assert -let bchjs -util.inspect.defaultOptions = { - showHidden: true, - colors: true, - depth: 1 -} - -describe('#SLP', () => { - // before(() => { - // console.log(`bchjs.SLP.restURL: ${bchjs.SLP.restURL}`) - // console.log(`bchjs.SLP.apiToken: ${bchjs.SLP.apiToken}`) - // }) - - beforeEach(async () => { - // Introduce a delay so that the BVT doesn't trip the rate limits. - if (process.env.IS_USING_FREE_TIER) await sleep(3000) - - bchjs = new BCHJS() - }) - - if (process.env.TESTSLP) { - describe('#util', () => { - describe('#decodeOpReturn', () => { - it('should decode a NFT Child transaction', async () => { - const txid = - 'eeddccc4d716f04157ea132ac93a48040fea34a6b57f3d8f0cccb7d1a731ab2b' - - const data = await bchjs.SLP.Utils.decodeOpReturn(txid) - // console.log(`data: ${JSON.stringify(data, null, 2)}`) - - assert.property(data, 'tokenType') - assert.property(data, 'txType') - assert.property(data, 'ticker') - assert.property(data, 'name') - assert.property(data, 'tokenId') - assert.property(data, 'documentUri') - assert.property(data, 'documentHash') - assert.property(data, 'decimals') - assert.property(data, 'mintBatonVout') - assert.property(data, 'qty') - - assert.equal(data.tokenType, 65) - assert.equal(data.mintBatonVout, 0) - assert.equal(data.qty, '1') - }) - }) - - describe('#tokenUtxoDetails', () => { - it('should handle a range of UTXO types', async () => { - const utxos = [ - // Malformed SLP tx - { - note: 'Malformed SLP tx', - tx_hash: - 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a', - tx_pos: 1, - value: 546 - }, - // Normal TX (non-SLP) - { - note: 'Normal TX (non-SLP)', - tx_hash: - '01cdaec2f8b311fc2d6ecc930247bd45fa696dc204ab684596e281fe1b06c1f0', - tx_pos: 0, - value: 400000 - }, - // Valid PSF SLP tx - { - note: 'Valid PSF SLP tx', - tx_hash: - 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd', - tx_pos: 1, - value: 546 - }, - // Valid SLP token not in whitelist - { - note: 'Valid SLP token not in whitelist', - tx_hash: - '3a4b628cbcc183ab376d44ce5252325f042268307ffa4a53443e92b6d24fb488', - tx_pos: 1, - value: 546 - }, - // Token send on BCHN network. - { - note: 'Token send on BCHN network', - tx_hash: - '402c663379d9699b6e2dd38737061e5888c5a49fca77c97ab98e79e08959e019', - tx_pos: 1, - value: 546 - }, - // Token send on ABC network. - { - note: 'Token send on ABC network', - tx_hash: - '336bfe2168aac4c3303508a9e8548a0d33797a83b85b76a12d845c8d6674f79d', - tx_pos: 1, - value: 546 - }, - // Known invalid SLP token send of PSF tokens. - { - note: 'Known invalid SLP token send of PSF tokens', - tx_hash: - '2bf691ad3679d928fef880b8a45b93b233f8fa0d0a92cf792313dbe77b1deb74', - tx_pos: 1, - value: 546 - } - ] - - const data = await bchjs.SLP.Utils.tokenUtxoDetails(utxos) - // console.log(`data: ${JSON.stringify(data, null, 2)}`) - - // Malformed SLP tx - assert.equal(data[0].tx_hash, utxos[0].tx_hash) - assert.equal(data[0].isValid, false) - - // Normal TX (non-SLP) - assert.equal(data[1].tx_hash, utxos[1].tx_hash) - assert.equal(data[1].isValid, false) - - // Valid PSF SLP tx - assert.equal(data[2].tx_hash, utxos[2].tx_hash) - assert.equal(data[2].isValid, true) - - // Valid SLP token not in whitelist - assert.equal(data[3].tx_hash, utxos[3].tx_hash) - assert.equal(data[3].isValid, true) - - // Token send on BCHN network - assert.equal(data[4].tx_hash, utxos[4].tx_hash) - assert.equal(data[4].isValid, true) - - // Token send on ABC network - assert.equal(data[5].tx_hash, utxos[5].tx_hash) - assert.equal(data[5].isValid, null) - - // Known invalid SLP token send of PSF tokens - assert.equal(data[6].tx_hash, utxos[6].tx_hash) - assert.equal(data[6].isValid, false) - }) - }) - - describe('#validateTxid3', () => { - it('should invalidate a known invalid TXID', async () => { - const txid = - 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a' - - const result = await bchjs.SLP.Utils.validateTxid3(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - - assert.property(result[0], 'txid') - assert.equal(result[0].txid, txid) - - assert.property(result[0], 'valid') - assert.equal(result[0].valid, null) - }) - - it('should validate a known valid TXID', async () => { - const txid = - 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd' - - const result = await bchjs.SLP.Utils.validateTxid3(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - - assert.property(result[0], 'txid') - assert.equal(result[0].txid, txid) - - assert.property(result[0], 'valid') - assert.equal(result[0].valid, true) - }) - - it('should handle a mix of valid, invalid, and non-SLP txs', async () => { - const txids = [ - // Malformed SLP tx - 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a', - // Normal TX (non-SLP) - '01cdaec2f8b311fc2d6ecc930247bd45fa696dc204ab684596e281fe1b06c1f0', - // Valid PSF SLP tx - 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd', - // Valid SLP token not in whitelist - '3a4b628cbcc183ab376d44ce5252325f042268307ffa4a53443e92b6d24fb488', - // Unprocessed SLP TX - '402c663379d9699b6e2dd38737061e5888c5a49fca77c97ab98e79e08959e019' - ] - - const result = await bchjs.SLP.Utils.validateTxid3(txids) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - - assert.equal(result[0].txid, txids[0]) - assert.equal(result[0].valid, null) - - assert.equal(result[1].txid, txids[1]) - assert.equal(result[1].valid, null) - - assert.equal(result[2].txid, txids[2]) - assert.equal(result[2].valid, true) - - // True in validateTxid() but null in validateTxid3() - assert.equal(result[3].txid, txids[3]) - assert.equal(result[3].valid, null) - - // Note: This should change from null to true once SLPDB finishes indexing. - assert.equal(result[4].txid, txids[4]) - assert.equal(result[4].valid, null) - }) - }) - - describe('#validateTxid', () => { - it('should handle a mix of valid, invalid, and non-SLP txs', async () => { - const txids = [ - // Malformed SLP tx - 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a', - // Normal TX (non-SLP) - '01cdaec2f8b311fc2d6ecc930247bd45fa696dc204ab684596e281fe1b06c1f0', - // Valid PSF SLP tx - 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd', - // Valid SLP token not in whitelist - '3a4b628cbcc183ab376d44ce5252325f042268307ffa4a53443e92b6d24fb488', - // Token send on BCHN network. - '402c663379d9699b6e2dd38737061e5888c5a49fca77c97ab98e79e08959e019', - // Token send on ABC network. - '336bfe2168aac4c3303508a9e8548a0d33797a83b85b76a12d845c8d6674f79d' - ] - - const result = await bchjs.SLP.Utils.validateTxid(txids) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - - assert.equal(result[0].txid, txids[0]) - assert.equal(result[0].valid, null) - - assert.equal(result[1].txid, txids[1]) - assert.equal(result[1].valid, null) - - assert.equal(result[2].txid, txids[2]) - assert.equal(result[2].valid, true) - - // True in validateTxid() but null in validateTxid3() - assert.equal(result[3].txid, txids[3]) - assert.equal(result[3].valid, true) - - assert.equal(result[4].txid, txids[4]) - assert.equal(result[4].valid, true) - - assert.equal(result[5].txid, txids[5]) - assert.equal(result[5].valid, null) - }) - }) - }) - describe('#nft1', () => { - describe('#listNFTGroupChildren', () => { - it('should return array of children GENESIS transactions IDs', async () => { - const groupId = - '68cd33ecd909068fbea318ae5ff1d6207cf754e53b191327d6d73b6916424c0a' - const result = await bchjs.SLP.NFT1.listNFTGroupChildren(groupId) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - assert.property(result, 'nftChildren') - assert.isArray(result.nftChildren) - }) - }) - describe('#parentNFTGroup', () => { - it('should return parent NFT group information', async () => { - const tokenId = - '45a30085691d6ea586e3ec2aa9122e9b0e0d6c3c1fd357decccc15d8efde48a9' - const result = await bchjs.SLP.NFT1.parentNFTGroup(tokenId) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - assert.property(result, 'nftGroup') - assert.property(result.nftGroup, 'id') - assert.property(result.nftGroup, 'name') - assert.property(result.nftGroup, 'symbol') - assert.property(result.nftGroup, 'documentUri') - assert.property(result.nftGroup, 'versionType') - assert.property(result.nftGroup, 'initialTokenQty') - }) - }) - }) - } -}) - -// Promise-based sleep function -function sleep (ms) { - return new Promise(resolve => setTimeout(resolve, ms)) -} diff --git a/test/integration/chains/bchn/transaction-integration.js b/test/integration/chains/bchn/transaction-integration.js deleted file mode 100644 index 073881b..0000000 --- a/test/integration/chains/bchn/transaction-integration.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - Integration tests for the transaction.js library. -*/ - -import chai from 'chai' -import BCHJS from '../../../../src/bch-js.js' -const { assert } = chai -const bchjs = new BCHJS() - -describe('#Transaction', () => { - beforeEach(async () => { - if (process.env.IS_USING_FREE_TIER) await bchjs.Util.sleep(1000) - }) - - describe('#get', () => { - it('should get a tx details for a non-SLP TX with an OP_RETURN', async () => { - const txid = - '01517ff1587fa5ffe6f5eb91c99cf3f2d22330cd7ee847e928ce90ca95bf781b' - - const result = await bchjs.Transaction.get(txid) - // console.log('result: ', result) - - assert.property(result.txData, 'txid') - assert.property(result.txData, 'vin') - assert.property(result.txData, 'vout') - assert.equal(result.txData.isValidSlp, false) - }) - - it('should handle a coinbase transaction', async () => { - const txid = 'cca1d2dd3a533d2f501448dec03face2cb2814afd59a533a611e9a2909f2302b' - - const details = await bchjs.Transaction.get(txid) - // console.log(`details: ${JSON.stringify(details, null, 2)}`) - - assert.property(details.txData, 'txid') - }) - }) -}) diff --git a/test/integration/chains/bchn/util.js b/test/integration/chains/bchn/util.js deleted file mode 100644 index 36703ea..0000000 --- a/test/integration/chains/bchn/util.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - Integration tests for the bchjs. Only covers calls made to - rest.bitcoin.com. -*/ - -// import chai from 'chai' -// import BCHJS from '../../../../src/bch-js.js' - -// Inspect utility used for debugging. -import util from 'util' -// const assert = chai.assert -// const bchjs = new BCHJS() -util.inspect.defaultOptions = { - showHidden: true, - colors: true, - depth: 3 -} - -describe('#util', () => { - beforeEach(async () => { - if (process.env.IS_USING_FREE_TIER) await sleep(1500) - }) -}) - -function sleep (ms) { - return new Promise(resolve => setTimeout(resolve, ms)) -} diff --git a/test/integration/chains/bchn/dsproof.js b/test/integration/dsproof.js similarity index 93% rename from test/integration/chains/bchn/dsproof.js rename to test/integration/dsproof.js index c4f6f46..324b4f3 100644 --- a/test/integration/chains/bchn/dsproof.js +++ b/test/integration/dsproof.js @@ -6,7 +6,7 @@ import chai from 'chai' // Local libraries -import BCHJS from '../../../../src/bch-js.js' +import BCHJS from '../../src/bch-js.js' const { assert } = chai const bchjs = new BCHJS() diff --git a/test/integration/chains/bchn/psf-slp-indexer.integration.js b/test/integration/psf-slp-indexer.integration.js similarity index 99% rename from test/integration/chains/bchn/psf-slp-indexer.integration.js rename to test/integration/psf-slp-indexer.integration.js index ed00e68..d8199a2 100644 --- a/test/integration/chains/bchn/psf-slp-indexer.integration.js +++ b/test/integration/psf-slp-indexer.integration.js @@ -7,7 +7,7 @@ import chai from 'chai' // Local libraries -import BCHJS from '../../../../src/bch-js.js' +import BCHJS from '../../src/bch-js.js' const { assert } = chai let bchjs diff --git a/test/integration/rawtransaction.js b/test/integration/rawtransaction.js index 1de34ad..a5c3fb7 100644 --- a/test/integration/rawtransaction.js +++ b/test/integration/rawtransaction.js @@ -231,6 +231,40 @@ describe('#rawtransaction', () => { that the server is responding on those endpoints, and responds consistently. */ describe('#sendRawTransaction', () => { + it('should send a single transaction hex', async () => { + try { + const hex = + '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000' + + await bchjs.RawTransactions.sendRawTransaction(hex) + // console.log(`result ${JSON.stringify(result, null, 2)}`) + + assert.equal(true, false, 'Unexpected result!') + } catch (err) { + // console.log(`err: ${util.inspect(err)}`) + + assert.hasAllKeys(err, ['error']) + assert.include(err.error, 'Missing inputs') + } + }) + + it('should send an array of tx hexes', async () => { + try { + const hexes = [ + '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000', + '01000000013ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000006a4730440220540986d1c58d6e76f8f05501c520c38ce55393d0ed7ed3c3a82c69af04221232022058ea43ed6c05fec0eccce749a63332ed4525460105346f11108b9c26df93cd72012103083dfc5a0254613941ddc91af39ff90cd711cdcde03a87b144b883b524660c39ffffffff01807c814a000000001976a914d7e7c4e0b70eaa67ceff9d2823d1bbb9f6df9a5188ac00000000' + ] + + const result = await bchjs.RawTransactions.sendRawTransaction(hexes) + console.log(`result ${JSON.stringify(result, null, 2)}`) + } catch (err) { + // console.log(`err: ${util.inspect(err)}`) + + assert.hasAllKeys(err, ['error']) + assert.include(err.error, 'Missing inputs') + } + }) + it('should throw error on array size rate limit', async () => { try { const dataMock = diff --git a/test/integration/slp.js b/test/integration/slp.js index 5d7f276..0121b59 100644 --- a/test/integration/slp.js +++ b/test/integration/slp.js @@ -524,6 +524,148 @@ describe('#SLP', () => { }) }) }) + + describe('#validateTxid3', () => { + it('should invalidate a known invalid TXID', async () => { + const txid = + 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a' + + const result = await bchjs.SLP.Utils.validateTxid3(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isArray(result) + + assert.property(result[0], 'txid') + assert.equal(result[0].txid, txid) + + assert.property(result[0], 'valid') + assert.equal(result[0].valid, null) + }) + + it('should validate a known valid TXID', async () => { + const txid = + 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd' + + const result = await bchjs.SLP.Utils.validateTxid3(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isArray(result) + + assert.property(result[0], 'txid') + assert.equal(result[0].txid, txid) + + assert.property(result[0], 'valid') + assert.equal(result[0].valid, true) + }) + + it('should handle a mix of valid, invalid, and non-SLP txs', async () => { + const txids = [ + // Malformed SLP tx + 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a', + // Normal TX (non-SLP) + '01cdaec2f8b311fc2d6ecc930247bd45fa696dc204ab684596e281fe1b06c1f0', + // Valid PSF SLP tx + 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd', + // Valid SLP token not in whitelist + '3a4b628cbcc183ab376d44ce5252325f042268307ffa4a53443e92b6d24fb488', + // Unprocessed SLP TX + '402c663379d9699b6e2dd38737061e5888c5a49fca77c97ab98e79e08959e019' + ] + + const result = await bchjs.SLP.Utils.validateTxid3(txids) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isArray(result) + + assert.equal(result[0].txid, txids[0]) + assert.equal(result[0].valid, null) + + assert.equal(result[1].txid, txids[1]) + assert.equal(result[1].valid, null) + + assert.equal(result[2].txid, txids[2]) + assert.equal(result[2].valid, true) + + // True in validateTxid() but null in validateTxid3() + assert.equal(result[3].txid, txids[3]) + assert.equal(result[3].valid, null) + + // Note: This should change from null to true once SLPDB finishes indexing. + assert.equal(result[4].txid, txids[4]) + assert.equal(result[4].valid, null) + }) + }) + + describe('#validateTxid', () => { + it('should handle a mix of valid, invalid, and non-SLP txs', async () => { + const txids = [ + // Malformed SLP tx + 'f7e5199ef6669ad4d078093b3ad56e355b6ab84567e59ad0f08a5ad0244f783a', + // Normal TX (non-SLP) + '01cdaec2f8b311fc2d6ecc930247bd45fa696dc204ab684596e281fe1b06c1f0', + // Valid PSF SLP tx + 'daf4d8b8045e7a90b7af81bfe2370178f687da0e545511bce1c9ae539eba5ffd', + // Valid SLP token not in whitelist + '3a4b628cbcc183ab376d44ce5252325f042268307ffa4a53443e92b6d24fb488', + // Token send on BCHN network. + '402c663379d9699b6e2dd38737061e5888c5a49fca77c97ab98e79e08959e019', + // Token send on ABC network. + '336bfe2168aac4c3303508a9e8548a0d33797a83b85b76a12d845c8d6674f79d' + ] + + const result = await bchjs.SLP.Utils.validateTxid(txids) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.isArray(result) + + assert.equal(result[0].txid, txids[0]) + assert.equal(result[0].valid, null) + + assert.equal(result[1].txid, txids[1]) + assert.equal(result[1].valid, null) + + assert.equal(result[2].txid, txids[2]) + assert.equal(result[2].valid, true) + + // True in validateTxid() but null in validateTxid3() + assert.equal(result[3].txid, txids[3]) + assert.equal(result[3].valid, true) + + assert.equal(result[4].txid, txids[4]) + assert.equal(result[4].valid, true) + + assert.equal(result[5].txid, txids[5]) + assert.equal(result[5].valid, null) + }) + }) + + describe('#nft1', () => { + describe('#listNFTGroupChildren', () => { + it('should return array of children GENESIS transactions IDs', async () => { + const groupId = + '68cd33ecd909068fbea318ae5ff1d6207cf754e53b191327d6d73b6916424c0a' + const result = await bchjs.SLP.NFT1.listNFTGroupChildren(groupId) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + assert.property(result, 'nftChildren') + assert.isArray(result.nftChildren) + }) + }) + describe('#parentNFTGroup', () => { + it('should return parent NFT group information', async () => { + const tokenId = + '45a30085691d6ea586e3ec2aa9122e9b0e0d6c3c1fd357decccc15d8efde48a9' + const result = await bchjs.SLP.NFT1.parentNFTGroup(tokenId) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + assert.property(result, 'nftGroup') + assert.property(result.nftGroup, 'id') + assert.property(result.nftGroup, 'name') + assert.property(result.nftGroup, 'symbol') + assert.property(result.nftGroup, 'documentUri') + assert.property(result.nftGroup, 'versionType') + assert.property(result.nftGroup, 'initialTokenQty') + }) + }) + }) } }) }) diff --git a/test/integration/transaction-integration.js b/test/integration/transaction-integration.js index 118809a..64aaeeb 100644 --- a/test/integration/transaction-integration.js +++ b/test/integration/transaction-integration.js @@ -12,6 +12,30 @@ describe('#Transaction', () => { if (process.env.IS_USING_FREE_TIER) await bchjs.Util.sleep(1000) }) + describe('#get', () => { + it('should get a tx details for a non-SLP TX with an OP_RETURN', async () => { + const txid = + '01517ff1587fa5ffe6f5eb91c99cf3f2d22330cd7ee847e928ce90ca95bf781b' + + const result = await bchjs.Transaction.get(txid) + // console.log('result: ', result) + + assert.property(result.txData, 'txid') + assert.property(result.txData, 'vin') + assert.property(result.txData, 'vout') + assert.equal(result.txData.isValidSlp, false) + }) + + it('should handle a coinbase transaction', async () => { + const txid = 'cca1d2dd3a533d2f501448dec03face2cb2814afd59a533a611e9a2909f2302b' + + const details = await bchjs.Transaction.get(txid) + // console.log(`details: ${JSON.stringify(details, null, 2)}`) + + assert.property(details.txData, 'txid') + }) + }) + if (process.env.TESTSLP) { describe('#getOld', () => { it('should get details about a non-SLP transaction', async () => { diff --git a/test/integration/chains/bchn/utxo-integration.js b/test/integration/utxo-integration.js similarity index 99% rename from test/integration/chains/bchn/utxo-integration.js rename to test/integration/utxo-integration.js index 9c90e9d..f717e71 100644 --- a/test/integration/chains/bchn/utxo-integration.js +++ b/test/integration/utxo-integration.js @@ -4,7 +4,7 @@ import chai from 'chai' -import BCHJS from '../../../../src/bch-js.js' +import BCHJS from '../../src/bch-js.js' const { assert } = chai const bchjs = new BCHJS() // const bchjs = new BCHJS({ restURL: 'http://192.168.2.129:3000/v5/' })