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 }