From 6e19ed47bed45f63e5e9981a7a4ee954fb3cadeb Mon Sep 17 00:00:00 2001 From: Matt Condon Date: Thu, 26 Jul 2018 23:17:16 +0800 Subject: [PATCH] fix: bounty tests, superceeds #799 (#1112) * fix: bounty tests, superceeds #799 * fix: updates from PR notes --- test/Bounty.test.js | 160 ++++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 88 deletions(-) diff --git a/test/Bounty.test.js b/test/Bounty.test.js index 35756caf1..8417e17d1 100644 --- a/test/Bounty.test.js +++ b/test/Bounty.test.js @@ -1,113 +1,97 @@ const { ethGetBalance, ethSendTransaction } = require('./helpers/web3'); +const expectEvent = require('./helpers/expectEvent'); +const { assertRevert } = require('./helpers/assertRevert'); -var SecureTargetBounty = artifacts.require('SecureTargetBounty'); -var InsecureTargetBounty = artifacts.require('InsecureTargetBounty'); +const SecureTargetBounty = artifacts.require('SecureTargetBounty'); +const InsecureTargetBounty = artifacts.require('InsecureTargetBounty'); + +require('chai') + .use(require('chai-bignumber')(web3.BigNumber)) + .should(); const sendReward = async (from, to, value) => ethSendTransaction({ - from, to, value, + from, + to, + value, }); -function awaitEvent (event, handler) { - return new Promise((resolve, reject) => { - function wrappedHandler (...args) { - Promise.resolve(handler(...args)).then(resolve).catch(reject); - } +const reward = new web3.BigNumber(web3.toWei(1, 'ether')); - event.watch(wrappedHandler); - }); -} +contract('Bounty', function ([_, owner, researcher]) { + context('against secure contract', function () { + beforeEach(async function () { + this.bounty = await SecureTargetBounty.new({ from: owner }); + }); -contract('Bounty', function (accounts) { - it('sets reward', async function () { - let owner = accounts[0]; - let reward = web3.toWei(1, 'ether'); - let bounty = await SecureTargetBounty.new(); - await sendReward(owner, bounty.address, reward); + it('can set reward', async function () { + await sendReward(owner, this.bounty.address, reward); - const balance = await ethGetBalance(bounty.address); - assert.equal(reward, balance.toNumber()); - }); + const balance = await ethGetBalance(this.bounty.address); + balance.should.be.bignumber.eq(reward); + }); - it('empties itself when destroyed', async function () { - let owner = accounts[0]; - let reward = web3.toWei(1, 'ether'); - let bounty = await SecureTargetBounty.new(); - await sendReward(owner, bounty.address, reward); + context('with reward', function () { + beforeEach(async function () { + const result = await this.bounty.createTarget({ from: researcher }); + const event = await expectEvent.inLogs(result.logs, 'TargetCreated'); - const balance = await ethGetBalance(bounty.address); - assert.equal(reward, balance.toNumber()); + this.targetAddress = event.args.createdAddress; - await bounty.destroy(); - const updatedBalance = await ethGetBalance(bounty.address); - assert.equal(0, updatedBalance.toNumber()); - }); + await sendReward(owner, this.bounty.address, reward); - describe('Against secure contract', function () { - it('cannot claim reward', async function () { - let owner = accounts[0]; - let researcher = accounts[1]; - let reward = web3.toWei(1, 'ether'); - let bounty = await SecureTargetBounty.new(); - let event = bounty.TargetCreated({}); + const balance = await ethGetBalance(this.bounty.address); + balance.should.be.bignumber.eq(reward); + }); - let watcher = async function (err, result) { - event.stopWatching(); - if (err) { throw err; } - - var targetAddress = result.args.createdAddress; - await sendReward(owner, bounty.address, reward); - - const balance = await ethGetBalance(bounty.address); - assert.equal(reward, balance.toNumber()); - - try { - await bounty.claim(targetAddress, { from: researcher }); - assert.isTrue(false); // should never reach here - } catch (error) { - let reClaimedBounty = await bounty.claimed.call(); - assert.isFalse(reClaimedBounty); - } - try { - await bounty.withdrawPayments({ from: researcher }); - assert.isTrue(false); // should never reach here - } catch (err) { - const updatedBalance = await ethGetBalance(bounty.address); - assert.equal(reward, updatedBalance.toNumber()); - } - }; - await bounty.createTarget({ from: researcher }); - await awaitEvent(event, watcher); + it('cannot claim reward', async function () { + await assertRevert( + this.bounty.claim(this.targetAddress, { from: researcher }), + ); + }); }); }); - describe('Against broken contract', function () { - it('claims reward', async function () { - let owner = accounts[0]; - let researcher = accounts[1]; - let reward = web3.toWei(1, 'ether'); - let bounty = await InsecureTargetBounty.new(); - let event = bounty.TargetCreated({}); + context('against broken contract', function () { + beforeEach(async function () { + this.bounty = await InsecureTargetBounty.new(); - let watcher = async function (err, result) { - event.stopWatching(); - if (err) { throw err; } - let targetAddress = result.args.createdAddress; - await sendReward(owner, bounty.address, reward); + const result = await this.bounty.createTarget({ from: researcher }); + const event = await expectEvent.inLogs(result.logs, 'TargetCreated'); - const balance = await ethGetBalance(bounty.address); - assert.equal(reward, balance.toNumber()); + this.targetAddress = event.args.createdAddress; + await sendReward(owner, this.bounty.address, reward); + }); - await bounty.claim(targetAddress, { from: researcher }); - let claim = await bounty.claimed.call(); + it('can claim reward', async function () { + await this.bounty.claim(this.targetAddress, { from: researcher }); + const claim = await this.bounty.claimed(); - assert.isTrue(claim); + claim.should.eq(true); - await bounty.withdrawPayments({ from: researcher }); - const updatedBalance = await ethGetBalance(bounty.address); - assert.equal(0, updatedBalance.toNumber()); - }; - await bounty.createTarget({ from: researcher }); - await awaitEvent(event, watcher); + const researcherPrevBalance = await ethGetBalance(researcher); + + const gas = await this.bounty.withdrawPayments.estimateGas({ from: researcher }); + const gasPrice = web3.toWei(1, 'gwei'); + const gasCost = (new web3.BigNumber(gas)).times(gasPrice); + + await this.bounty.withdrawPayments({ from: researcher, gasPrice: gasPrice }); + const updatedBalance = await ethGetBalance(this.bounty.address); + updatedBalance.should.be.bignumber.eq(0); + + const researcherCurrBalance = await ethGetBalance(researcher); + researcherCurrBalance.sub(researcherPrevBalance).should.be.bignumber.eq(reward.sub(gasCost)); + }); + + context('reward claimed', function () { + beforeEach(async function () { + await this.bounty.claim(this.targetAddress, { from: researcher }); + }); + + it('should no longer be payable', async function () { + await assertRevert( + sendReward(owner, this.bounty.address, reward) + ); + }); }); }); });