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  }