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

     1  package v2_test
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"cosmossdk.io/math"
    11  	storetypes "cosmossdk.io/store/types"
    12  
    13  	"github.com/cosmos/cosmos-sdk/runtime"
    14  	"github.com/cosmos/cosmos-sdk/testutil"
    15  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    16  	sdk "github.com/cosmos/cosmos-sdk/types"
    17  	"github.com/cosmos/cosmos-sdk/types/address"
    18  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    19  	v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1"
    20  	v2 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v2"
    21  	"github.com/cosmos/cosmos-sdk/x/gov/types"
    22  	"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
    23  )
    24  
    25  func TestMigrateStore(t *testing.T) {
    26  	cdc := moduletestutil.MakeTestEncodingConfig().Codec
    27  	govKey := storetypes.NewKVStoreKey("gov")
    28  	ctx := testutil.DefaultContext(govKey, storetypes.NewTransientStoreKey("transient_test"))
    29  	store := ctx.KVStore(govKey)
    30  
    31  	_, _, addr1 := testdata.KeyTestPubAddr()
    32  	proposalID := uint64(6)
    33  	now := time.Now()
    34  	// Use dummy value for keys where we don't test values.
    35  	dummyValue := []byte("foo")
    36  	// Use real values for votes, as we're testing weighted votes.
    37  	oldVote := v1beta1.Vote{ProposalId: 1, Voter: "foobar", Option: v1beta1.OptionNoWithVeto}
    38  	oldVoteValue := cdc.MustMarshal(&oldVote)
    39  	newVote := v1beta1.Vote{ProposalId: 1, Voter: "foobar", Options: v1beta1.WeightedVoteOptions{{Option: v1beta1.OptionNoWithVeto, Weight: math.LegacyNewDec(1)}}}
    40  	newVoteValue := cdc.MustMarshal(&newVote)
    41  
    42  	testCases := []struct {
    43  		name                               string
    44  		oldKey, oldValue, newKey, newValue []byte
    45  	}{
    46  		{
    47  			"ProposalKey",
    48  			v1.ProposalKey(proposalID), dummyValue,
    49  			append(types.ProposalsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), dummyValue,
    50  		},
    51  		{
    52  			"ActiveProposalQueue",
    53  			v1.ActiveProposalQueueKey(proposalID, now), dummyValue,
    54  			activeProposalQueueKey(proposalID, now), dummyValue,
    55  		},
    56  		{
    57  			"InactiveProposalQueue",
    58  			v1.InactiveProposalQueueKey(proposalID, now), dummyValue,
    59  			inactiveProposalQueueKey(proposalID, now), dummyValue,
    60  		},
    61  		{
    62  			"ProposalIDKey",
    63  			v1.ProposalIDKey, dummyValue,
    64  			types.ProposalIDKey, dummyValue,
    65  		},
    66  		{
    67  			"DepositKey",
    68  			v1.DepositKey(proposalID, addr1), dummyValue,
    69  			depositKey(proposalID, addr1), dummyValue,
    70  		},
    71  		{
    72  			"VotesKeyPrefix",
    73  			v1.VoteKey(proposalID, addr1), oldVoteValue,
    74  			voteKey(proposalID, addr1), newVoteValue,
    75  		},
    76  	}
    77  
    78  	// Set all the old keys to the store
    79  	for _, tc := range testCases {
    80  		store.Set(tc.oldKey, tc.oldValue)
    81  	}
    82  
    83  	// Run migratio
    84  	storeService := runtime.NewKVStoreService(govKey)
    85  	err := v2.MigrateStore(ctx, storeService, cdc)
    86  	require.NoError(t, err)
    87  
    88  	// Make sure the new keys are set and old keys are deleted.
    89  	for _, tc := range testCases {
    90  		tc := tc
    91  		t.Run(tc.name, func(t *testing.T) {
    92  			if !bytes.Equal(tc.oldKey, tc.newKey) {
    93  				require.Nil(t, store.Get(tc.oldKey))
    94  			}
    95  			require.Equal(t, tc.newValue, store.Get(tc.newKey))
    96  		})
    97  	}
    98  }
    99  
   100  // TODO(tip): remove all the functions below once we delete the migrations
   101  
   102  func depositKey(proposalID uint64, depositorAddr sdk.AccAddress) []byte {
   103  	return append(append(types.DepositsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), address.MustLengthPrefix(depositorAddr.Bytes())...)
   104  }
   105  
   106  func voteKey(proposalID uint64, addr sdk.AccAddress) []byte {
   107  	return append(append(types.VotesKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), address.MustLengthPrefix(addr.Bytes())...)
   108  }
   109  
   110  func activeProposalQueueKey(proposalID uint64, endTime time.Time) []byte {
   111  	return append(append(types.ActiveProposalQueuePrefix, sdk.FormatTimeBytes(endTime)...), sdk.Uint64ToBigEndian(proposalID)...)
   112  }
   113  
   114  // InactiveProposalQueueKey returns the key for a proposalID in the inactiveProposalQueue
   115  func inactiveProposalQueueKey(proposalID uint64, endTime time.Time) []byte {
   116  	return append(append(types.InactiveProposalQueuePrefix, sdk.FormatTimeBytes(endTime)...), sdk.Uint64ToBigEndian(proposalID)...)
   117  }