github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/types/genesis_test.go (about)

     1  package types_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	proto "github.com/cosmos/gogoproto/proto"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    11  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    14  	"github.com/cosmos/cosmos-sdk/x/auth"
    15  	"github.com/cosmos/cosmos-sdk/x/auth/types"
    16  )
    17  
    18  func TestSanitize(t *testing.T) {
    19  	addr1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address())
    20  	authAcc1 := types.NewBaseAccountWithAddress(addr1)
    21  	err := authAcc1.SetAccountNumber(1)
    22  	require.NoError(t, err)
    23  
    24  	addr2 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address())
    25  	authAcc2 := types.NewBaseAccountWithAddress(addr2)
    26  
    27  	genAccs := types.GenesisAccounts{authAcc1, authAcc2}
    28  
    29  	require.True(t, genAccs[0].GetAccountNumber() > genAccs[1].GetAccountNumber())
    30  	require.Equal(t, genAccs[1].GetAddress(), addr2)
    31  	genAccs = types.SanitizeGenesisAccounts(genAccs)
    32  
    33  	require.False(t, genAccs[0].GetAccountNumber() > genAccs[1].GetAccountNumber())
    34  	require.Equal(t, genAccs[1].GetAddress(), addr1)
    35  }
    36  
    37  var (
    38  	pk1   = ed25519.GenPrivKey().PubKey()
    39  	pk2   = ed25519.GenPrivKey().PubKey()
    40  	addr1 = sdk.ValAddress(pk1.Address())
    41  	addr2 = sdk.ValAddress(pk2.Address())
    42  )
    43  
    44  // require duplicate accounts fails validation
    45  func TestValidateGenesisDuplicateAccounts(t *testing.T) {
    46  	acc1 := types.NewBaseAccountWithAddress(sdk.AccAddress(addr1))
    47  
    48  	genAccs := make(types.GenesisAccounts, 2)
    49  	genAccs[0] = acc1
    50  	genAccs[1] = acc1
    51  
    52  	require.Error(t, types.ValidateGenAccounts(genAccs))
    53  }
    54  
    55  func TestGenesisAccountIterator(t *testing.T) {
    56  	encodingConfig := moduletestutil.MakeTestEncodingConfig(auth.AppModuleBasic{})
    57  	cdc := encodingConfig.Codec
    58  
    59  	acc1 := types.NewBaseAccountWithAddress(sdk.AccAddress(addr1))
    60  	acc2 := types.NewBaseAccountWithAddress(sdk.AccAddress(addr2))
    61  
    62  	genAccounts := types.GenesisAccounts{acc1, acc2}
    63  
    64  	authGenState := types.DefaultGenesisState()
    65  	accounts, err := types.PackAccounts(genAccounts)
    66  	require.NoError(t, err)
    67  	authGenState.Accounts = accounts
    68  
    69  	appGenesis := make(map[string]json.RawMessage)
    70  	authGenStateBz, err := cdc.MarshalJSON(authGenState)
    71  	require.NoError(t, err)
    72  
    73  	appGenesis[types.ModuleName] = authGenStateBz
    74  
    75  	var addresses []sdk.AccAddress
    76  	types.GenesisAccountIterator{}.IterateGenesisAccounts(
    77  		cdc, appGenesis, func(acc sdk.AccountI) (stop bool) {
    78  			addresses = append(addresses, acc.GetAddress())
    79  			return false
    80  		},
    81  	)
    82  
    83  	require.Len(t, addresses, 2)
    84  	require.Equal(t, addresses[0], acc1.GetAddress())
    85  	require.Equal(t, addresses[1], acc2.GetAddress())
    86  }
    87  
    88  func TestPackAccountsAny(t *testing.T) {
    89  	var accounts []*codectypes.Any
    90  
    91  	testCases := []struct {
    92  		msg      string
    93  		malleate func()
    94  		expPass  bool
    95  	}{
    96  		{
    97  			"expected genesis account",
    98  			func() {
    99  				accounts = []*codectypes.Any{{}}
   100  			},
   101  			false,
   102  		},
   103  		{
   104  			"success",
   105  			func() {
   106  				genAccounts := types.GenesisAccounts{&types.BaseAccount{}}
   107  				accounts = make([]*codectypes.Any, len(genAccounts))
   108  
   109  				for i, a := range genAccounts {
   110  					msg, ok := a.(proto.Message)
   111  					require.Equal(t, ok, true)
   112  					any, err := codectypes.NewAnyWithValue(msg)
   113  					require.NoError(t, err)
   114  					accounts[i] = any
   115  				}
   116  			},
   117  			true,
   118  		},
   119  	}
   120  
   121  	for _, tc := range testCases {
   122  		t.Run(tc.msg, func(t *testing.T) {
   123  			tc.malleate()
   124  
   125  			res, err := types.UnpackAccounts(accounts)
   126  
   127  			if tc.expPass {
   128  				require.NoError(t, err)
   129  				require.NotNil(t, res)
   130  				require.Equal(t, len(res), len(accounts))
   131  			} else {
   132  				require.Error(t, err)
   133  				require.Nil(t, res)
   134  			}
   135  		})
   136  	}
   137  }