Added test cases and fixed bugs on MessageTribute contract

This commit is contained in:
Richard Ramos 2018-03-20 14:04:24 -04:00
parent 84a40a910b
commit 752d025097
2 changed files with 124 additions and 31 deletions

View File

@ -30,6 +30,7 @@ contract MessageTribute {
struct Audience {
uint256 blockNum;
uint256 timestamp;
Fee fee;
}
@ -96,9 +97,9 @@ contract MessageTribute {
require(SNT.transfer(msg.sender, _value));
}
event AudienceRequested(address from, address to);
event AudienceCancelled(address from, address to);
event AudienceGranted(address from, address to, bool approve);
event AudienceRequested(address indexed from, address indexed to);
event AudienceCancelled(address indexed from, address indexed to);
event AudienceGranted(address indexed from, address indexed to, bool approve);
function requestAudience(address _from)
public
@ -108,7 +109,8 @@ contract MessageTribute {
require(audienceRequested[_from][msg.sender].blockNum == 0);
AudienceRequested(_from, msg.sender);
audienceRequested[_from][msg.sender] = Audience(block.number, f);
audienceRequested[_from][msg.sender] = Audience(block.number, now, f);
balances[msg.sender] -= f.amount;
}
@ -117,16 +119,16 @@ contract MessageTribute {
}
function cancelAudienceRequest(address _from) public {
if (audienceRequested[_from][msg.sender].blockNum > 0) {
AudienceCancelled(_from, msg.sender);
balances[msg.sender] += audienceRequested[_from][msg.sender].fee.amount;
delete audienceRequested[_from][msg.sender];
}
require(audienceRequested[_from][msg.sender].blockNum > 0);
require(audienceRequested[_from][msg.sender].timestamp + 2 hours <= now);
AudienceCancelled(_from, msg.sender);
balances[msg.sender] += audienceRequested[_from][msg.sender].fee.amount;
delete audienceRequested[_from][msg.sender];
}
function grantAudience(address _to, bool _approve, bool refund) public {
function grantAudience(address _to, bool _approve) public {
Audience memory aud = audienceRequested[msg.sender][_to];
Audience storage aud = audienceRequested[msg.sender][_to];
require(aud.blockNum > 0);
@ -140,7 +142,7 @@ contract MessageTribute {
if (isTribute) {
if (_approve) {
require(SNT.transferFrom(this, msg.sender, amount));
require(SNT.transfer(msg.sender, amount));
} else {
balances[_to] += amount;
}

View File

@ -130,6 +130,11 @@ describe('MessageTribute', function() {
it("Should be able to withdraw", async() => {
let amount = 2000;
assert.equal(
await SNT.methods.balanceOf(MessageTribute.address).call(),
amount,
"Contract SNT balance is incorrect");
let initialBalance = await SNT.methods.balanceOf(accounts[1]).call();
await MessageTribute.methods.withdraw(amount).send({from: accounts[1]});
@ -260,7 +265,7 @@ describe('MessageTribute', function() {
"Deposited balance must be 200");
let tx = await MessageTribute.methods.requestAudience(accounts[0]).send({from: accounts[7]});
assert.notEqual(tx.events.AudienceRequested, undefined, "AudienceRequested wasn't triggered");
assert.equal(
@ -276,19 +281,21 @@ describe('MessageTribute', function() {
true,
"Must have a pending audience");
let tx = await MessageTribute.methods.cancelAudienceRequest(accounts[0]).send({from: accounts[8]});
// TODO update EVM time and mine one block to test this
// This commented code works. Needs the previous TODO to uncomment it
/*let tx = await MessageTribute.methods.cancelAudienceRequest(accounts[0]).send({from: accounts[8]});
assert.notEqual(tx.events.AudienceCancelled, undefined, "AudienceCancelled wasn't triggered");
assert.equal(
await MessageTribute.methods.hasPendingAudience(accounts[0]).call({from: accounts[8]}),
false,
"Must not have a pending audience");
"Must not have a pending audience");*/
});
it("Cancelling an audience without having one", async() => {
assert.equal(
await MessageTribute.methods.hasPendingAudience(accounts[0]).call({from: accounts[6]}),
false,
@ -302,25 +309,86 @@ describe('MessageTribute', function() {
}
});
it("Missing tests", async () => {
// Granting Audience - account7
it("Granting an audience that requires a permanent tribute", async() => {
let initial7balance = (await SNT.methods.balanceOf(accounts[7]).call()).toString();
let initial0balance = (await SNT.methods.balanceOf(accounts[0]).call()).toString();
let initialCBalance = (await SNT.methods.balanceOf(MessageTribute.address).call()).toString();
let initial7DepBalance = (await MessageTribute.methods.balance().call({from: accounts[7]})).toString();
let amount = (await MessageTribute.methods.getRequiredFee(accounts[0]).call({from: accounts[7]})).fee.toString();
assert.equal(
await MessageTribute.methods.hasPendingAudience(accounts[0]).call({from: accounts[7]}),
true,
"Must have a pending audience");
// Deniying Audience
let tx = await MessageTribute.methods.grantAudience(accounts[7], true).send({from: accounts[0]});
/*
// Requiring 200 tribute from account6 non permanent
await MessageTribute.methods.setRequiredTribute(accounts[4], 200, true, false).send({from: accounts[0]});
assert.notEqual(tx.events.AudienceGranted, undefined, "AudienceGranted wasn't triggered");
// Requiring 100 deposit from everyone
await MessageTribute.methods.setRequiredTribute("0x0", 100, false, true).send({from: accounts[0]});
// Requiring 100 tribute from everyone
await MessageTribute.methods.setRequiredTribute("0x0", 100, true, true).send({from: accounts[1]});
*/
});
assert.equal(
await SNT.methods.balanceOf(accounts[7]).call(),
initial7balance,
accounts[7] + " SNT Balance must be " + initial7balance);
assert.equal(
await SNT.methods.balanceOf(accounts[0]).call(),
web3.utils.toBN(initial0balance).add(web3.utils.toBN(amount)).toString(),
accounts[0] + "SNT Balance must be " + initial0balance);
assert.equal(
await SNT.methods.balanceOf(MessageTribute.address).call(),
web3.utils.toBN(initialCBalance).sub(web3.utils.toBN(amount)).toString(),
accounts[0] + "SNT Balance must be " + web3.utils.toBN(initialCBalance).sub(web3.utils.toBN(amount)).toString());
assert.equal(
await MessageTribute.methods.balance().call({from: accounts[7]}),
initial7DepBalance,
accounts[0] + "SNT deposit balance must be 0");
assert.equal(
await MessageTribute.methods.hasPendingAudience(accounts[0]).call({from: accounts[7]}),
false,
"Must not have a pending audience");
});
it("Denying an audience", async() => {
let amount = (await MessageTribute.methods.getRequiredFee(accounts[0]).call({from: accounts[7]})).fee.toString();
let initial7DepBalance = (await MessageTribute.methods.balance().call({from: accounts[7]})).toString();
let tx = await MessageTribute.methods.requestAudience(accounts[0]).send({from: accounts[7]});
let afterReq7DepBalance = (await MessageTribute.methods.balance().call({from: accounts[7]})).toString();
assert.equal(
afterReq7DepBalance,
web3.utils.toBN(initial7DepBalance).sub(web3.utils.toBN(amount)).toString(),
accounts[7] + "SNT deposit balance error");
assert.notEqual(tx.events.AudienceRequested, undefined, "AudienceRequested wasn't triggered");
let tx2 = await MessageTribute.methods.grantAudience(accounts[7], false).send({from: accounts[0]});
assert.notEqual(tx2.events.AudienceGranted, undefined, "AudienceGranted wasn't triggered");
let afterDeny7DepBalance = (await MessageTribute.methods.balance().call({from: accounts[7]})).toString();
assert.equal(
initial7DepBalance,
afterDeny7DepBalance,
accounts[7] + "SNT deposit balance error");
assert.equal(
await MessageTribute.methods.hasPendingAudience(accounts[0]).call({from: accounts[7]}),
false,
"Must not have a pending audience");
});
it("Requesting a non permanent tribute from specific account", async() => {
await MessageTribute.methods.setRequiredTribute(accounts[6], 100, true, false).send({from: accounts[0]});
let amount1 = (await MessageTribute.methods.getRequiredFee(accounts[0]).call({from: accounts[6]})).fee.toString();
await SNT.methods.approve(MessageTribute.address, 200).send({from: accounts[6]});
await MessageTribute.methods.deposit(200).send({from: accounts[6]});
@ -334,11 +402,34 @@ describe('MessageTribute', function() {
100,
"Deposited balance must be 100");
// TODO grant audience
let tx2 = await MessageTribute.methods.grantAudience(accounts[6], false).send({from: accounts[0]});
assert.notEqual(tx2.events.AudienceGranted, undefined, "AudienceGranted wasn't triggered");
let amount = (await MessageTribute.methods.getRequiredFee(accounts[0]).call({from: accounts[6]})).fee.toString();
// TODO request another audience
assert.equal(
amount,
0,
"Amount should be 0");
});
it("Other tests", async () => {
/*
TODO
// Granting an audience that requires 200 tribute non permanent
await MessageTribute.methods.setRequiredTribute(accounts[4], 200, true, false).send({from: accounts[0]});
// Requiring 100 deposit from everyone
await MessageTribute.methods.setRequiredTribute("0x0", 100, false, true).send({from: accounts[0]});
// Requiring 100 tribute from everyone
await MessageTribute.methods.setRequiredTribute("0x0", 100, true, true).send({from: accounts[1]});
*/
});
});