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