test.js
1 const async = require('async'); 2 const http = require('http'); 3 const net = require('net'); 4 5 const Web3 = require('web3'); 6 7 const startRPCMockServer = (options = {}, callback) => { 8 const opts = Object.assign({}, { 9 successful: true 10 }, options); 11 12 let port = 0; 13 let sock = net.createServer(); 14 let state = { visited: false }; 15 let server = http.createServer({}, (req, res) => { 16 state.visited = true; 17 if(!opts.successful) { 18 res.statusCode = 500; 19 return res.end(); 20 } 21 22 let body = ''; 23 req.on('data', chunk => { 24 body += chunk.toString(); 25 }); 26 req.on('end', () => { 27 const request = JSON.parse(body); 28 const accountsResponse = JSON.stringify({ 29 "jsonrpc": "2.0", 30 "id": request.id, 31 "result": [ 32 "0x7c67d951b7338a96168f259a16b7ba25e7a30315" 33 ] 34 }); 35 36 res.writeHead(200, { 37 'Content-Length': Buffer.byteLength(accountsResponse), 38 'Content-Type': 'application/json' 39 }) 40 res.end(accountsResponse); 41 }); 42 }); 43 44 async.waterfall([ 45 cb => { sock.listen(0, cb) }, 46 cb => { port = sock.address().port; cb() }, 47 cb => { sock.close(cb) }, 48 cb => { server.listen(port, '127.0.0.1', () => cb()); } 49 ], () => { 50 state.server = server; 51 state.connectionString = `http://localhost:${port}`; 52 callback(null, state); 53 }); 54 } 55 56 const TestProvider = {}; 57 58 TestProvider.init = function(_config) { 59 this.web3 = global.web3 || new Web3(); 60 global.web3 = global.web3 || this.web3; 61 }; 62 63 TestProvider.getInstance = function () { 64 return this.web3; 65 }; 66 67 TestProvider.getAccounts = function () { 68 return this.web3.eth.getAccounts(...arguments); 69 }; 70 71 TestProvider.getNewProvider = function (providerName, ...args) { 72 return new Web3.providers[providerName](...args); 73 }; 74 75 TestProvider.setProvider = function (provider) { 76 return this.web3.setProvider(provider); 77 }; 78 79 TestProvider.getCurrentProvider = function () { 80 return this.web3.currentProvider; 81 }; 82 83 TestProvider.getDefaultAccount = function () { 84 return this.web3.eth.defaultAccount; 85 }; 86 87 TestProvider.setDefaultAccount = function (account) { 88 this.web3.eth.defaultAccount = account; 89 }; 90 91 TestProvider.newContract = function (options) { 92 return new this.web3.eth.Contract(options.abi, options.address); 93 }; 94 95 TestProvider.send = function () { 96 return this.web3.eth.sendTransaction(...arguments); 97 }; 98 99 TestProvider.toWei = function () { 100 return this.web3.toWei(...arguments); 101 }; 102 103 TestProvider.getNetworkId = function () { 104 return this.web3.eth.net.getId(); 105 }; 106 107 module.exports = { 108 TestProvider, 109 110 startRPCMockServer 111 }