github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/keeper/querier_test.go (about) 1 package keeper 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 10 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/cli/flags" 11 "github.com/stretchr/testify/require" 12 13 "github.com/fibonacci-chain/fbc/x/gov/types" 14 "github.com/fibonacci-chain/fbc/x/staking" 15 ) 16 17 const custom = "custom" 18 19 func getQueriedDepositParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) types.DepositParams { 20 query := abci.RequestQuery{ 21 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryParams, types.ParamDeposit}, "/"), 22 Data: []byte{}, 23 } 24 bz, err := querier(ctx, []string{types.QueryParams, types.ParamDeposit}, query) 25 require.Nil(t, err) 26 require.NotNil(t, bz) 27 var params types.DepositParams 28 err2 := cdc.UnmarshalJSON(bz, ¶ms) 29 require.Nil(t, err2) 30 31 return params 32 } 33 34 func getQueriedVotingParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) types.VotingParams { 35 query := abci.RequestQuery{ 36 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryParams, types.ParamVoting}, "/"), 37 Data: []byte{}, 38 } 39 bz, err := querier(ctx, []string{types.QueryParams, types.ParamVoting}, query) 40 require.Nil(t, err) 41 require.NotNil(t, bz) 42 var params types.VotingParams 43 err2 := cdc.UnmarshalJSON(bz, ¶ms) 44 require.Nil(t, err2) 45 46 return params 47 } 48 49 func getQueriedTallyParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) types.TallyParams { 50 query := abci.RequestQuery{ 51 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryParams, types.ParamTallying}, "/"), 52 Data: []byte{}, 53 } 54 bz, err := querier(ctx, []string{types.QueryParams, types.ParamTallying}, query) 55 require.Nil(t, err) 56 require.NotNil(t, bz) 57 var params types.TallyParams 58 err2 := cdc.UnmarshalJSON(bz, ¶ms) 59 require.Nil(t, err2) 60 61 return params 62 } 63 64 func getQueriedParams(t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier) types.Params { 65 params := types.Params{ 66 VotingParams: getQueriedVotingParams(t, ctx, cdc, querier), 67 TallyParams: getQueriedTallyParams(t, ctx, cdc, querier), 68 DepositParams: getQueriedDepositParams(t, ctx, cdc, querier), 69 } 70 return params 71 } 72 73 func getQueriedProposals( 74 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, depositor, voter sdk.AccAddress, 75 status types.ProposalStatus, limit uint64, 76 ) types.Proposals { 77 query := abci.RequestQuery{ 78 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryProposals}, "/"), 79 Data: cdc.MustMarshalJSON(types.NewQueryProposalsParams(status, limit, voter, depositor)), 80 } 81 82 bz, err := querier(ctx, []string{types.QueryProposals}, query) 83 require.Nil(t, err) 84 require.NotNil(t, bz) 85 86 var proposals types.Proposals 87 err2 := cdc.UnmarshalJSON(bz, &proposals) 88 require.Nil(t, err2) 89 return proposals 90 } 91 92 func getQueriedDeposit( 93 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, depositor sdk.AccAddress, 94 ) types.Deposit { 95 query := abci.RequestQuery{ 96 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDeposit}, "/"), 97 Data: cdc.MustMarshalJSON(types.NewQueryDepositParams(proposalID, depositor)), 98 } 99 100 bz, err := querier(ctx, []string{types.QueryDeposit}, query) 101 require.Nil(t, err) 102 require.NotNil(t, bz) 103 104 var deposit types.Deposit 105 err2 := cdc.UnmarshalJSON(bz, &deposit) 106 require.Nil(t, err2) 107 return deposit 108 } 109 110 func getQueriedDeposits( 111 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, 112 ) types.Deposits { 113 query := abci.RequestQuery{ 114 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDeposits}, "/"), 115 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(proposalID)), 116 } 117 118 bz, err := querier(ctx, []string{types.QueryDeposits}, query) 119 require.Nil(t, err) 120 require.NotNil(t, bz) 121 122 var deposits types.Deposits 123 err2 := cdc.UnmarshalJSON(bz, &deposits) 124 require.Nil(t, err2) 125 return deposits 126 } 127 128 func getQueriedVote( 129 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, voter sdk.AccAddress, 130 ) types.Vote { 131 query := abci.RequestQuery{ 132 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryVote}, "/"), 133 Data: cdc.MustMarshalJSON(types.NewQueryVoteParams(proposalID, voter)), 134 } 135 136 bz, err := querier(ctx, []string{types.QueryVote}, query) 137 require.Nil(t, err) 138 require.NotNil(t, bz) 139 140 var vote types.Vote 141 err2 := cdc.UnmarshalJSON(bz, &vote) 142 require.Nil(t, err2) 143 return vote 144 } 145 146 func getQueriedVotes( 147 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, 148 ) types.Votes { 149 query := abci.RequestQuery{ 150 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryVotes}, "/"), 151 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(proposalID)), 152 } 153 154 bz, err := querier(ctx, []string{types.QueryVotes}, query) 155 require.Nil(t, err) 156 require.NotNil(t, bz) 157 158 var votes types.Votes 159 err2 := cdc.UnmarshalJSON(bz, &votes) 160 require.Nil(t, err2) 161 return votes 162 } 163 164 func getQueriedTally( 165 t *testing.T, ctx sdk.Context, cdc *codec.Codec, querier sdk.Querier, proposalID uint64, 166 ) types.TallyResult { 167 query := abci.RequestQuery{ 168 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryTally}, "/"), 169 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(proposalID)), 170 } 171 172 bz, err := querier(ctx, []string{types.QueryTally}, query) 173 require.Nil(t, err) 174 require.NotNil(t, bz) 175 176 var tally types.TallyResult 177 err2 := cdc.UnmarshalJSON(bz, &tally) 178 require.Nil(t, err2) 179 return tally 180 } 181 182 func TestQueries(t *testing.T) { 183 ctx, _, keeper, sk, _ := CreateTestInput(t, false, 100000) 184 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 185 require.Nil(t, err) 186 ctx.SetLogger(log) 187 skHandler := staking.NewHandler(sk) 188 querier := NewQuerier(keeper) 189 cdc := keeper.Cdc() 190 191 validator := sdk.ValAddress(Addrs[4]) 192 CreateValidators(t, skHandler, ctx, []sdk.ValAddress{validator}, []int64{500}) 193 staking.EndBlocker(ctx, sk) 194 params := getQueriedParams(t, ctx, cdc, querier) 195 196 // submit 3 proposals 197 content := types.NewTextProposal("Test", "description") 198 proposal1, err := keeper.SubmitProposal(ctx, content) 199 require.Nil(t, err) 200 proposalID1 := proposal1.ProposalID 201 err = keeper.AddDeposit(ctx, proposalID1, Addrs[0], 202 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 203 require.Nil(t, err) 204 205 content = types.NewTextProposal("Test", "description") 206 proposal2, err := keeper.SubmitProposal(ctx, content) 207 require.Nil(t, err) 208 proposalID2 := proposal2.ProposalID 209 err = keeper.AddDeposit(ctx, proposalID2, Addrs[0], 210 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 211 require.Nil(t, err) 212 213 content = types.NewTextProposal("Test", "description") 214 proposal3, err := keeper.SubmitProposal(ctx, content) 215 require.Nil(t, err) 216 proposalID3 := proposal3.ProposalID 217 err = keeper.AddDeposit(ctx, proposalID3, Addrs[1], 218 sdk.SysCoins{sdk.NewInt64DecCoin(sdk.DefaultBondDenom, 10)}, "") 219 require.Nil(t, err) 220 221 // Addrs[1] deposits on proposals #2 & #3 222 err = keeper.AddDeposit(ctx, proposalID2, Addrs[1], params.DepositParams.MinDeposit, "") 223 require.Nil(t, err) 224 err = keeper.AddDeposit(ctx, proposalID3, Addrs[1], params.DepositParams.MinDeposit, "") 225 require.Nil(t, err) 226 227 // only Addrs[0] deposits on proposalID1 initially 228 deposits := getQueriedDeposits(t, ctx, cdc, querier, proposalID1) 229 require.Len(t, deposits, 1) 230 deposit := getQueriedDeposit(t, ctx, cdc, querier, proposalID1, Addrs[0]) 231 require.Equal(t, deposit, deposits[0]) 232 233 // Addrs[0] initially deposits on proposalID2 and Addrs[1] deposits on proposalID2 later 234 deposits = getQueriedDeposits(t, ctx, cdc, querier, proposalID2) 235 require.Len(t, deposits, 2) 236 deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID2, Addrs[0]) 237 require.True(t, deposit.Equals(deposits[0])) 238 deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID2, Addrs[1]) 239 require.True(t, deposit.Equals(deposits[1])) 240 241 // only Addrs[1] deposits on proposalID1 initially 242 deposits = getQueriedDeposits(t, ctx, cdc, querier, proposalID3) 243 require.Len(t, deposits, 1) 244 deposit = getQueriedDeposit(t, ctx, cdc, querier, proposalID3, Addrs[1]) 245 require.Equal(t, deposit.String(), deposits[0].String()) 246 247 // only proposal #1 should be in Deposit Period 248 proposals := getQueriedProposals(t, ctx, cdc, querier, nil, nil, types.StatusDepositPeriod, 0) 249 require.Len(t, proposals, 1) 250 require.Equal(t, proposalID1, proposals[0].ProposalID) 251 252 // proposals #2 and #3 should be in Voting Period 253 proposals = getQueriedProposals(t, ctx, cdc, querier, nil, nil, types.StatusVotingPeriod, 0) 254 require.Len(t, proposals, 2) 255 require.Equal(t, proposalID2, proposals[0].ProposalID) 256 require.Equal(t, proposalID3, proposals[1].ProposalID) 257 258 // Addrs[0] and Addrs[1] vote on proposal #2 259 err, _ = keeper.AddVote(ctx, proposalID2, Addrs[0], types.OptionYes) 260 require.Nil(t, err) 261 err, _ = keeper.AddVote(ctx, proposalID2, Addrs[1], types.OptionYes) 262 require.Nil(t, err) 263 264 // Addrs[0] and Addrs[1] votes on proposal #3 265 err, _ = keeper.AddVote(ctx, proposalID3, Addrs[0], types.OptionYes) 266 require.Nil(t, err) 267 err, _ = keeper.AddVote(ctx, proposalID3, Addrs[1], types.OptionYes) 268 require.Nil(t, err) 269 270 // Test query voted by Addrs[0] 271 proposals = getQueriedProposals(t, ctx, cdc, querier, nil, Addrs[0], types.StatusNil, 0) 272 require.Equal(t, 2, len(proposals)) 273 require.Equal(t, proposalID2, (proposals[0]).ProposalID) 274 275 // Test query votes on Proposal 2 276 votes := getQueriedVotes(t, ctx, cdc, querier, proposalID2) 277 require.Len(t, votes, 2) 278 279 // Test query votes on Proposal 3 280 votes = getQueriedVotes(t, ctx, cdc, querier, proposalID3) 281 require.Len(t, votes, 2) 282 require.True(t, Addrs[0].String() == votes[0].Voter.String()) 283 require.True(t, Addrs[1].String() == votes[1].Voter.String()) 284 vote := getQueriedVote(t, ctx, cdc, querier, proposalID3, Addrs[0]) 285 require.Equal(t, vote, votes[0]) 286 287 // Test proposals queries with filters 288 289 // Test query all proposals 290 proposals = getQueriedProposals(t, ctx, cdc, querier, nil, nil, types.StatusNil, 0) 291 require.Equal(t, proposalID1, (proposals[0]).ProposalID) 292 require.Equal(t, proposalID2, (proposals[1]).ProposalID) 293 require.Equal(t, proposalID3, (proposals[2]).ProposalID) 294 295 // Test query voted by Addrs[1] 296 proposals = getQueriedProposals(t, ctx, cdc, querier, nil, Addrs[1], types.StatusNil, 0) 297 require.Equal(t, proposalID2, (proposals[0]).ProposalID) 298 299 // Test query deposited by Addrs[0] 300 proposals = getQueriedProposals(t, ctx, cdc, querier, Addrs[0], nil, types.StatusNil, 0) 301 require.Equal(t, proposalID1, (proposals[0]).ProposalID) 302 303 // Test query deposited by Addrs[1] 304 proposals = getQueriedProposals(t, ctx, cdc, querier, Addrs[1], nil, types.StatusNil, 0) 305 require.Len(t, proposals, 2) 306 require.Equal(t, proposalID3, (proposals[1]).ProposalID) 307 308 // Test Tally Query 309 status, dist, tallyResults := Tally(ctx, keeper, proposal2, true) 310 require.True(t, dist) 311 require.Equal(t, types.StatusRejected, status) 312 proposal2.FinalTallyResult = tallyResults 313 keeper.SetProposal(ctx, proposal2) 314 tally := getQueriedTally(t, ctx, cdc, querier, proposalID2) 315 require.Equal(t, tallyResults, tally) 316 317 bz, err := querier(ctx, []string{""}, abci.RequestQuery{}) 318 require.NotNil(t, err) 319 require.Nil(t, bz) 320 } 321 322 func TestQueryTally(t *testing.T) { 323 ctx, _, keeper, sk, _ := CreateTestInput(t, false, 100000) 324 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 325 require.Nil(t, err) 326 ctx.SetLogger(log) 327 querier := NewQuerier(keeper) 328 cdc := keeper.Cdc() 329 330 ctx.SetBlockHeight(int64(sk.GetEpoch(ctx))) 331 stakingHandler := staking.NewHandler(sk) 332 valAddrs := make([]sdk.ValAddress, len(Addrs[:2])) 333 for i, addr := range Addrs[:2] { 334 valAddrs[i] = sdk.ValAddress(addr) 335 } 336 CreateValidators(t, stakingHandler, ctx, valAddrs, []int64{5, 5}) 337 staking.EndBlocker(ctx, sk) 338 339 content := types.NewTextProposal("Test", "description") 340 proposal, err := keeper.SubmitProposal(ctx, content) 341 require.Nil(t, err) 342 proposal.Status = types.StatusVotingPeriod 343 keeper.SetProposal(ctx, proposal) 344 345 err, _ = keeper.AddVote(ctx, proposal.ProposalID, Addrs[0], types.OptionYes) 346 require.Nil(t, err) 347 348 // no query params 349 query := abci.RequestQuery{ 350 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryTally}, "/"), 351 Data: nil, 352 } 353 bz, err := querier(ctx, []string{types.QueryTally}, query) 354 require.NotNil(t, err) 355 require.Nil(t, bz) 356 357 // query proposal whose ID is 0 358 query = abci.RequestQuery{ 359 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryTally}, "/"), 360 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(0)), 361 } 362 bz, err = querier(ctx, []string{types.QueryTally}, query) 363 require.NotNil(t, err) 364 require.Nil(t, bz) 365 366 expectedTally := newTallyResult(t, "1", "1", "0.0", "0.0", "0.0", "2") 367 require.Equal(t, expectedTally, getQueriedTally(t, ctx, cdc, querier, proposal.ProposalID)) 368 369 // proposal passed 370 proposal.Status = types.StatusPassed 371 proposal.FinalTallyResult = expectedTally 372 keeper.SetProposal(ctx, proposal) 373 require.Equal(t, expectedTally, getQueriedTally(t, ctx, cdc, querier, proposal.ProposalID)) 374 } 375 376 func TestQueryParams(t *testing.T) { 377 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 378 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 379 require.Nil(t, err) 380 ctx.SetLogger(log) 381 querier := NewQuerier(keeper) 382 383 query := abci.RequestQuery{ 384 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryParams, "test"}, "/"), 385 Data: []byte{}, 386 } 387 388 bz, err := querier(ctx, []string{types.QueryParams, "test"}, query) 389 require.NotNil(t, err) 390 require.Nil(t, bz) 391 } 392 393 func TestQueryVotes(t *testing.T) { 394 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 395 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 396 require.Nil(t, err) 397 ctx.SetLogger(log) 398 querier := NewQuerier(keeper) 399 400 query := abci.RequestQuery{ 401 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryVotes}, "/"), 402 Data: nil, 403 } 404 405 bz, err := querier(ctx, []string{types.QueryVotes}, query) 406 require.NotNil(t, err) 407 require.Nil(t, bz) 408 } 409 410 func TestQueryVote(t *testing.T) { 411 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 412 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 413 require.Nil(t, err) 414 ctx.SetLogger(log) 415 querier := NewQuerier(keeper) 416 417 query := abci.RequestQuery{ 418 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryVote}, "/"), 419 Data: nil, 420 } 421 422 bz, err := querier(ctx, []string{types.QueryVote}, query) 423 require.NotNil(t, err) 424 require.Nil(t, bz) 425 } 426 427 func TestQueryDeposits(t *testing.T) { 428 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 429 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 430 require.Nil(t, err) 431 ctx.SetLogger(log) 432 querier := NewQuerier(keeper) 433 434 query := abci.RequestQuery{ 435 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDeposits}, "/"), 436 Data: nil, 437 } 438 439 bz, err := querier(ctx, []string{types.QueryDeposits}, query) 440 require.NotNil(t, err) 441 require.Nil(t, bz) 442 } 443 444 func TestQueryDeposit(t *testing.T) { 445 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 446 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 447 require.Nil(t, err) 448 ctx.SetLogger(log) 449 querier := NewQuerier(keeper) 450 451 query := abci.RequestQuery{ 452 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryDeposit}, "/"), 453 Data: nil, 454 } 455 bz, err := querier(ctx, []string{types.QueryDeposit}, query) 456 require.NotNil(t, err) 457 require.Nil(t, bz) 458 } 459 460 func TestQueryProposal(t *testing.T) { 461 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 462 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 463 require.Nil(t, err) 464 ctx.SetLogger(log) 465 querier := NewQuerier(keeper) 466 cdc := keeper.Cdc() 467 468 content := types.NewTextProposal("Test", "description") 469 proposal1, err := keeper.SubmitProposal(ctx, content) 470 require.Nil(t, err) 471 472 // no query params 473 query := abci.RequestQuery{ 474 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryProposal}, "/"), 475 Data: nil, 476 } 477 bz, err := querier(ctx, []string{types.QueryProposal}, query) 478 require.NotNil(t, err) 479 require.Nil(t, bz) 480 481 // query proposal whose ID is 0 482 query = abci.RequestQuery{ 483 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryProposal}, "/"), 484 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(0)), 485 } 486 bz, err = querier(ctx, []string{types.QueryProposal}, query) 487 require.NotNil(t, err) 488 require.Nil(t, bz) 489 490 query = abci.RequestQuery{ 491 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryProposal}, "/"), 492 Data: cdc.MustMarshalJSON(types.NewQueryProposalParams(1)), 493 } 494 var queriedProposal types.Proposal 495 bz, err = querier(ctx, []string{types.QueryProposal}, query) 496 require.Nil(t, err) 497 cdc.MustUnmarshalJSON(bz, &queriedProposal) 498 require.Equal(t, proposal1.ProposalID, queriedProposal.ProposalID) 499 } 500 501 func TestQueryProposals(t *testing.T) { 502 ctx, _, keeper, _, _ := CreateTestInput(t, false, 1000) 503 log, err := flags.ParseLogLevel("*:error", ctx.Logger(), "error") 504 require.Nil(t, err) 505 ctx.SetLogger(log) 506 querier := NewQuerier(keeper) 507 508 // no query params 509 query := abci.RequestQuery{ 510 Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryProposals}, "/"), 511 Data: nil, 512 } 513 bz, err := querier(ctx, []string{types.QueryProposals}, query) 514 require.NotNil(t, err) 515 require.Nil(t, bz) 516 }