github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/keeper/grpc_query_test.go (about) 1 package keeper_test 2 3 import ( 4 "bytes" 5 "context" 6 "fmt" 7 "math" 8 "sort" 9 10 "github.com/cosmos/gogoproto/proto" 11 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 const addrStr = "cosmos13c3d4wq2t22dl0dstraf8jc3f902e3fsy9n3wv" 18 19 var addrBytes = []byte{0x8e, 0x22, 0xda, 0xb8, 0xa, 0x5a, 0x94, 0xdf, 0xbd, 0xb0, 0x58, 0xfa, 0x93, 0xcb, 0x11, 0x49, 0x5e, 0xac, 0xc5, 0x30} 20 21 func (suite *KeeperTestSuite) TestGRPCQueryAccounts() { 22 var req *types.QueryAccountsRequest 23 _, _, first := testdata.KeyTestPubAddr() 24 _, _, second := testdata.KeyTestPubAddr() 25 26 testCases := []struct { 27 msg string 28 malleate func() 29 expPass bool 30 posttests func(res *types.QueryAccountsResponse) 31 }{ 32 { 33 "success", 34 func() { 35 suite.accountKeeper.SetAccount(suite.ctx, 36 suite.accountKeeper.NewAccountWithAddress(suite.ctx, first)) 37 suite.accountKeeper.SetAccount(suite.ctx, 38 suite.accountKeeper.NewAccountWithAddress(suite.ctx, second)) 39 req = &types.QueryAccountsRequest{} 40 }, 41 true, 42 func(res *types.QueryAccountsResponse) { 43 addresses := make([]sdk.AccAddress, len(res.Accounts)) 44 for i, acc := range res.Accounts { 45 var account sdk.AccountI 46 err := suite.encCfg.InterfaceRegistry.UnpackAny(acc, &account) 47 suite.Require().NoError(err) 48 addresses[i] = account.GetAddress() 49 } 50 suite.Subset(addresses, []sdk.AccAddress{first, second}) 51 }, 52 }, 53 } 54 55 for _, tc := range testCases { 56 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 57 suite.SetupTest() // reset 58 59 tc.malleate() 60 res, err := suite.queryClient.Accounts(suite.ctx, req) 61 62 if tc.expPass { 63 suite.Require().NoError(err) 64 suite.Require().NotNil(res) 65 } else { 66 suite.Require().Error(err) 67 suite.Require().Nil(res) 68 } 69 70 tc.posttests(res) 71 }) 72 } 73 } 74 75 func (suite *KeeperTestSuite) TestGRPCQueryAccount() { 76 var req *types.QueryAccountRequest 77 _, _, addr := testdata.KeyTestPubAddr() 78 79 testCases := []struct { 80 msg string 81 malleate func() 82 expPass bool 83 posttests func(res *types.QueryAccountResponse) 84 }{ 85 { 86 "empty request", 87 func() { 88 req = &types.QueryAccountRequest{} 89 }, 90 false, 91 func(res *types.QueryAccountResponse) {}, 92 }, 93 { 94 "invalid request", 95 func() { 96 req = &types.QueryAccountRequest{Address: ""} 97 }, 98 false, 99 func(res *types.QueryAccountResponse) {}, 100 }, 101 { 102 "invalid request with empty byte array", 103 func() { 104 req = &types.QueryAccountRequest{Address: ""} 105 }, 106 false, 107 func(res *types.QueryAccountResponse) {}, 108 }, 109 { 110 "account not found", 111 func() { 112 req = &types.QueryAccountRequest{Address: addr.String()} 113 }, 114 false, 115 func(res *types.QueryAccountResponse) {}, 116 }, 117 { 118 "success", 119 func() { 120 suite.accountKeeper.SetAccount(suite.ctx, 121 suite.accountKeeper.NewAccountWithAddress(suite.ctx, addr)) 122 req = &types.QueryAccountRequest{Address: addr.String()} 123 }, 124 true, 125 func(res *types.QueryAccountResponse) { 126 var newAccount sdk.AccountI 127 err := suite.encCfg.InterfaceRegistry.UnpackAny(res.Account, &newAccount) 128 suite.Require().NoError(err) 129 suite.Require().NotNil(newAccount) 130 suite.Require().True(addr.Equals(newAccount.GetAddress())) 131 }, 132 }, 133 } 134 135 for _, tc := range testCases { 136 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 137 suite.SetupTest() // reset 138 139 tc.malleate() 140 res, err := suite.queryClient.Account(suite.ctx, req) 141 142 if tc.expPass { 143 suite.Require().NoError(err) 144 suite.Require().NotNil(res) 145 } else { 146 suite.Require().Error(err) 147 suite.Require().Nil(res) 148 } 149 150 tc.posttests(res) 151 }) 152 } 153 } 154 155 func (suite *KeeperTestSuite) TestGRPCQueryAccountAddressByID() { 156 var req *types.QueryAccountAddressByIDRequest 157 _, _, addr := testdata.KeyTestPubAddr() 158 159 testCases := []struct { 160 msg string 161 malleate func() 162 expPass bool 163 posttests func(res *types.QueryAccountAddressByIDResponse) 164 }{ 165 { 166 "invalid request", 167 func() { 168 req = &types.QueryAccountAddressByIDRequest{Id: -1} 169 }, 170 false, 171 func(res *types.QueryAccountAddressByIDResponse) {}, 172 }, 173 { 174 "account address not found", 175 func() { 176 req = &types.QueryAccountAddressByIDRequest{Id: math.MaxInt64} 177 }, 178 false, 179 func(res *types.QueryAccountAddressByIDResponse) {}, 180 }, 181 { 182 "valid account-id", 183 func() { 184 account := suite.accountKeeper.NewAccountWithAddress(suite.ctx, addr) 185 suite.accountKeeper.SetAccount(suite.ctx, account) 186 req = &types.QueryAccountAddressByIDRequest{AccountId: account.GetAccountNumber()} 187 }, 188 true, 189 func(res *types.QueryAccountAddressByIDResponse) { 190 suite.Require().NotNil(res.AccountAddress) 191 }, 192 }, 193 { 194 "invalid request", 195 func() { 196 account := suite.accountKeeper.NewAccountWithAddress(suite.ctx, addr) 197 suite.accountKeeper.SetAccount(suite.ctx, account) 198 req = &types.QueryAccountAddressByIDRequest{Id: 1} 199 }, 200 false, 201 func(res *types.QueryAccountAddressByIDResponse) {}, 202 }, 203 } 204 205 for _, tc := range testCases { 206 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 207 suite.SetupTest() // reset 208 209 tc.malleate() 210 res, err := suite.queryClient.AccountAddressByID(suite.ctx, req) 211 212 if tc.expPass { 213 suite.Require().NoError(err) 214 suite.Require().NotNil(res) 215 } else { 216 suite.Require().Error(err) 217 suite.Require().Nil(res) 218 } 219 220 tc.posttests(res) 221 }) 222 } 223 } 224 225 func (suite *KeeperTestSuite) TestGRPCQueryParams() { 226 var ( 227 req *types.QueryParamsRequest 228 expParams types.Params 229 ) 230 231 testCases := []struct { 232 msg string 233 malleate func() 234 expPass bool 235 }{ 236 { 237 "success", 238 func() { 239 req = &types.QueryParamsRequest{} 240 expParams = suite.accountKeeper.GetParams(suite.ctx) 241 }, 242 true, 243 }, 244 } 245 246 for _, tc := range testCases { 247 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 248 suite.SetupTest() // reset 249 250 tc.malleate() 251 res, err := suite.queryClient.Params(suite.ctx, req) 252 253 if tc.expPass { 254 suite.Require().NoError(err) 255 suite.Require().NotNil(res) 256 suite.Require().Equal(expParams, res.Params) 257 } else { 258 suite.Require().Error(err) 259 suite.Require().Nil(res) 260 } 261 }) 262 } 263 } 264 265 func (suite *KeeperTestSuite) TestGRPCQueryModuleAccounts() { 266 var req *types.QueryModuleAccountsRequest 267 268 testCases := []struct { 269 msg string 270 malleate func() 271 expPass bool 272 posttests func(res *types.QueryModuleAccountsResponse) 273 }{ 274 { 275 "success", 276 func() { 277 req = &types.QueryModuleAccountsRequest{} 278 }, 279 true, 280 func(res *types.QueryModuleAccountsResponse) { 281 mintModuleExists := false 282 for _, acc := range res.Accounts { 283 var account sdk.AccountI 284 err := suite.encCfg.InterfaceRegistry.UnpackAny(acc, &account) 285 suite.Require().NoError(err) 286 287 moduleAccount, ok := account.(sdk.ModuleAccountI) 288 289 suite.Require().True(ok) 290 if moduleAccount.GetName() == "mint" { 291 mintModuleExists = true 292 } 293 } 294 suite.Require().True(mintModuleExists) 295 }, 296 }, 297 { 298 "invalid module name", 299 func() { 300 req = &types.QueryModuleAccountsRequest{} 301 }, 302 true, 303 func(res *types.QueryModuleAccountsResponse) { 304 mintModuleExists := false 305 for _, acc := range res.Accounts { 306 var account sdk.AccountI 307 err := suite.encCfg.InterfaceRegistry.UnpackAny(acc, &account) 308 suite.Require().NoError(err) 309 310 moduleAccount, ok := account.(sdk.ModuleAccountI) 311 312 suite.Require().True(ok) 313 if moduleAccount.GetName() == "falseCase" { 314 mintModuleExists = true 315 } 316 } 317 suite.Require().False(mintModuleExists) 318 }, 319 }, 320 } 321 322 for _, tc := range testCases { 323 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 324 suite.SetupTest() // reset 325 326 tc.malleate() 327 res, err := suite.queryClient.ModuleAccounts(suite.ctx, req) 328 329 if tc.expPass { 330 suite.Require().NoError(err) 331 suite.Require().NotNil(res) 332 // Make sure output is sorted alphabetically. 333 var moduleNames []string 334 for _, any := range res.Accounts { 335 var account sdk.AccountI 336 err := suite.encCfg.InterfaceRegistry.UnpackAny(any, &account) 337 suite.Require().NoError(err) 338 moduleAccount, ok := account.(sdk.ModuleAccountI) 339 suite.Require().True(ok) 340 moduleNames = append(moduleNames, moduleAccount.GetName()) 341 } 342 suite.Require().True(sort.StringsAreSorted(moduleNames)) 343 } else { 344 suite.Require().Error(err) 345 suite.Require().Nil(res) 346 } 347 348 tc.posttests(res) 349 }) 350 } 351 } 352 353 func (suite *KeeperTestSuite) TestGRPCQueryModuleAccountByName() { 354 var req *types.QueryModuleAccountByNameRequest 355 356 testCases := []struct { 357 msg string 358 malleate func() 359 expPass bool 360 posttests func(res *types.QueryModuleAccountByNameResponse) 361 }{ 362 { 363 "success", 364 func() { 365 req = &types.QueryModuleAccountByNameRequest{Name: "mint"} 366 }, 367 true, 368 func(res *types.QueryModuleAccountByNameResponse) { 369 var account sdk.AccountI 370 err := suite.encCfg.InterfaceRegistry.UnpackAny(res.Account, &account) 371 suite.Require().NoError(err) 372 373 moduleAccount, ok := account.(sdk.ModuleAccountI) 374 suite.Require().True(ok) 375 suite.Require().Equal(moduleAccount.GetName(), "mint") 376 }, 377 }, 378 { 379 "invalid module name", 380 func() { 381 req = &types.QueryModuleAccountByNameRequest{Name: "gover"} 382 }, 383 false, 384 func(res *types.QueryModuleAccountByNameResponse) { 385 }, 386 }, 387 } 388 389 for _, tc := range testCases { 390 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 391 suite.SetupTest() // reset 392 tc.malleate() 393 res, err := suite.queryClient.ModuleAccountByName(suite.ctx, req) 394 if tc.expPass { 395 suite.Require().NoError(err) 396 suite.Require().NotNil(res) 397 } else { 398 suite.Require().Error(err) 399 suite.Require().Nil(res) 400 } 401 402 tc.posttests(res) 403 }) 404 } 405 } 406 407 func (suite *KeeperTestSuite) TestBech32Prefix() { 408 suite.SetupTest() // reset 409 req := &types.Bech32PrefixRequest{} 410 res, err := suite.queryClient.Bech32Prefix(context.Background(), req) 411 suite.Require().NoError(err) 412 suite.Require().NotNil(res) 413 suite.Require().Equal(sdk.Bech32MainPrefix, res.Bech32Prefix) 414 } 415 416 func (suite *KeeperTestSuite) TestAddressBytesToString() { 417 testCases := []struct { 418 msg string 419 req *types.AddressBytesToStringRequest 420 expPass bool 421 }{ 422 { 423 "success", 424 &types.AddressBytesToStringRequest{AddressBytes: addrBytes}, 425 true, 426 }, 427 { 428 "request is empty", 429 &types.AddressBytesToStringRequest{}, 430 false, 431 }, 432 { 433 "empty account address in request", 434 &types.AddressBytesToStringRequest{AddressBytes: []byte{}}, 435 false, 436 }, 437 } 438 439 for _, tc := range testCases { 440 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 441 suite.SetupTest() // reset 442 443 res, err := suite.queryClient.AddressBytesToString(context.Background(), tc.req) 444 445 if tc.expPass { 446 suite.Require().NoError(err) 447 suite.Require().NotNil(res) 448 suite.Require().Equal(res.AddressString, addrStr) 449 } else { 450 suite.Require().Error(err) 451 suite.Require().Nil(res) 452 } 453 }) 454 } 455 } 456 457 func (suite *KeeperTestSuite) TestAddressStringToBytes() { 458 testCases := []struct { 459 msg string 460 req *types.AddressStringToBytesRequest 461 expPass bool 462 }{ 463 { 464 "success", 465 &types.AddressStringToBytesRequest{AddressString: addrStr}, 466 true, 467 }, 468 { 469 "request is empty", 470 &types.AddressStringToBytesRequest{}, 471 false, 472 }, 473 { 474 "AddressString field in request is empty", 475 &types.AddressStringToBytesRequest{AddressString: ""}, 476 false, 477 }, 478 { 479 "address prefix is incorrect", 480 &types.AddressStringToBytesRequest{AddressString: "regen13c3d4wq2t22dl0dstraf8jc3f902e3fsy9n3wv"}, 481 false, 482 }, 483 } 484 485 for _, tc := range testCases { 486 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 487 suite.SetupTest() // reset 488 489 res, err := suite.queryClient.AddressStringToBytes(context.Background(), tc.req) 490 491 if tc.expPass { 492 suite.Require().NoError(err) 493 suite.Require().NotNil(res) 494 suite.Require().True(bytes.Equal(res.AddressBytes, addrBytes)) 495 } else { 496 suite.Require().Error(err) 497 suite.Require().Nil(res) 498 } 499 }) 500 } 501 } 502 503 func (suite *KeeperTestSuite) TestQueryAccountInfo() { 504 _, pk, addr := testdata.KeyTestPubAddr() 505 acc := suite.accountKeeper.NewAccountWithAddress(suite.ctx, addr) 506 suite.Require().NoError(acc.SetPubKey(pk)) 507 suite.Require().NoError(acc.SetSequence(10)) 508 suite.accountKeeper.SetAccount(suite.ctx, acc) 509 510 res, err := suite.queryClient.AccountInfo(context.Background(), &types.QueryAccountInfoRequest{ 511 Address: addr.String(), 512 }) 513 514 suite.Require().NoError(err) 515 suite.Require().NotNil(res.Info) 516 suite.Require().Equal(addr.String(), res.Info.Address) 517 suite.Require().Equal(acc.GetAccountNumber(), res.Info.AccountNumber) 518 suite.Require().Equal(acc.GetSequence(), res.Info.Sequence) 519 suite.Require().Equal("/"+proto.MessageName(pk), res.Info.PubKey.TypeUrl) 520 pkBz, err := proto.Marshal(pk) 521 suite.Require().NoError(err) 522 suite.Require().Equal(pkBz, res.Info.PubKey.Value) 523 } 524 525 func (suite *KeeperTestSuite) TestQueryAccountInfoWithoutPubKey() { 526 acc := suite.accountKeeper.NewAccountWithAddress(suite.ctx, addr) 527 suite.accountKeeper.SetAccount(suite.ctx, acc) 528 529 res, err := suite.queryClient.AccountInfo(context.Background(), &types.QueryAccountInfoRequest{ 530 Address: addr.String(), 531 }) 532 533 suite.Require().NoError(err) 534 suite.Require().NotNil(res.Info) 535 suite.Require().Equal(addr.String(), res.Info.Address) 536 suite.Require().Nil(res.Info.PubKey) 537 }