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 }