github.com/Finschia/finschia-sdk@v0.48.1/x/bank/keeper/grpc_query_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	gocontext "context"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/Finschia/finschia-sdk/baseapp"
     9  	"github.com/Finschia/finschia-sdk/simapp"
    10  	"github.com/Finschia/finschia-sdk/testutil/testdata"
    11  	sdk "github.com/Finschia/finschia-sdk/types"
    12  	"github.com/Finschia/finschia-sdk/types/query"
    13  	authtypes "github.com/Finschia/finschia-sdk/x/auth/types"
    14  	vestingtypes "github.com/Finschia/finschia-sdk/x/auth/vesting/types"
    15  	"github.com/Finschia/finschia-sdk/x/bank/types"
    16  	minttypes "github.com/Finschia/finschia-sdk/x/mint/types"
    17  )
    18  
    19  func (suite *IntegrationTestSuite) TestQueryBalance() {
    20  	app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
    21  	_, _, addr := testdata.KeyTestPubAddr()
    22  
    23  	_, err := queryClient.Balance(gocontext.Background(), &types.QueryBalanceRequest{})
    24  	suite.Require().Error(err)
    25  
    26  	_, err = queryClient.Balance(gocontext.Background(), &types.QueryBalanceRequest{Address: addr.String()})
    27  	suite.Require().Error(err)
    28  
    29  	req := types.NewQueryBalanceRequest(addr, fooDenom)
    30  	res, err := queryClient.Balance(gocontext.Background(), req)
    31  	suite.Require().NoError(err)
    32  	suite.Require().NotNil(res)
    33  	suite.True(res.Balance.IsZero())
    34  
    35  	origCoins := sdk.NewCoins(newFooCoin(50), newBarCoin(30))
    36  	acc := app.AccountKeeper.NewAccountWithAddress(ctx, addr)
    37  
    38  	app.AccountKeeper.SetAccount(ctx, acc)
    39  	suite.Require().NoError(simapp.FundAccount(app, ctx, acc.GetAddress(), origCoins))
    40  
    41  	res, err = queryClient.Balance(gocontext.Background(), req)
    42  	suite.Require().NoError(err)
    43  	suite.Require().NotNil(res)
    44  	suite.True(res.Balance.IsEqual(newFooCoin(50)))
    45  }
    46  
    47  func (suite *IntegrationTestSuite) TestQueryAllBalances() {
    48  	app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
    49  	_, _, addr := testdata.KeyTestPubAddr()
    50  	_, err := queryClient.AllBalances(gocontext.Background(), &types.QueryAllBalancesRequest{})
    51  	suite.Require().Error(err)
    52  
    53  	pageReq := &query.PageRequest{
    54  		Key:        nil,
    55  		Limit:      1,
    56  		CountTotal: false,
    57  	}
    58  	req := types.NewQueryAllBalancesRequest(addr, pageReq)
    59  	res, err := queryClient.AllBalances(gocontext.Background(), req)
    60  	suite.Require().NoError(err)
    61  	suite.Require().NotNil(res)
    62  	suite.True(res.Balances.IsZero())
    63  
    64  	fooCoins := newFooCoin(50)
    65  	barCoins := newBarCoin(30)
    66  
    67  	origCoins := sdk.NewCoins(fooCoins, barCoins)
    68  	acc := app.AccountKeeper.NewAccountWithAddress(ctx, addr)
    69  
    70  	app.AccountKeeper.SetAccount(ctx, acc)
    71  	suite.Require().NoError(simapp.FundAccount(app, ctx, acc.GetAddress(), origCoins))
    72  
    73  	res, err = queryClient.AllBalances(gocontext.Background(), req)
    74  	suite.Require().NoError(err)
    75  	suite.Require().NotNil(res)
    76  	suite.Equal(res.Balances.Len(), 1)
    77  	suite.NotNil(res.Pagination.NextKey)
    78  
    79  	suite.T().Log("query second page with nextkey")
    80  	pageReq = &query.PageRequest{
    81  		Key:        res.Pagination.NextKey,
    82  		Limit:      1,
    83  		CountTotal: true,
    84  	}
    85  	req = types.NewQueryAllBalancesRequest(addr, pageReq)
    86  	res, err = queryClient.AllBalances(gocontext.Background(), req)
    87  	suite.Equal(res.Balances.Len(), 1)
    88  	suite.Nil(res.Pagination.NextKey)
    89  }
    90  
    91  func (suite *IntegrationTestSuite) TestSpendableBalances() {
    92  	app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
    93  	_, _, addr := testdata.KeyTestPubAddr()
    94  	ctx = ctx.WithBlockTime(time.Now())
    95  
    96  	_, err := queryClient.SpendableBalances(sdk.WrapSDKContext(ctx), &types.QuerySpendableBalancesRequest{})
    97  	suite.Require().Error(err)
    98  
    99  	pageReq := &query.PageRequest{
   100  		Key:        nil,
   101  		Limit:      2,
   102  		CountTotal: false,
   103  	}
   104  	req := types.NewQuerySpendableBalancesRequest(addr, pageReq)
   105  
   106  	res, err := queryClient.SpendableBalances(sdk.WrapSDKContext(ctx), req)
   107  	suite.Require().NoError(err)
   108  	suite.Require().NotNil(res)
   109  	suite.True(res.Balances.IsZero())
   110  
   111  	fooCoins := newFooCoin(50)
   112  	barCoins := newBarCoin(30)
   113  
   114  	origCoins := sdk.NewCoins(fooCoins, barCoins)
   115  	acc := app.AccountKeeper.NewAccountWithAddress(ctx, addr)
   116  	acc = vestingtypes.NewContinuousVestingAccount(
   117  		acc.(*authtypes.BaseAccount),
   118  		sdk.NewCoins(fooCoins),
   119  		ctx.BlockTime().Unix(),
   120  		ctx.BlockTime().Add(time.Hour).Unix(),
   121  	)
   122  
   123  	app.AccountKeeper.SetAccount(ctx, acc)
   124  	suite.Require().NoError(simapp.FundAccount(app, ctx, acc.GetAddress(), origCoins))
   125  
   126  	// move time forward for some tokens to vest
   127  	ctx = ctx.WithBlockTime(ctx.BlockTime().Add(30 * time.Minute))
   128  	queryHelper := baseapp.NewQueryServerTestHelper(ctx, app.InterfaceRegistry())
   129  	types.RegisterQueryServer(queryHelper, app.BankKeeper)
   130  	queryClient = types.NewQueryClient(queryHelper)
   131  
   132  	res, err = queryClient.SpendableBalances(sdk.WrapSDKContext(ctx), req)
   133  	suite.Require().NoError(err)
   134  	suite.Require().NotNil(res)
   135  	suite.Equal(2, res.Balances.Len())
   136  	suite.Nil(res.Pagination.NextKey)
   137  	suite.EqualValues(30, res.Balances[0].Amount.Int64())
   138  	suite.EqualValues(25, res.Balances[1].Amount.Int64())
   139  }
   140  
   141  func (suite *IntegrationTestSuite) TestQueryTotalSupply() {
   142  	app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
   143  	expectedTotalSupply := sdk.NewCoins(sdk.NewInt64Coin("test", 400000000))
   144  	suite.
   145  		Require().
   146  		NoError(app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, expectedTotalSupply))
   147  
   148  	res, err := queryClient.TotalSupply(gocontext.Background(), &types.QueryTotalSupplyRequest{})
   149  	suite.Require().NoError(err)
   150  	suite.Require().NotNil(res)
   151  
   152  	suite.Require().Equal(expectedTotalSupply, res.Supply)
   153  }
   154  
   155  func (suite *IntegrationTestSuite) TestQueryTotalSupplyOf() {
   156  	app, ctx, queryClient := suite.app, suite.ctx, suite.queryClient
   157  
   158  	test1Supply := sdk.NewInt64Coin("test1", 4000000)
   159  	test2Supply := sdk.NewInt64Coin("test2", 700000000)
   160  	expectedTotalSupply := sdk.NewCoins(test1Supply, test2Supply)
   161  	suite.
   162  		Require().
   163  		NoError(app.BankKeeper.MintCoins(ctx, minttypes.ModuleName, expectedTotalSupply))
   164  
   165  	_, err := queryClient.SupplyOf(gocontext.Background(), &types.QuerySupplyOfRequest{})
   166  	suite.Require().Error(err)
   167  
   168  	res, err := queryClient.SupplyOf(gocontext.Background(), &types.QuerySupplyOfRequest{Denom: test1Supply.Denom})
   169  	suite.Require().NoError(err)
   170  	suite.Require().NotNil(res)
   171  
   172  	suite.Require().Equal(test1Supply, res.Amount)
   173  }
   174  
   175  func (suite *IntegrationTestSuite) TestQueryParams() {
   176  	res, err := suite.queryClient.Params(gocontext.Background(), &types.QueryParamsRequest{})
   177  	suite.Require().NoError(err)
   178  	suite.Require().NotNil(res)
   179  	param := suite.app.BankKeeper.GetParams(suite.ctx)
   180  	suite.Require().Equal(len(param.SendEnabled), len(res.GetParams().SendEnabled))
   181  	suite.Require().Equal(param.DefaultSendEnabled, res.GetParams().DefaultSendEnabled)
   182  }
   183  
   184  func (suite *IntegrationTestSuite) QueryDenomsMetadataRequest() {
   185  	var (
   186  		req         *types.QueryDenomsMetadataRequest
   187  		expMetadata = []types.Metadata{}
   188  	)
   189  
   190  	testCases := []struct {
   191  		msg      string
   192  		malleate func()
   193  		expPass  bool
   194  	}{
   195  		{
   196  			"empty pagination",
   197  			func() {
   198  				req = &types.QueryDenomsMetadataRequest{}
   199  			},
   200  			true,
   201  		},
   202  		{
   203  			"success, no results",
   204  			func() {
   205  				req = &types.QueryDenomsMetadataRequest{
   206  					Pagination: &query.PageRequest{
   207  						Limit:      3,
   208  						CountTotal: true,
   209  					},
   210  				}
   211  			},
   212  			true,
   213  		},
   214  		{
   215  			"success",
   216  			func() {
   217  				metadataAtom := types.Metadata{
   218  					Description: "The native staking token of the Cosmos Hub.",
   219  					DenomUnits: []*types.DenomUnit{
   220  						{
   221  							Denom:    "uatom",
   222  							Exponent: 0,
   223  							Aliases:  []string{"microatom"},
   224  						},
   225  						{
   226  							Denom:    "atom",
   227  							Exponent: 6,
   228  							Aliases:  []string{"ATOM"},
   229  						},
   230  					},
   231  					Base:    "uatom",
   232  					Display: "atom",
   233  				}
   234  
   235  				metadataEth := types.Metadata{
   236  					Description: "Ethereum native token",
   237  					DenomUnits: []*types.DenomUnit{
   238  						{
   239  							Denom:    "wei",
   240  							Exponent: 0,
   241  						},
   242  						{
   243  							Denom:    "eth",
   244  							Exponent: 18,
   245  							Aliases:  []string{"ETH", "ether"},
   246  						},
   247  					},
   248  					Base:    "wei",
   249  					Display: "eth",
   250  				}
   251  
   252  				suite.app.BankKeeper.SetDenomMetaData(suite.ctx, metadataAtom)
   253  				suite.app.BankKeeper.SetDenomMetaData(suite.ctx, metadataEth)
   254  				expMetadata = []types.Metadata{metadataAtom, metadataEth}
   255  				req = &types.QueryDenomsMetadataRequest{
   256  					Pagination: &query.PageRequest{
   257  						Limit:      7,
   258  						CountTotal: true,
   259  					},
   260  				}
   261  			},
   262  			true,
   263  		},
   264  	}
   265  
   266  	for _, tc := range testCases {
   267  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   268  			suite.SetupTest() // reset
   269  
   270  			tc.malleate()
   271  			ctx := sdk.WrapSDKContext(suite.ctx)
   272  
   273  			res, err := suite.queryClient.DenomsMetadata(ctx, req)
   274  
   275  			if tc.expPass {
   276  				suite.Require().NoError(err)
   277  				suite.Require().NotNil(res)
   278  				suite.Require().Equal(expMetadata, res.Metadatas)
   279  			} else {
   280  				suite.Require().Error(err)
   281  			}
   282  		})
   283  	}
   284  }
   285  
   286  func (suite *IntegrationTestSuite) QueryDenomMetadataRequest() {
   287  	var (
   288  		req         *types.QueryDenomMetadataRequest
   289  		expMetadata = types.Metadata{}
   290  	)
   291  
   292  	testCases := []struct {
   293  		msg      string
   294  		malleate func()
   295  		expPass  bool
   296  	}{
   297  		{
   298  			"empty denom",
   299  			func() {
   300  				req = &types.QueryDenomMetadataRequest{}
   301  			},
   302  			false,
   303  		},
   304  		{
   305  			"not found denom",
   306  			func() {
   307  				req = &types.QueryDenomMetadataRequest{
   308  					Denom: "foo",
   309  				}
   310  			},
   311  			false,
   312  		},
   313  		{
   314  			"success",
   315  			func() {
   316  				expMetadata := types.Metadata{
   317  					Description: "The native staking token of the Cosmos Hub.",
   318  					DenomUnits: []*types.DenomUnit{
   319  						{
   320  							Denom:    "uatom",
   321  							Exponent: 0,
   322  							Aliases:  []string{"microatom"},
   323  						},
   324  						{
   325  							Denom:    "atom",
   326  							Exponent: 6,
   327  							Aliases:  []string{"ATOM"},
   328  						},
   329  					},
   330  					Base:    "uatom",
   331  					Display: "atom",
   332  				}
   333  
   334  				suite.app.BankKeeper.SetDenomMetaData(suite.ctx, expMetadata)
   335  				req = &types.QueryDenomMetadataRequest{
   336  					Denom: expMetadata.Base,
   337  				}
   338  			},
   339  			true,
   340  		},
   341  	}
   342  
   343  	for _, tc := range testCases {
   344  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   345  			suite.SetupTest() // reset
   346  
   347  			tc.malleate()
   348  			ctx := sdk.WrapSDKContext(suite.ctx)
   349  
   350  			res, err := suite.queryClient.DenomMetadata(ctx, req)
   351  
   352  			if tc.expPass {
   353  				suite.Require().NoError(err)
   354  				suite.Require().NotNil(res)
   355  				suite.Require().Equal(expMetadata, res.Metadata)
   356  			} else {
   357  				suite.Require().Error(err)
   358  			}
   359  		})
   360  	}
   361  }