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 }