flosight-api/test/blocks.js
2015-09-22 13:32:41 -04:00

267 lines
8.5 KiB
JavaScript

'use strict';
var should = require('should');
var sinon = require('sinon');
var BlockController = require('../lib/blocks');
var bitcore = require('bitcore');
var _ = require('lodash');
var blocks = require('./data/blocks.json');
var blockIndexes = {
'0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7': {
hash: '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7',
chainWork: '0000000000000000000000000000000000000000000000054626b1839ade284a',
prevHash: '00000000000001a55f3214e9172eb34b20e0bc5bd6b8007f3f149fca2c8991a4',
height: 533974
},
'000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7': {
hash: '000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7',
chainWork: '00000000000000000000000000000000000000000000000544ea52e1575ca753',
prevHash: '00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
height: 533951
},
'00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441': {
hash: '00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441',
chainWork: '00000000000000000000000000000000000000000000000544ea52e0575ba752',
prevHash: '000000000001b9c41e6c4a7b81a068b50cf3f522ee4ac1e942e75ec16e090547',
height: 533950
},
'000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4': {
hash: '000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4',
prevHash: '00000000000000000a9d74a7b527f7b995fc21ceae5aa21087b443469351a362',
height: 375493
},
533974: {
hash: '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7',
chainWork: '0000000000000000000000000000000000000000000000054626b1839ade284a',
prevHash: '00000000000001a55f3214e9172eb34b20e0bc5bd6b8007f3f149fca2c8991a4',
height: 533974
}
};
describe('Blocks', function() {
describe('/blocks/:blockHash route', function() {
var insight = {
'hash': '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7',
'confirmations': 119,
'size': 1011,
'height': 533974,
'version': 536870919,
'merkleroot': 'b06437355844b8178173f3e18ca141472e4b0861daa81ef0f701cf9e51f0283e',
'tx': [
'25a988e54b02e0e5df146a0f8fa7b9db56210533a9f04bdfda5f4ceb6f77aadd',
'b85334bf2df35c6dd5b294efe92ffc793a78edff75a2ca666fc296ffb04bbba0',
'2e01c7a4a0e335112236b711c4aaddd02e8dc59ba2cda416e8f80ff06dddd7e1'
],
'time': 1440987503,
'nonce': 1868753784,
'bits': '1a0cf267',
'difficulty': 1295829.93087696,
'chainwork': '0000000000000000000000000000000000000000000000054626b1839ade284a',
'previousblockhash': '00000000000001a55f3214e9172eb34b20e0bc5bd6b8007f3f149fca2c8991a4',
'nextblockhash': '000000000001e866a8057cde0c650796cb8a59e0e6038dc31c69d7ca6649627d',
'reward': 12.5,
'isMainChain': true,
'poolInfo': {}
};
var bitcoreBlock = bitcore.Block.fromBuffer(new Buffer(blocks['0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7'], 'hex'));
var node = {
getBlock: sinon.stub().callsArgWith(1, null, bitcoreBlock),
services: {
bitcoind: {
getNextBlockHash: sinon.stub().returns('000000000001e866a8057cde0c650796cb8a59e0e6038dc31c69d7ca6649627d'),
getBlockIndex: sinon.stub().returns(blockIndexes['0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7']),
isMainChain: sinon.stub().returns(true)
},
db: {
tip: {
__height: 534092
}
}
}
};
it('block data should be correct', function(done) {
var controller = new BlockController(node);
var req = {};
var res = {};
var next = function() {
should.exist(req.block);
var block = req.block;
should(block).eql(insight);
done();
};
var hash = '0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7';
controller.block(req, res, next, hash);
});
it('block pool info should be correct', function(done) {
var block = bitcore.Block.fromString(blocks['000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4']);
var node = {
getBlock: sinon.stub().callsArgWith(1, null, block),
services: {
bitcoind: {
getNextBlockHash: sinon.stub().returns('000000000001e866a8057cde0c650796cb8a59e0e6038dc31c69d7ca6649627d'),
getBlockIndex: sinon.stub().returns(blockIndexes['000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4']),
isMainChain: sinon.stub().returns(true)
},
db: {
tip: {
__height: 534092
}
}
}
};
var controller = new BlockController(node);
var req = {};
var res = {};
var next = function() {
should.exist(req.block);
var block = req.block;
req.block.poolInfo.poolName.should.equal('Discus Fish');
req.block.poolInfo.url.should.equal('http://f2pool.com/');
done();
};
var hash = '000000000000000004a118407a4e3556ae2d5e882017e7ce526659d8073f13a4';
controller.block(req, res, next, hash);
});
});
describe('/blocks route', function() {
var insight = {
"blocks": [
{
"height": 533951,
"size": 206,
"hash": "000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7",
"time": 1440978683,
"txlength": 1,
"poolInfo": {
"poolName": "AntMiner",
"url": "https://bitmaintech.com/"
}
},
{
"height": 533950,
"size": 206,
"hash": "00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441",
"time": 1440977479,
"txlength": 1,
"poolInfo": {
"poolName": "AntMiner",
"url": "https://bitmaintech.com/"
}
}
],
"length": 2,
"pagination": {
"current": "2015-08-30",
"currentTs": 1440979199,
"isToday": false,
"more": false,
"next": "2015-08-31",
"prev": "2015-08-29"
}
};
var stub = sinon.stub();
stub.onFirstCall().callsArgWith(1, null, bitcore.Block.fromBuffer(blocks['000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7'], 'hex'));
stub.onSecondCall().callsArgWith(1, null, bitcore.Block.fromBuffer(blocks['00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441'], 'hex'))
var hashes = [
'000000000008fbb2e358e382a6f6948b2da24563bba183af447e6e2542e8efc7',
'00000000000006bd8fe9e53780323c0e85719eca771022e1eb6d10c62195c441'
];
var node = {
getBlock: stub,
services: {
bitcoind: {
getBlockIndex: function(hash) {
return blockIndexes[hash];
}
},
db: {
getBlockHashesByTimestamp: sinon.stub().callsArgWith(2, null, hashes)
}
}
};
it('should have correct data', function(done) {
var blocks = new BlockController(node);
var req = {
query: {
limit: 2,
blockDate: '2015-08-30'
}
};
var res = {
jsonp: function(data) {
should(data).eql(insight);
done();
}
};
blocks.list(req, res);
});
});
describe('/block-index/:height route', function() {
var node = {
services: {
bitcoind: {
getBlockIndex: function(height) {
return blockIndexes[height];
}
}
}
};
it('should have correct data', function(done) {
var blocks = new BlockController(node);
var insight = {
"blockHash": "0000000000000afa0c3c0afd450c793a1e300ec84cbe9555166e06132f19a8f7"
};
var req = {};
var res = {
jsonp: function(data) {
should(data).eql(insight);
done();
}
};
var next = function() {};
var height = 533974;
blocks.blockIndex(req, res, next, height);
});
});
describe('#getBlockReward', function() {
var blocks = new BlockController({});
it('should give a block reward of 50 * 1e8 for block before first halvening', function() {
blocks.getBlockReward(100000).should.equal(50 * 1e8);
});
it('should give a block reward of 25 * 1e8 for block between first and second halvenings', function() {
blocks.getBlockReward(373011).should.equal(25 * 1e8);
});
it('should give a block reward of 12.5 * 1e8 for block between second and third halvenings', function() {
blocks.getBlockReward(500000).should.equal(12.5 * 1e8);
});
});
});