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