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 }