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  }