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

     1  package v2_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  
     8  	storetypes "cosmossdk.io/store/types"
     9  
    10  	"github.com/cosmos/cosmos-sdk/codec"
    11  	addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
    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/auth"
    17  	authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
    18  	authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
    19  	"github.com/cosmos/cosmos-sdk/x/group"
    20  	"github.com/cosmos/cosmos-sdk/x/group/internal/orm"
    21  	groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper"
    22  	v2 "github.com/cosmos/cosmos-sdk/x/group/migrations/v2"
    23  	groupmodule "github.com/cosmos/cosmos-sdk/x/group/module"
    24  )
    25  
    26  var (
    27  	policies      = []sdk.AccAddress{policyAddr1, policyAddr2, policyAddr3}
    28  	policyAddr1   = sdk.MustAccAddressFromBech32("cosmos1q32tjg5qm3n9fj8wjgpd7gl98prefntrckjkyvh8tntp7q33zj0s5tkjrk")
    29  	policyAddr2   = sdk.MustAccAddressFromBech32("cosmos1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfwkgpd")
    30  	policyAddr3   = sdk.MustAccAddressFromBech32("cosmos1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvsmn3jeu")
    31  	authorityAddr = sdk.AccAddress("authority")
    32  )
    33  
    34  func TestMigrate(t *testing.T) {
    35  	cdc := moduletestutil.MakeTestEncodingConfig(auth.AppModuleBasic{}, groupmodule.AppModuleBasic{}).Codec
    36  	storeKey := storetypes.NewKVStoreKey(v2.ModuleName)
    37  	tKey := storetypes.NewTransientStoreKey("transient_test")
    38  	ctx := testutil.DefaultContext(storeKey, tKey)
    39  
    40  	oldAccs, accountKeeper := createOldPolicyAccount(ctx, storeKey, cdc, policies)
    41  	groupPolicyTable, groupPolicySeq, err := createGroupPolicies(ctx, storeKey, cdc, policies)
    42  	require.NoError(t, err)
    43  
    44  	require.NoError(t, v2.Migrate(ctx, storeKey, accountKeeper, groupPolicySeq, groupPolicyTable))
    45  	for i, policyAddr := range policies {
    46  		oldAcc := oldAccs[i]
    47  		newAcc := accountKeeper.GetAccount(ctx, policyAddr)
    48  		require.NotEqual(t, oldAcc, newAcc)
    49  		require.True(t, func() bool { _, ok := newAcc.(*authtypes.BaseAccount); return ok }())
    50  		require.Equal(t, oldAcc.GetAddress(), newAcc.GetAddress())
    51  		require.Equal(t, int(oldAcc.GetAccountNumber()), int(newAcc.GetAccountNumber()))
    52  		require.Equal(t, newAcc.GetPubKey().Address().Bytes(), newAcc.GetAddress().Bytes())
    53  	}
    54  }
    55  
    56  func createGroupPolicies(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec, policies []sdk.AccAddress) (orm.PrimaryKeyTable, orm.Sequence, error) {
    57  	groupPolicyTable, err := orm.NewPrimaryKeyTable([2]byte{groupkeeper.GroupPolicyTablePrefix}, &group.GroupPolicyInfo{}, cdc)
    58  	if err != nil {
    59  		panic(err.Error())
    60  	}
    61  
    62  	groupPolicySeq := orm.NewSequence(v2.GroupPolicyTableSeqPrefix)
    63  
    64  	for _, policyAddr := range policies {
    65  		groupPolicyInfo, err := group.NewGroupPolicyInfo(policyAddr, 1, authorityAddr, "", 1, group.NewPercentageDecisionPolicy("1", 1, 1), ctx.BlockTime())
    66  		if err != nil {
    67  			return orm.PrimaryKeyTable{}, orm.Sequence{}, err
    68  		}
    69  
    70  		if err := groupPolicyTable.Create(ctx.KVStore(storeKey), &groupPolicyInfo); err != nil {
    71  			return orm.PrimaryKeyTable{}, orm.Sequence{}, err
    72  		}
    73  
    74  		groupPolicySeq.NextVal(ctx.KVStore(storeKey))
    75  	}
    76  
    77  	return *groupPolicyTable, groupPolicySeq, nil
    78  }
    79  
    80  // createOldPolicyAccount re-creates the group policy account using a module account
    81  func createOldPolicyAccount(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.Codec, policies []sdk.AccAddress) ([]*authtypes.ModuleAccount, group.AccountKeeper) {
    82  	accountKeeper := authkeeper.NewAccountKeeper(cdc, runtime.NewKVStoreService(storeKey.(*storetypes.KVStoreKey)), authtypes.ProtoBaseAccount, nil, addresscodec.NewBech32Codec(sdk.Bech32MainPrefix), sdk.Bech32MainPrefix, authorityAddr.String())
    83  
    84  	oldPolicyAccounts := make([]*authtypes.ModuleAccount, len(policies))
    85  	for i, policyAddr := range policies {
    86  		acc := accountKeeper.NewAccount(ctx, &authtypes.ModuleAccount{
    87  			BaseAccount: &authtypes.BaseAccount{
    88  				Address: policyAddr.String(),
    89  			},
    90  			Name: policyAddr.String(),
    91  		})
    92  		accountKeeper.SetAccount(ctx, acc)
    93  		oldPolicyAccounts[i] = acc.(*authtypes.ModuleAccount)
    94  	}
    95  
    96  	return oldPolicyAccounts, accountKeeper
    97  }