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 }