github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v4/store_test.go (about)

     1  package v4_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/require"
     8  
     9  	"cosmossdk.io/math"
    10  	storetypes "cosmossdk.io/store/types"
    11  
    12  	"github.com/cosmos/cosmos-sdk/runtime"
    13  	"github.com/cosmos/cosmos-sdk/testutil"
    14  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    15  	sdk "github.com/cosmos/cosmos-sdk/types"
    16  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    17  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
    18  	"github.com/cosmos/cosmos-sdk/x/bank"
    19  	banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
    20  	"github.com/cosmos/cosmos-sdk/x/gov"
    21  	v1gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1"
    22  	v4 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v4"
    23  	"github.com/cosmos/cosmos-sdk/x/gov/types"
    24  	v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
    25  	"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
    26  )
    27  
    28  var (
    29  	_, _, addr   = testdata.KeyTestPubAddr()
    30  	govAcct      = authtypes.NewModuleAddress(types.ModuleName)
    31  	TestProposal = getTestProposal()
    32  )
    33  
    34  type mockSubspace struct {
    35  	dp v1.DepositParams
    36  	vp v1.VotingParams
    37  	tp v1.TallyParams
    38  }
    39  
    40  func newMockSubspace(p v1.Params) mockSubspace {
    41  	return mockSubspace{
    42  		dp: v1.DepositParams{
    43  			MinDeposit:       p.MinDeposit,
    44  			MaxDepositPeriod: p.MaxDepositPeriod,
    45  		},
    46  		vp: v1.VotingParams{
    47  			VotingPeriod: p.VotingPeriod,
    48  		},
    49  		tp: v1.TallyParams{
    50  			Quorum:        p.Quorum,
    51  			Threshold:     p.Threshold,
    52  			VetoThreshold: p.VetoThreshold,
    53  		},
    54  	}
    55  }
    56  
    57  func (ms mockSubspace) Get(ctx sdk.Context, key []byte, ptr interface{}) {
    58  	switch string(key) {
    59  	case string(v1.ParamStoreKeyDepositParams):
    60  		*ptr.(*v1.DepositParams) = ms.dp
    61  	case string(v1.ParamStoreKeyVotingParams):
    62  		*ptr.(*v1.VotingParams) = ms.vp
    63  	case string(v1.ParamStoreKeyTallyParams):
    64  		*ptr.(*v1.TallyParams) = ms.tp
    65  	}
    66  }
    67  
    68  func TestMigrateStore(t *testing.T) {
    69  	cdc := moduletestutil.MakeTestEncodingConfig(gov.AppModuleBasic{}, bank.AppModuleBasic{}).Codec
    70  	govKey := storetypes.NewKVStoreKey("gov")
    71  	ctx := testutil.DefaultContext(govKey, storetypes.NewTransientStoreKey("transient_test"))
    72  	store := ctx.KVStore(govKey)
    73  
    74  	legacySubspace := newMockSubspace(v1.DefaultParams())
    75  
    76  	propTime := time.Unix(1e9, 0)
    77  
    78  	// Create 2 proposals
    79  	prop1Content, err := v1.NewLegacyContent(v1beta1.NewTextProposal("Test", "description"), authtypes.NewModuleAddress("gov").String())
    80  	require.NoError(t, err)
    81  	proposal1, err := v1.NewProposal([]sdk.Msg{prop1Content}, 1, propTime, propTime, "some metadata for the legacy content", "Test", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false)
    82  	require.NoError(t, err)
    83  	prop1Bz, err := cdc.Marshal(&proposal1)
    84  	require.NoError(t, err)
    85  	store.Set(v1gov.ProposalKey(proposal1.Id), prop1Bz)
    86  
    87  	proposal2, err := v1.NewProposal(getTestProposal(), 2, propTime, propTime, "some metadata for the legacy content", "Test", "description", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false)
    88  	proposal2.Status = v1.StatusVotingPeriod
    89  	require.NoError(t, err)
    90  	prop2Bz, err := cdc.Marshal(&proposal2)
    91  	require.NoError(t, err)
    92  	store.Set(v1gov.ProposalKey(proposal2.Id), prop2Bz)
    93  
    94  	// Run migrations.
    95  	storeService := runtime.NewKVStoreService(govKey)
    96  	err = v4.MigrateStore(ctx, storeService, legacySubspace, cdc)
    97  	require.NoError(t, err)
    98  
    99  	// Check params
   100  	var params v1.Params
   101  	bz := store.Get(v4.ParamsKey)
   102  	require.NoError(t, cdc.Unmarshal(bz, &params))
   103  	require.NotNil(t, params)
   104  	require.Equal(t, legacySubspace.dp.MinDeposit, params.MinDeposit)
   105  	require.Equal(t, legacySubspace.dp.MaxDepositPeriod, params.MaxDepositPeriod)
   106  	require.Equal(t, legacySubspace.vp.VotingPeriod, params.VotingPeriod)
   107  	require.Equal(t, legacySubspace.tp.Quorum, params.Quorum)
   108  	require.Equal(t, legacySubspace.tp.Threshold, params.Threshold)
   109  	require.Equal(t, legacySubspace.tp.VetoThreshold, params.VetoThreshold)
   110  	require.Equal(t, math.LegacyZeroDec().String(), params.MinInitialDepositRatio)
   111  
   112  	// Check proposals' status
   113  	var migratedProp1 v1.Proposal
   114  	bz = store.Get(v1gov.ProposalKey(proposal1.Id))
   115  	require.NoError(t, cdc.Unmarshal(bz, &migratedProp1))
   116  	require.Equal(t, v1.StatusDepositPeriod, migratedProp1.Status)
   117  
   118  	var migratedProp2 v1.Proposal
   119  	bz = store.Get(v1gov.ProposalKey(proposal2.Id))
   120  	require.NoError(t, cdc.Unmarshal(bz, &migratedProp2))
   121  	require.Equal(t, v1.StatusVotingPeriod, migratedProp2.Status)
   122  
   123  	// Check if proposal 2 is in the new store but not proposal 1
   124  	require.Nil(t, store.Get(v4.VotingPeriodProposalKey(proposal1.Id)))
   125  	require.Equal(t, []byte{0x1}, store.Get(v4.VotingPeriodProposalKey(proposal2.Id)))
   126  }
   127  
   128  func getTestProposal() []sdk.Msg {
   129  	legacyProposalMsg, err := v1.NewLegacyContent(v1beta1.NewTextProposal("Title", "description"), authtypes.NewModuleAddress(types.ModuleName).String())
   130  	if err != nil {
   131  		panic(err)
   132  	}
   133  
   134  	return []sdk.Msg{
   135  		banktypes.NewMsgSend(govAcct, addr, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000)))),
   136  		legacyProposalMsg,
   137  	}
   138  }