github.com/Finschia/finschia-sdk@v0.48.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 yaml "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 tt := tt 108 109 t.Run(tt.name, func(t *testing.T) { 110 require.Equal(t, tt.expErr, tt.acc.Validate() != nil) 111 }) 112 } 113 } 114 115 func TestModuleAccountMarshalYAML(t *testing.T) { 116 name := "test" 117 moduleAcc := types.NewEmptyModuleAccount(name, types.Minter, types.Burner, types.Staking) 118 bs, err := yaml.Marshal(moduleAcc) 119 require.NoError(t, err) 120 121 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" 122 require.Equal(t, want, string(bs)) 123 } 124 125 func TestHasPermissions(t *testing.T) { 126 name := "test" 127 macc := types.NewEmptyModuleAccount(name, types.Staking, types.Minter, types.Burner) 128 cases := []struct { 129 permission string 130 expectHas bool 131 }{ 132 {types.Staking, true}, 133 {types.Minter, true}, 134 {types.Burner, true}, 135 {"other", false}, 136 } 137 138 for i, tc := range cases { 139 hasPerm := macc.HasPermission(tc.permission) 140 if tc.expectHas { 141 require.True(t, hasPerm, "test case #%d", i) 142 } else { 143 require.False(t, hasPerm, "test case #%d", i) 144 } 145 } 146 } 147 148 func TestValidate(t *testing.T) { 149 addr := sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address()) 150 baseAcc := types.NewBaseAccount(addr, nil, 0, 0) 151 tests := []struct { 152 name string 153 acc types.GenesisAccount 154 expErr error 155 }{ 156 { 157 "valid module account", 158 types.NewEmptyModuleAccount("test"), 159 nil, 160 }, 161 { 162 "invalid name and address pair", 163 types.NewModuleAccount(baseAcc, "test"), 164 fmt.Errorf("address %s cannot be derived from the module name 'test'", addr), 165 }, 166 { 167 "empty module account name", 168 types.NewModuleAccount(baseAcc, " "), 169 errors.New("module account name cannot be blank"), 170 }, 171 } 172 for _, tt := range tests { 173 tt := tt 174 t.Run(tt.name, func(t *testing.T) { 175 err := tt.acc.Validate() 176 require.Equal(t, tt.expErr, err) 177 }) 178 } 179 } 180 181 func TestModuleAccountJSON(t *testing.T) { 182 pubkey := secp256k1.GenPrivKey().PubKey() 183 addr := sdk.AccAddress(pubkey.Address()) 184 baseAcc := types.NewBaseAccount(addr, nil, 10, 50) 185 acc := types.NewModuleAccount(baseAcc, "test", "burner") 186 187 bz, err := json.Marshal(acc) 188 require.NoError(t, err) 189 190 bz1, err := acc.MarshalJSON() 191 require.NoError(t, err) 192 require.Equal(t, string(bz1), string(bz)) 193 194 var a types.ModuleAccount 195 require.NoError(t, json.Unmarshal(bz, &a)) 196 require.Equal(t, acc.String(), a.String()) 197 } 198 199 func TestGenesisAccountsContains(t *testing.T) { 200 pubkey := secp256k1.GenPrivKey().PubKey() 201 addr := sdk.AccAddress(pubkey.Address()) 202 acc := types.NewBaseAccount(addr, secp256k1.GenPrivKey().PubKey(), 0, 0) 203 204 genAccounts := types.GenesisAccounts{} 205 require.False(t, genAccounts.Contains(acc.GetAddress())) 206 207 genAccounts = append(genAccounts, acc) 208 require.True(t, genAccounts.Contains(acc.GetAddress())) 209 }