cosmos-sdk/x/gov/keeper_test.go

244 lines
9.3 KiB
Go
Raw Normal View History

2018-06-21 17:19:14 -07:00
package gov
import (
"testing"
"time"
2018-06-21 17:19:14 -07:00
"github.com/stretchr/testify/require"
2018-06-21 17:19:14 -07:00
abci "github.com/tendermint/tendermint/abci/types"
2018-06-21 17:19:14 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
)
func TestGetSetProposal(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, _, _, _ := getMockApp(t, 0, GenesisState{}, nil)
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
2018-06-21 17:19:14 -07:00
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
proposalID := proposal.GetProposalID()
keeper.SetProposal(ctx, proposal)
gotProposal := keeper.GetProposal(ctx, proposalID)
require.True(t, ProposalEqual(proposal, gotProposal))
2018-06-21 17:19:14 -07:00
}
func TestIncrementProposalNumber(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, _, _, _ := getMockApp(t, 0, GenesisState{}, nil)
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
2018-06-21 17:19:14 -07:00
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
proposal6 := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
require.Equal(t, uint64(6), proposal6.GetProposalID())
2018-06-21 17:19:14 -07:00
}
func TestActivateVotingPeriod(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, _, _, _ := getMockApp(t, 0, GenesisState{}, nil)
2018-06-21 17:19:14 -07:00
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
2018-06-21 17:19:14 -07:00
proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
require.True(t, proposal.GetVotingStartTime().Equal(time.Time{}))
2018-06-21 17:19:14 -07:00
keeper.activateVotingPeriod(ctx, proposal)
require.True(t, proposal.GetVotingStartTime().Equal(ctx.BlockHeader().Time))
activeIterator := keeper.ActiveProposalQueueIterator(ctx, proposal.GetVotingEndTime())
require.True(t, activeIterator.Valid())
var proposalID uint64
keeper.cdc.UnmarshalBinaryLengthPrefixed(activeIterator.Value(), &proposalID)
require.Equal(t, proposalID, proposal.GetProposalID())
activeIterator.Close()
2018-06-21 17:19:14 -07:00
}
func TestDeposits(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, addrs, _, _ := getMockApp(t, 2, GenesisState{}, nil)
2018-06-21 17:19:14 -07:00
SortAddresses(addrs)
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
2018-06-21 17:19:14 -07:00
proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
proposalID := proposal.GetProposalID()
2019-03-07 16:55:08 -08:00
fourSteak := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(4)))
fiveSteak := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromTendermintPower(5)))
2018-06-21 17:19:14 -07:00
addr0Initial := keeper.ck.GetCoins(ctx, addrs[0])
addr1Initial := keeper.ck.GetCoins(ctx, addrs[1])
expTokens := sdk.TokensFromTendermintPower(42)
2019-03-07 16:55:08 -08:00
require.Equal(t, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, expTokens)), addr0Initial)
require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.NewCoins()))
2018-06-21 17:19:14 -07:00
// Check no deposits at beginning
deposit, found := keeper.GetDeposit(ctx, proposalID, addrs[1])
require.False(t, found)
require.True(t, keeper.GetProposal(ctx, proposalID).GetVotingStartTime().Equal(time.Time{}))
2018-06-21 17:19:14 -07:00
// Check first deposit
err, votingStarted := keeper.AddDeposit(ctx, proposalID, addrs[0], fourSteak)
require.Nil(t, err)
require.False(t, votingStarted)
2018-06-21 17:19:14 -07:00
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, fourSteak, deposit.Amount)
require.Equal(t, addrs[0], deposit.Depositor)
require.Equal(t, fourSteak, keeper.GetProposal(ctx, proposalID).GetTotalDeposit())
require.Equal(t, addr0Initial.Sub(fourSteak), keeper.ck.GetCoins(ctx, addrs[0]))
2018-06-21 17:19:14 -07:00
// Check a second deposit from same address
err, votingStarted = keeper.AddDeposit(ctx, proposalID, addrs[0], fiveSteak)
require.Nil(t, err)
require.False(t, votingStarted)
2018-06-21 17:19:14 -07:00
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, fourSteak.Add(fiveSteak), deposit.Amount)
require.Equal(t, addrs[0], deposit.Depositor)
require.Equal(t, fourSteak.Add(fiveSteak), keeper.GetProposal(ctx, proposalID).GetTotalDeposit())
require.Equal(t, addr0Initial.Sub(fourSteak).Sub(fiveSteak), keeper.ck.GetCoins(ctx, addrs[0]))
2018-06-21 17:19:14 -07:00
// Check third deposit from a new address
err, votingStarted = keeper.AddDeposit(ctx, proposalID, addrs[1], fourSteak)
require.Nil(t, err)
require.True(t, votingStarted)
2018-06-21 17:19:14 -07:00
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[1])
require.True(t, found)
require.Equal(t, addrs[1], deposit.Depositor)
require.Equal(t, fourSteak, deposit.Amount)
require.Equal(t, fourSteak.Add(fiveSteak).Add(fourSteak), keeper.GetProposal(ctx, proposalID).GetTotalDeposit())
require.Equal(t, addr1Initial.Sub(fourSteak), keeper.ck.GetCoins(ctx, addrs[1]))
2018-06-21 17:19:14 -07:00
// Check that proposal moved to voting period
require.True(t, keeper.GetProposal(ctx, proposalID).GetVotingStartTime().Equal(ctx.BlockHeader().Time))
2018-06-21 17:19:14 -07:00
// Test deposit iterator
depositsIterator := keeper.GetDeposits(ctx, proposalID)
require.True(t, depositsIterator.Valid())
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit)
require.Equal(t, addrs[0], deposit.Depositor)
require.Equal(t, fourSteak.Add(fiveSteak), deposit.Amount)
2018-06-21 17:19:14 -07:00
depositsIterator.Next()
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(depositsIterator.Value(), &deposit)
require.Equal(t, addrs[1], deposit.Depositor)
require.Equal(t, fourSteak, deposit.Amount)
2018-06-21 17:19:14 -07:00
depositsIterator.Next()
require.False(t, depositsIterator.Valid())
depositsIterator.Close()
2018-06-21 17:19:14 -07:00
// Test Refund Deposits
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[1])
require.True(t, found)
require.Equal(t, fourSteak, deposit.Amount)
2018-06-21 17:19:14 -07:00
keeper.RefundDeposits(ctx, proposalID)
deposit, found = keeper.GetDeposit(ctx, proposalID, addrs[1])
require.False(t, found)
require.Equal(t, addr0Initial, keeper.ck.GetCoins(ctx, addrs[0]))
require.Equal(t, addr1Initial, keeper.ck.GetCoins(ctx, addrs[1]))
2018-06-21 17:19:14 -07:00
}
func TestVotes(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, addrs, _, _ := getMockApp(t, 2, GenesisState{}, nil)
2018-06-21 17:19:14 -07:00
SortAddresses(addrs)
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
2018-06-21 17:19:14 -07:00
proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
proposalID := proposal.GetProposalID()
proposal.SetStatus(StatusVotingPeriod)
keeper.SetProposal(ctx, proposal)
// Test first vote
keeper.AddVote(ctx, proposalID, addrs[0], OptionAbstain)
vote, found := keeper.GetVote(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, addrs[0], vote.Voter)
require.Equal(t, proposalID, vote.ProposalID)
require.Equal(t, OptionAbstain, vote.Option)
2018-06-21 17:19:14 -07:00
// Test change of vote
keeper.AddVote(ctx, proposalID, addrs[0], OptionYes)
vote, found = keeper.GetVote(ctx, proposalID, addrs[0])
require.True(t, found)
require.Equal(t, addrs[0], vote.Voter)
require.Equal(t, proposalID, vote.ProposalID)
require.Equal(t, OptionYes, vote.Option)
2018-06-21 17:19:14 -07:00
// Test second vote
keeper.AddVote(ctx, proposalID, addrs[1], OptionNoWithVeto)
vote, found = keeper.GetVote(ctx, proposalID, addrs[1])
require.True(t, found)
require.Equal(t, addrs[1], vote.Voter)
require.Equal(t, proposalID, vote.ProposalID)
require.Equal(t, OptionNoWithVeto, vote.Option)
2018-06-21 17:19:14 -07:00
// Test vote iterator
votesIterator := keeper.GetVotes(ctx, proposalID)
require.True(t, votesIterator.Valid())
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote)
require.True(t, votesIterator.Valid())
require.Equal(t, addrs[0], vote.Voter)
require.Equal(t, proposalID, vote.ProposalID)
require.Equal(t, OptionYes, vote.Option)
2018-06-21 17:19:14 -07:00
votesIterator.Next()
require.True(t, votesIterator.Valid())
keeper.cdc.MustUnmarshalBinaryLengthPrefixed(votesIterator.Value(), &vote)
require.True(t, votesIterator.Valid())
require.Equal(t, addrs[1], vote.Voter)
require.Equal(t, proposalID, vote.ProposalID)
require.Equal(t, OptionNoWithVeto, vote.Option)
2018-06-21 17:19:14 -07:00
votesIterator.Next()
require.False(t, votesIterator.Valid())
votesIterator.Close()
2018-06-21 17:19:14 -07:00
}
func TestProposalQueues(t *testing.T) {
2019-01-07 14:24:04 -08:00
mapp, keeper, _, _, _, _ := getMockApp(t, 0, GenesisState{}, nil)
header := abci.Header{Height: mapp.LastBlockHeight() + 1}
mapp.BeginBlock(abci.RequestBeginBlock{Header: header})
2018-06-21 17:19:14 -07:00
ctx := mapp.BaseApp.NewContext(false, abci.Header{})
mapp.InitChainer(ctx, abci.RequestInitChain{})
// create test proposals
proposal := keeper.NewTextProposal(ctx, "Test", "description", ProposalTypeText)
inactiveIterator := keeper.InactiveProposalQueueIterator(ctx, proposal.GetDepositEndTime())
require.True(t, inactiveIterator.Valid())
var proposalID uint64
keeper.cdc.UnmarshalBinaryLengthPrefixed(inactiveIterator.Value(), &proposalID)
require.Equal(t, proposalID, proposal.GetProposalID())
inactiveIterator.Close()
keeper.activateVotingPeriod(ctx, proposal)
activeIterator := keeper.ActiveProposalQueueIterator(ctx, proposal.GetVotingEndTime())
require.True(t, activeIterator.Valid())
keeper.cdc.UnmarshalBinaryLengthPrefixed(activeIterator.Value(), &proposalID)
require.Equal(t, proposalID, proposal.GetProposalID())
activeIterator.Close()
2018-06-21 17:19:14 -07:00
}