github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v3/convert_test.go (about) 1 package v3_test 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 "cosmossdk.io/math" 10 11 sdk "github.com/cosmos/cosmos-sdk/types" 12 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 13 "github.com/cosmos/cosmos-sdk/types/tx" 14 v3 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3" 15 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 16 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 17 ) 18 19 func TestConvertToLegacyProposal(t *testing.T) { 20 propTime := time.Unix(1e9, 0) 21 legacyContentMsg, err := v1.NewLegacyContent(v1beta1.NewTextProposal("title", "description"), "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh") 22 require.NoError(t, err) 23 msgs := []sdk.Msg{legacyContentMsg} 24 msgsAny, err := tx.SetMsgs(msgs) 25 require.NoError(t, err) 26 proposal := v1.Proposal{ 27 Id: 1, 28 Status: v1.StatusDepositPeriod, 29 Messages: msgsAny, 30 SubmitTime: &propTime, 31 DepositEndTime: &propTime, 32 VotingStartTime: &propTime, 33 VotingEndTime: &propTime, 34 Metadata: "proposal metadata", 35 } 36 37 testCases := map[string]struct { 38 tallyResult v1.TallyResult 39 expErr bool 40 }{ 41 "valid": { 42 tallyResult: v1.EmptyTallyResult(), 43 }, 44 "invalid final tally result": { 45 tallyResult: v1.TallyResult{}, 46 expErr: true, 47 }, 48 } 49 50 for name, tc := range testCases { 51 t.Run(name, func(t *testing.T) { 52 tc := tc 53 proposal.FinalTallyResult = &tc.tallyResult 54 v1beta1Proposal, err := v3.ConvertToLegacyProposal(proposal) 55 if tc.expErr { 56 require.Error(t, err) 57 } else { 58 require.NoError(t, err) 59 require.Equal(t, v1beta1Proposal.ProposalId, proposal.Id) 60 require.Equal(t, v1beta1Proposal.VotingStartTime, *proposal.VotingStartTime) 61 require.Equal(t, v1beta1Proposal.VotingEndTime, *proposal.VotingEndTime) 62 require.Equal(t, v1beta1Proposal.SubmitTime, *proposal.SubmitTime) 63 require.Equal(t, v1beta1Proposal.DepositEndTime, *proposal.DepositEndTime) 64 require.Equal(t, v1beta1Proposal.FinalTallyResult.Yes, math.NewInt(0)) 65 require.Equal(t, v1beta1Proposal.FinalTallyResult.No, math.NewInt(0)) 66 require.Equal(t, v1beta1Proposal.FinalTallyResult.NoWithVeto, math.NewInt(0)) 67 require.Equal(t, v1beta1Proposal.FinalTallyResult.Abstain, math.NewInt(0)) 68 tp, ok := v1beta1Proposal.Content.GetCachedValue().(*v1beta1.TextProposal) 69 require.Truef(t, ok, "expected *TextProposal, got %T", v1beta1Proposal.Content.GetCachedValue()) 70 require.Equal(t, tp.Title, "title") 71 require.Equal(t, tp.Description, "description") 72 } 73 }) 74 } 75 } 76 77 func TestConvertToLegacyProposalContent(t *testing.T) { 78 msg := v1.MsgCancelProposal{ProposalId: 1, Proposer: "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh"} 79 msgsAny, err := tx.SetMsgs([]sdk.Msg{&msg}) 80 require.NoError(t, err) 81 tallyResult := v1.EmptyTallyResult() 82 proposal := v1.Proposal{ 83 Id: 1, 84 Status: v1.StatusDepositPeriod, 85 Messages: msgsAny, 86 Metadata: "proposal metadata", 87 FinalTallyResult: &tallyResult, 88 } 89 90 legacyP, err := v3.ConvertToLegacyProposal(proposal) 91 require.NoError(t, err) 92 tp, ok := legacyP.Content.GetCachedValue().(*v1.MsgCancelProposal) 93 require.Truef(t, ok, "expected *MsgCancelProposal, got %T", legacyP.Content.GetCachedValue()) 94 require.Equal(t, &msg, tp) 95 96 // more than one message is not supported 97 proposal.Messages, err = tx.SetMsgs([]sdk.Msg{&msg, &msg}) 98 require.NoError(t, err) 99 _, err = v3.ConvertToLegacyProposal(proposal) 100 require.ErrorIs(t, sdkerrors.ErrInvalidType, err) 101 102 // zero messages is not supported 103 proposal.Messages = nil 104 _, err = v3.ConvertToLegacyProposal(proposal) 105 require.ErrorIs(t, sdkerrors.ErrInvalidType, err) 106 } 107 108 func TestConvertToLegacyTallyResult(t *testing.T) { 109 tallyResult := v1.EmptyTallyResult() 110 testCases := map[string]struct { 111 tallyResult v1.TallyResult 112 expErr bool 113 }{ 114 "valid": { 115 tallyResult: tallyResult, 116 }, 117 "invalid yes count": { 118 tallyResult: v1.TallyResult{ 119 YesCount: "invalid", 120 NoCount: tallyResult.NoCount, 121 AbstainCount: tallyResult.AbstainCount, 122 NoWithVetoCount: tallyResult.NoWithVetoCount, 123 }, 124 expErr: true, 125 }, 126 "invalid no count": { 127 tallyResult: v1.TallyResult{ 128 YesCount: tallyResult.YesCount, 129 NoCount: "invalid", 130 AbstainCount: tallyResult.AbstainCount, 131 NoWithVetoCount: tallyResult.NoWithVetoCount, 132 }, 133 expErr: true, 134 }, 135 "invalid abstain count": { 136 tallyResult: v1.TallyResult{ 137 YesCount: tallyResult.YesCount, 138 NoCount: tallyResult.NoCount, 139 AbstainCount: "invalid", 140 NoWithVetoCount: tallyResult.NoWithVetoCount, 141 }, 142 expErr: true, 143 }, 144 "invalid no with veto count": { 145 tallyResult: v1.TallyResult{ 146 YesCount: tallyResult.YesCount, 147 NoCount: tallyResult.NoCount, 148 AbstainCount: tallyResult.AbstainCount, 149 NoWithVetoCount: "invalid", 150 }, 151 expErr: true, 152 }, 153 } 154 for name, tc := range testCases { 155 t.Run(name, func(t *testing.T) { 156 _, err := v3.ConvertToLegacyTallyResult(&tc.tallyResult) 157 if tc.expErr { 158 require.Error(t, err) 159 } else { 160 require.NoError(t, err) 161 } 162 }) 163 } 164 } 165 166 func TestConvertToLegacyVote(t *testing.T) { 167 vote := v1.Vote{ 168 ProposalId: 1, 169 Voter: "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh", 170 Metadata: "vote metadata", 171 } 172 173 testCases := map[string]struct { 174 options []*v1.WeightedVoteOption 175 expErr bool 176 }{ 177 "valid": { 178 options: v1.NewNonSplitVoteOption(v1.OptionYes), 179 }, 180 "invalid options": { 181 options: []*v1.WeightedVoteOption{{Option: 1, Weight: "invalid"}}, 182 expErr: true, 183 }, 184 } 185 186 for name, tc := range testCases { 187 t.Run(name, func(t *testing.T) { 188 vote.Options = tc.options 189 v1beta1Vote, err := v3.ConvertToLegacyVote(vote) 190 if tc.expErr { 191 require.Error(t, err) 192 } else { 193 require.NoError(t, err) 194 require.Equal(t, v1beta1Vote.ProposalId, vote.ProposalId) 195 require.Equal(t, v1beta1Vote.Voter, vote.Voter) 196 require.Equal(t, v1beta1Vote.Options[0].Option, v1beta1.OptionYes) 197 require.Equal(t, v1beta1Vote.Options[0].Weight, math.LegacyNewDec(1)) 198 } 199 }) 200 } 201 } 202 203 func TestConvertToLegacyDeposit(t *testing.T) { 204 deposit := v1.Deposit{ 205 ProposalId: 1, 206 Depositor: "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh", 207 Amount: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1))), 208 } 209 210 v1beta1Deposit := v3.ConvertToLegacyDeposit(&deposit) 211 require.Equal(t, v1beta1Deposit.ProposalId, deposit.ProposalId) 212 require.Equal(t, v1beta1Deposit.Depositor, deposit.Depositor) 213 require.Equal(t, v1beta1Deposit.Amount[0], deposit.Amount[0]) 214 }