github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v3/store_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 storetypes "cosmossdk.io/store/types" 11 12 "github.com/cosmos/cosmos-sdk/runtime" 13 "github.com/cosmos/cosmos-sdk/testutil" 14 sdk "github.com/cosmos/cosmos-sdk/types" 15 moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" 16 "github.com/cosmos/cosmos-sdk/x/gov" 17 v1gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" 18 v3gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3" 19 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 20 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 21 ) 22 23 func TestMigrateStore(t *testing.T) { 24 cdc := moduletestutil.MakeTestEncodingConfig(gov.AppModuleBasic{}).Codec 25 govKey := storetypes.NewKVStoreKey("gov") 26 ctx := testutil.DefaultContext(govKey, storetypes.NewTransientStoreKey("transient_test")) 27 store := ctx.KVStore(govKey) 28 29 propTime := time.Unix(1e9, 0) 30 31 // Create 2 proposals 32 prop1, err := v1beta1.NewProposal(v1beta1.NewTextProposal("my title 1", "my desc 1"), 1, propTime, propTime) 33 require.NoError(t, err) 34 prop1Bz, err := cdc.Marshal(&prop1) 35 require.NoError(t, err) 36 prop2, err := v1beta1.NewProposal(v1beta1.NewTextProposal("my title 2", "my desc 2"), 2, propTime, propTime) 37 require.NoError(t, err) 38 require.NoError(t, err) 39 prop2Bz, err := cdc.Marshal(&prop2) 40 require.NoError(t, err) 41 42 store.Set(v1gov.ProposalKey(prop1.ProposalId), prop1Bz) 43 store.Set(v1gov.ProposalKey(prop2.ProposalId), prop2Bz) 44 45 // Vote on prop 1 46 options := []v1beta1.WeightedVoteOption{ 47 {Option: v1beta1.OptionNo, Weight: math.LegacyMustNewDecFromStr("0.3")}, 48 {Option: v1beta1.OptionYes, Weight: math.LegacyMustNewDecFromStr("0.7")}, 49 } 50 vote1 := v1beta1.NewVote(1, voter, options) 51 vote1Bz := cdc.MustMarshal(&vote1) 52 store.Set(v1gov.VoteKey(1, voter), vote1Bz) 53 54 // Run migrations. 55 storeService := runtime.NewKVStoreService(govKey) 56 err = v3gov.MigrateStore(ctx, storeService, cdc) 57 require.NoError(t, err) 58 59 var newProp1 v1.Proposal 60 err = cdc.Unmarshal(store.Get(v1gov.ProposalKey(prop1.ProposalId)), &newProp1) 61 require.NoError(t, err) 62 compareProps(t, prop1, newProp1) 63 64 var newProp2 v1.Proposal 65 err = cdc.Unmarshal(store.Get(v1gov.ProposalKey(prop2.ProposalId)), &newProp2) 66 require.NoError(t, err) 67 compareProps(t, prop2, newProp2) 68 69 var newVote1 v1.Vote 70 err = cdc.Unmarshal(store.Get(v1gov.VoteKey(prop1.ProposalId, voter)), &newVote1) 71 require.NoError(t, err) 72 // Without the votes migration, we would have 300000000000000000 in state, 73 // because of how sdk.Dec stores itself in state. 74 require.Equal(t, "0.300000000000000000", newVote1.Options[0].Weight) 75 require.Equal(t, "0.700000000000000000", newVote1.Options[1].Weight) 76 } 77 78 func compareProps(t *testing.T, oldProp v1beta1.Proposal, newProp v1.Proposal) { 79 require.Equal(t, oldProp.ProposalId, newProp.Id) 80 require.Equal(t, oldProp.TotalDeposit.String(), sdk.Coins(newProp.TotalDeposit).String()) 81 require.Equal(t, oldProp.Status.String(), newProp.Status.String()) 82 require.Equal(t, oldProp.FinalTallyResult.Yes.String(), newProp.FinalTallyResult.YesCount) 83 require.Equal(t, oldProp.FinalTallyResult.No.String(), newProp.FinalTallyResult.NoCount) 84 require.Equal(t, oldProp.FinalTallyResult.NoWithVeto.String(), newProp.FinalTallyResult.NoWithVetoCount) 85 require.Equal(t, oldProp.FinalTallyResult.Abstain.String(), newProp.FinalTallyResult.AbstainCount) 86 87 newContent := newProp.Messages[0].GetCachedValue().(*v1.MsgExecLegacyContent).Content.GetCachedValue().(v1beta1.Content) 88 require.Equal(t, oldProp.Content.GetCachedValue().(v1beta1.Content), newContent) 89 90 // Compare UNIX times, as a simple Equal gives difference between Local and 91 // UTC times. 92 // ref: https://github.com/golang/go/issues/19486#issuecomment-292968278 93 require.Equal(t, oldProp.SubmitTime.Unix(), newProp.SubmitTime.Unix()) 94 require.Equal(t, oldProp.DepositEndTime.Unix(), newProp.DepositEndTime.Unix()) 95 require.Equal(t, oldProp.VotingStartTime.Unix(), newProp.VotingStartTime.Unix()) 96 require.Equal(t, oldProp.VotingEndTime.Unix(), newProp.VotingEndTime.Unix()) 97 }