github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/keeper/vote_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  
     8  	"cosmossdk.io/collections"
     9  	sdkmath "cosmossdk.io/math"
    10  
    11  	"github.com/cosmos/cosmos-sdk/codec/address"
    12  	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
    13  	sdk "github.com/cosmos/cosmos-sdk/types"
    14  	v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
    15  )
    16  
    17  func TestVotes(t *testing.T) {
    18  	govKeeper, authKeeper, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t)
    19  	addrs := simtestutil.AddTestAddrsIncremental(bankKeeper, stakingKeeper, ctx, 2, sdkmath.NewInt(10000000))
    20  	authKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
    21  
    22  	tp := TestProposal
    23  	proposal, err := govKeeper.SubmitProposal(ctx, tp, "", "title", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false)
    24  	require.NoError(t, err)
    25  	proposalID := proposal.Id
    26  	metadata := "metadata"
    27  
    28  	var invalidOption v1.VoteOption = 0x10
    29  
    30  	require.Error(t, govKeeper.AddVote(ctx, proposalID, addrs[0], v1.NewNonSplitVoteOption(v1.OptionYes), metadata), "proposal not on voting period")
    31  	require.Error(t, govKeeper.AddVote(ctx, 10, addrs[0], v1.NewNonSplitVoteOption(v1.OptionYes), ""), "invalid proposal ID")
    32  
    33  	proposal.Status = v1.StatusVotingPeriod
    34  	govKeeper.SetProposal(ctx, proposal)
    35  
    36  	require.Error(t, govKeeper.AddVote(ctx, proposalID, addrs[0], v1.NewNonSplitVoteOption(invalidOption), ""), "invalid option")
    37  
    38  	// Test first vote
    39  	require.NoError(t, govKeeper.AddVote(ctx, proposalID, addrs[0], v1.NewNonSplitVoteOption(v1.OptionAbstain), metadata))
    40  	vote, err := govKeeper.Votes.Get(ctx, collections.Join(proposalID, addrs[0]))
    41  	require.Nil(t, err)
    42  	require.Equal(t, addrs[0].String(), vote.Voter)
    43  	require.Equal(t, proposalID, vote.ProposalId)
    44  	require.True(t, len(vote.Options) == 1)
    45  	require.Equal(t, v1.OptionAbstain, vote.Options[0].Option)
    46  
    47  	// Test change of vote
    48  	require.NoError(t, govKeeper.AddVote(ctx, proposalID, addrs[0], v1.NewNonSplitVoteOption(v1.OptionYes), ""))
    49  	vote, err = govKeeper.Votes.Get(ctx, collections.Join(proposalID, addrs[0]))
    50  	require.Nil(t, err)
    51  	require.Equal(t, addrs[0].String(), vote.Voter)
    52  	require.Equal(t, proposalID, vote.ProposalId)
    53  	require.True(t, len(vote.Options) == 1)
    54  	require.Equal(t, v1.OptionYes, vote.Options[0].Option)
    55  
    56  	// Test second vote
    57  	require.NoError(t, govKeeper.AddVote(ctx, proposalID, addrs[1], v1.WeightedVoteOptions{
    58  		v1.NewWeightedVoteOption(v1.OptionYes, sdkmath.LegacyNewDecWithPrec(60, 2)),
    59  		v1.NewWeightedVoteOption(v1.OptionNo, sdkmath.LegacyNewDecWithPrec(30, 2)),
    60  		v1.NewWeightedVoteOption(v1.OptionAbstain, sdkmath.LegacyNewDecWithPrec(5, 2)),
    61  		v1.NewWeightedVoteOption(v1.OptionNoWithVeto, sdkmath.LegacyNewDecWithPrec(5, 2)),
    62  	}, ""))
    63  	vote, err = govKeeper.Votes.Get(ctx, collections.Join(proposalID, addrs[1]))
    64  	require.Nil(t, err)
    65  	require.Equal(t, addrs[1].String(), vote.Voter)
    66  	require.Equal(t, proposalID, vote.ProposalId)
    67  	require.True(t, len(vote.Options) == 4)
    68  	require.Equal(t, v1.OptionYes, vote.Options[0].Option)
    69  	require.Equal(t, v1.OptionNo, vote.Options[1].Option)
    70  	require.Equal(t, v1.OptionAbstain, vote.Options[2].Option)
    71  	require.Equal(t, v1.OptionNoWithVeto, vote.Options[3].Option)
    72  	require.Equal(t, vote.Options[0].Weight, sdkmath.LegacyNewDecWithPrec(60, 2).String())
    73  	require.Equal(t, vote.Options[1].Weight, sdkmath.LegacyNewDecWithPrec(30, 2).String())
    74  	require.Equal(t, vote.Options[2].Weight, sdkmath.LegacyNewDecWithPrec(5, 2).String())
    75  	require.Equal(t, vote.Options[3].Weight, sdkmath.LegacyNewDecWithPrec(5, 2).String())
    76  
    77  	// Test vote iterator
    78  	// NOTE order of deposits is determined by the addresses
    79  	var votes v1.Votes
    80  	require.NoError(t, govKeeper.Votes.Walk(ctx, nil, func(_ collections.Pair[uint64, sdk.AccAddress], value v1.Vote) (stop bool, err error) {
    81  		votes = append(votes, &value)
    82  		return false, nil
    83  	}))
    84  	require.Len(t, votes, 2)
    85  	var propVotes v1.Votes
    86  	require.NoError(t, govKeeper.Votes.Walk(ctx, collections.NewPrefixedPairRange[uint64, sdk.AccAddress](proposalID), func(_ collections.Pair[uint64, sdk.AccAddress], value v1.Vote) (stop bool, err error) {
    87  		propVotes = append(propVotes, &value)
    88  		return false, nil
    89  	}))
    90  	require.Equal(t, votes, propVotes)
    91  	require.Equal(t, addrs[0].String(), votes[0].Voter)
    92  	require.Equal(t, proposalID, votes[0].ProposalId)
    93  	require.True(t, len(votes[0].Options) == 1)
    94  	require.Equal(t, v1.OptionYes, votes[0].Options[0].Option)
    95  	require.Equal(t, addrs[1].String(), votes[1].Voter)
    96  	require.Equal(t, proposalID, votes[1].ProposalId)
    97  	require.True(t, len(votes[1].Options) == 4)
    98  	require.Equal(t, votes[1].Options[0].Weight, sdkmath.LegacyNewDecWithPrec(60, 2).String())
    99  	require.Equal(t, votes[1].Options[1].Weight, sdkmath.LegacyNewDecWithPrec(30, 2).String())
   100  	require.Equal(t, votes[1].Options[2].Weight, sdkmath.LegacyNewDecWithPrec(5, 2).String())
   101  	require.Equal(t, votes[1].Options[3].Weight, sdkmath.LegacyNewDecWithPrec(5, 2).String())
   102  
   103  	// non existent vote
   104  	_, err = govKeeper.Votes.Get(ctx, collections.Join(proposalID+100, addrs[1]))
   105  	require.ErrorIs(t, err, collections.ErrNotFound)
   106  }