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

     1  package types_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
    12  	"github.com/cosmos/cosmos-sdk/testutil/testdata"
    13  	sdk "github.com/cosmos/cosmos-sdk/types"
    14  	"github.com/cosmos/cosmos-sdk/x/auth/types"
    15  )
    16  
    17  func TestBaseAddressPubKey(t *testing.T) {
    18  	_, pub1, addr1 := testdata.KeyTestPubAddr()
    19  	_, pub2, addr2 := testdata.KeyTestPubAddr()
    20  	acc := types.NewBaseAccountWithAddress(addr1)
    21  
    22  	// check the address (set) and pubkey (not set)
    23  	require.EqualValues(t, addr1, acc.GetAddress())
    24  	require.EqualValues(t, nil, acc.GetPubKey())
    25  
    26  	// can't override address
    27  	err := acc.SetAddress(addr2)
    28  	require.NotNil(t, err)
    29  	require.EqualValues(t, addr1, acc.GetAddress())
    30  
    31  	// set the pubkey
    32  	err = acc.SetPubKey(pub1)
    33  	require.Nil(t, err)
    34  	require.Equal(t, pub1, acc.GetPubKey())
    35  
    36  	// can override pubkey
    37  	err = acc.SetPubKey(pub2)
    38  	require.Nil(t, err)
    39  	require.Equal(t, pub2, acc.GetPubKey())
    40  
    41  	//------------------------------------
    42  
    43  	// can set address on empty account
    44  	acc2 := types.BaseAccount{}
    45  	err = acc2.SetAddress(addr2)
    46  	require.Nil(t, err)
    47  	require.EqualValues(t, addr2, acc2.GetAddress())
    48  
    49  	// no panic on calling string with an account with pubkey
    50  	require.NotEmpty(t, acc.String())
    51  	require.NotPanics(t, func() { _ = acc.String() })
    52  }
    53  
    54  func TestBaseSequence(t *testing.T) {
    55  	_, _, addr := testdata.KeyTestPubAddr()
    56  	acc := types.NewBaseAccountWithAddress(addr)
    57  	seq := uint64(7)
    58  
    59  	err := acc.SetSequence(seq)
    60  	require.Nil(t, err)
    61  	require.Equal(t, seq, acc.GetSequence())
    62  }
    63  
    64  func TestGenesisAccountValidate(t *testing.T) {
    65  	pubkey := secp256k1.GenPrivKey().PubKey()
    66  	addr := sdk.AccAddress(pubkey.Address())
    67  	baseAcc := types.NewBaseAccount(addr, pubkey, 0, 0)
    68  
    69  	tests := []struct {
    70  		name   string
    71  		acc    types.GenesisAccount
    72  		expErr bool
    73  	}{
    74  		{
    75  			"valid base account",
    76  			baseAcc,
    77  			false,
    78  		},
    79  		{
    80  			"invalid base valid account",
    81  			types.NewBaseAccount(addr, secp256k1.GenPrivKey().PubKey(), 0, 0),
    82  			true,
    83  		},
    84  	}
    85  
    86  	for _, tt := range tests {
    87  		tt := tt
    88  
    89  		t.Run(tt.name, func(t *testing.T) {
    90  			require.Equal(t, tt.expErr, tt.acc.Validate() != nil)
    91  		})
    92  	}
    93  }
    94  
    95  func TestModuleAccountString(t *testing.T) {
    96  	name := "test"
    97  	moduleAcc := types.NewEmptyModuleAccount(name, types.Minter, types.Burner, types.Staking)
    98  	want := `base_account:<address:"cosmos1n7rdpqvgf37ktx30a2sv2kkszk3m7ncmg5drhe" > name:"test" permissions:"minter" permissions:"burner" permissions:"staking" `
    99  	require.Equal(t, want, moduleAcc.String())
   100  	moduleAcc.SetSequence(10)
   101  	want = `base_account:<address:"cosmos1n7rdpqvgf37ktx30a2sv2kkszk3m7ncmg5drhe" sequence:10 > name:"test" permissions:"minter" permissions:"burner" permissions:"staking" `
   102  	require.Equal(t, want, moduleAcc.String())
   103  }
   104  
   105  func TestHasPermissions(t *testing.T) {
   106  	name := "test"
   107  	macc := types.NewEmptyModuleAccount(name, types.Staking, types.Minter, types.Burner)
   108  	cases := []struct {
   109  		permission string
   110  		expectHas  bool
   111  	}{
   112  		{types.Staking, true},
   113  		{types.Minter, true},
   114  		{types.Burner, true},
   115  		{"other", false},
   116  	}
   117  
   118  	for i, tc := range cases {
   119  		hasPerm := macc.HasPermission(tc.permission)
   120  		if tc.expectHas {
   121  			require.True(t, hasPerm, "test case #%d", i)
   122  		} else {
   123  			require.False(t, hasPerm, "test case #%d", i)
   124  		}
   125  	}
   126  }
   127  
   128  func TestValidate(t *testing.T) {
   129  	addr := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address())
   130  	baseAcc := types.NewBaseAccount(addr, nil, 0, 0)
   131  	tests := []struct {
   132  		name   string
   133  		acc    types.GenesisAccount
   134  		expErr error
   135  	}{
   136  		{
   137  			"valid module account",
   138  			types.NewEmptyModuleAccount("test"),
   139  			nil,
   140  		},
   141  		{
   142  			"invalid name and address pair",
   143  			types.NewModuleAccount(baseAcc, "test"),
   144  			fmt.Errorf("address %s cannot be derived from the module name 'test'", addr),
   145  		},
   146  		{
   147  			"empty module account name",
   148  			types.NewModuleAccount(baseAcc, "    "),
   149  			errors.New("module account name cannot be blank"),
   150  		},
   151  	}
   152  	for _, tt := range tests {
   153  		tt := tt
   154  		t.Run(tt.name, func(t *testing.T) {
   155  			err := tt.acc.Validate()
   156  			require.Equal(t, tt.expErr, err)
   157  		})
   158  	}
   159  }
   160  
   161  func TestModuleAccountJSON(t *testing.T) {
   162  	pubkey := secp256k1.GenPrivKey().PubKey()
   163  	addr := sdk.AccAddress(pubkey.Address())
   164  	baseAcc := types.NewBaseAccount(addr, nil, 10, 50)
   165  	acc := types.NewModuleAccount(baseAcc, "test", "burner")
   166  
   167  	bz, err := json.Marshal(acc)
   168  	require.NoError(t, err)
   169  
   170  	bz1, err := acc.MarshalJSON()
   171  	require.NoError(t, err)
   172  	require.Equal(t, string(bz1), string(bz))
   173  
   174  	var a types.ModuleAccount
   175  	require.NoError(t, json.Unmarshal(bz, &a))
   176  	require.Equal(t, acc.String(), a.String())
   177  }
   178  
   179  func TestGenesisAccountsContains(t *testing.T) {
   180  	pubkey := secp256k1.GenPrivKey().PubKey()
   181  	addr := sdk.AccAddress(pubkey.Address())
   182  	acc := types.NewBaseAccount(addr, secp256k1.GenPrivKey().PubKey(), 0, 0)
   183  
   184  	genAccounts := types.GenesisAccounts{}
   185  	require.False(t, genAccounts.Contains(acc.GetAddress()))
   186  
   187  	genAccounts = append(genAccounts, acc)
   188  	require.True(t, genAccounts.Contains(acc.GetAddress()))
   189  }
   190  
   191  func TestNewModuleAddressOrBech32Address(t *testing.T) {
   192  	input := "cosmos1cwwv22j5ca08ggdv9c2uky355k908694z577tv"
   193  	require.Equal(t, input, types.NewModuleAddressOrBech32Address(input).String())
   194  	require.Equal(t, "cosmos1jv65s3grqf6v6jl3dp4t6c9t9rk99cd88lyufl", types.NewModuleAddressOrBech32Address("distribution").String())
   195  }
   196  
   197  func TestModuleAccountValidateNilBaseAccount(t *testing.T) {
   198  	ma := &types.ModuleAccount{Name: "foo"}
   199  	_ = ma.Validate()
   200  }