github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/keeper/grpc_query_test.go (about) 1 package keeper_test 2 3 import ( 4 gocontext "context" 5 "fmt" 6 "time" 7 8 "cosmossdk.io/math" 9 10 "github.com/cosmos/cosmos-sdk/codec/address" 11 simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" 12 sdk "github.com/cosmos/cosmos-sdk/types" 13 "github.com/cosmos/cosmos-sdk/types/query" 14 v3 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3" 15 v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 16 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 17 ) 18 19 func (suite *KeeperTestSuite) TestGRPCQueryProposal() { 20 suite.reset() 21 ctx, queryClient, addrs := suite.ctx, suite.queryClient, suite.addrs 22 23 var ( 24 req *v1.QueryProposalRequest 25 expProposal v1.Proposal 26 ) 27 28 testCases := []struct { 29 msg string 30 malleate func() 31 expPass bool 32 }{ 33 { 34 "empty request", 35 func() { 36 req = &v1.QueryProposalRequest{} 37 }, 38 false, 39 }, 40 { 41 "non existing proposal request", 42 func() { 43 req = &v1.QueryProposalRequest{ProposalId: 2} 44 }, 45 false, 46 }, 47 { 48 "zero proposal id request", 49 func() { 50 req = &v1.QueryProposalRequest{ProposalId: 0} 51 }, 52 false, 53 }, 54 { 55 "valid request", 56 func() { 57 req = &v1.QueryProposalRequest{ProposalId: 1} 58 testProposal := v1beta1.NewTextProposal("Proposal", "testing proposal") 59 msgContent, err := v1.NewLegacyContent(testProposal, govAcct.String()) 60 suite.Require().NoError(err) 61 submittedProposal, err := suite.govKeeper.SubmitProposal(ctx, []sdk.Msg{msgContent}, "", "title", "summary", addrs[0], false) 62 suite.Require().NoError(err) 63 suite.Require().NotEmpty(submittedProposal) 64 65 expProposal = submittedProposal 66 }, 67 true, 68 }, 69 } 70 71 for _, testCase := range testCases { 72 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 73 testCase.malleate() 74 75 proposalRes, err := queryClient.Proposal(gocontext.Background(), req) 76 77 if testCase.expPass { 78 suite.Require().NoError(err) 79 suite.Require().NotEmpty(proposalRes.Proposal.String()) 80 suite.Require().Equal(proposalRes.Proposal.String(), expProposal.String()) 81 } else { 82 suite.Require().Error(err) 83 suite.Require().Nil(proposalRes) 84 } 85 }) 86 } 87 } 88 89 func (suite *KeeperTestSuite) TestGRPCQueryConstitution() { 90 suite.reset() 91 queryClient := suite.queryClient 92 93 expRes := &v1.QueryConstitutionResponse{Constitution: "constitution"} 94 95 constitution, err := queryClient.Constitution(gocontext.Background(), &v1.QueryConstitutionRequest{}) 96 suite.Require().NoError(err) 97 suite.Require().Equal(expRes, constitution) 98 } 99 100 func (suite *KeeperTestSuite) TestLegacyGRPCQueryProposal() { 101 suite.reset() 102 ctx, queryClient, addrs := suite.ctx, suite.legacyQueryClient, suite.addrs 103 104 var ( 105 req *v1beta1.QueryProposalRequest 106 expProposal v1beta1.Proposal 107 ) 108 109 testCases := []struct { 110 msg string 111 malleate func() 112 expPass bool 113 }{ 114 { 115 "empty request", 116 func() { 117 req = &v1beta1.QueryProposalRequest{} 118 }, 119 false, 120 }, 121 { 122 "non existing proposal request", 123 func() { 124 req = &v1beta1.QueryProposalRequest{ProposalId: 3} 125 }, 126 false, 127 }, 128 { 129 "zero proposal id request", 130 func() { 131 req = &v1beta1.QueryProposalRequest{ProposalId: 0} 132 }, 133 false, 134 }, 135 { 136 "valid request", 137 func() { 138 req = &v1beta1.QueryProposalRequest{ProposalId: 1} 139 testProposal := v1beta1.NewTextProposal("Proposal", "testing proposal") 140 msgContent, err := v1.NewLegacyContent(testProposal, govAcct.String()) 141 suite.Require().NoError(err) 142 submittedProposal, err := suite.govKeeper.SubmitProposal(ctx, []sdk.Msg{msgContent}, "", "title", "summary", addrs[0], false) 143 suite.Require().NoError(err) 144 suite.Require().NotEmpty(submittedProposal) 145 146 expProposal, err = v3.ConvertToLegacyProposal(submittedProposal) 147 suite.Require().NoError(err) 148 }, 149 true, 150 }, 151 { 152 "valid request - expedited", 153 func() { 154 req = &v1beta1.QueryProposalRequest{ProposalId: 2} 155 testProposal := v1beta1.NewTextProposal("Proposal", "testing proposal") 156 msgContent, err := v1.NewLegacyContent(testProposal, govAcct.String()) 157 suite.Require().NoError(err) 158 submittedProposal, err := suite.govKeeper.SubmitProposal(ctx, []sdk.Msg{msgContent}, "", "title", "summary", addrs[0], true) 159 suite.Require().NoError(err) 160 suite.Require().NotEmpty(submittedProposal) 161 162 expProposal, err = v3.ConvertToLegacyProposal(submittedProposal) 163 suite.Require().NoError(err) 164 }, 165 true, 166 }, 167 } 168 169 for _, testCase := range testCases { 170 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 171 testCase.malleate() 172 173 proposalRes, err := queryClient.Proposal(gocontext.Background(), req) 174 175 if testCase.expPass { 176 suite.Require().NoError(err) 177 suite.Require().NotEmpty(proposalRes.Proposal.String()) 178 suite.Require().Equal(proposalRes.Proposal.String(), expProposal.String()) 179 } else { 180 suite.Require().Error(err) 181 suite.Require().Nil(proposalRes) 182 } 183 }) 184 } 185 } 186 187 func (suite *KeeperTestSuite) TestGRPCQueryProposals() { 188 suite.reset() 189 ctx, queryClient, addrs := suite.ctx, suite.queryClient, suite.addrs 190 191 testProposals := []*v1.Proposal{} 192 193 var ( 194 req *v1.QueryProposalsRequest 195 expRes *v1.QueryProposalsResponse 196 ) 197 198 testCases := []struct { 199 msg string 200 malleate func() 201 expPass bool 202 }{ 203 { 204 "empty state request", 205 func() { 206 req = &v1.QueryProposalsRequest{} 207 }, 208 true, 209 }, 210 { 211 "request proposals with limit 3", 212 func() { 213 // create 5 test proposals 214 for i := 0; i < 5; i++ { 215 govAddress := suite.govKeeper.GetGovernanceAccount(suite.ctx).GetAddress() 216 testProposal := []sdk.Msg{ 217 v1.NewMsgVote(govAddress, uint64(i), v1.OptionYes, ""), 218 } 219 proposal, err := suite.govKeeper.SubmitProposal(ctx, testProposal, "", "title", "summary", addrs[0], false) 220 suite.Require().NotEmpty(proposal) 221 suite.Require().NoError(err) 222 testProposals = append(testProposals, &proposal) 223 } 224 225 req = &v1.QueryProposalsRequest{ 226 Pagination: &query.PageRequest{Limit: 3}, 227 } 228 229 expRes = &v1.QueryProposalsResponse{ 230 Proposals: testProposals[:3], 231 } 232 }, 233 true, 234 }, 235 { 236 "request 2nd page with limit 3", 237 func() { 238 req = &v1.QueryProposalsRequest{ 239 Pagination: &query.PageRequest{Offset: 3, Limit: 3}, 240 } 241 242 expRes = &v1.QueryProposalsResponse{ 243 Proposals: testProposals[3:], 244 } 245 }, 246 true, 247 }, 248 { 249 "request with limit 2 and count true", 250 func() { 251 req = &v1.QueryProposalsRequest{ 252 Pagination: &query.PageRequest{Limit: 2, CountTotal: true}, 253 } 254 255 expRes = &v1.QueryProposalsResponse{ 256 Proposals: testProposals[:2], 257 } 258 }, 259 true, 260 }, 261 { 262 "request with filter of status deposit period", 263 func() { 264 req = &v1.QueryProposalsRequest{ 265 ProposalStatus: v1.StatusDepositPeriod, 266 } 267 268 expRes = &v1.QueryProposalsResponse{ 269 Proposals: testProposals, 270 } 271 }, 272 true, 273 }, 274 { 275 "request with filter of deposit address", 276 func() { 277 depositCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 20))) 278 deposit := v1.NewDeposit(testProposals[0].Id, addrs[0], depositCoins) 279 suite.govKeeper.SetDeposit(ctx, deposit) 280 281 req = &v1.QueryProposalsRequest{ 282 Depositor: addrs[0].String(), 283 } 284 285 expRes = &v1.QueryProposalsResponse{ 286 Proposals: testProposals[:1], 287 } 288 }, 289 true, 290 }, 291 { 292 "request with filter of deposit address", 293 func() { 294 testProposals[1].Status = v1.StatusVotingPeriod 295 suite.govKeeper.SetProposal(ctx, *testProposals[1]) 296 suite.Require().NoError(suite.govKeeper.AddVote(ctx, testProposals[1].Id, addrs[0], v1.NewNonSplitVoteOption(v1.OptionAbstain), "")) 297 298 req = &v1.QueryProposalsRequest{ 299 Voter: addrs[0].String(), 300 } 301 302 expRes = &v1.QueryProposalsResponse{ 303 Proposals: testProposals[1:2], 304 } 305 }, 306 true, 307 }, 308 { 309 "request with filter of status voting period", 310 func() { 311 req = &v1.QueryProposalsRequest{ 312 ProposalStatus: v1.StatusVotingPeriod, 313 } 314 315 var proposals []*v1.Proposal 316 for i := 0; i < len(testProposals); i++ { 317 if testProposals[i].GetStatus() == v1.StatusVotingPeriod { 318 proposals = append(proposals, testProposals[i]) 319 } 320 } 321 322 expRes = &v1.QueryProposalsResponse{ 323 Proposals: proposals, 324 } 325 }, 326 true, 327 }, 328 { 329 "request with filter of status deposit period", 330 func() { 331 req = &v1.QueryProposalsRequest{ 332 ProposalStatus: v1.StatusDepositPeriod, 333 } 334 335 var proposals []*v1.Proposal 336 for i := 0; i < len(testProposals); i++ { 337 if testProposals[i].GetStatus() == v1.StatusDepositPeriod { 338 proposals = append(proposals, testProposals[i]) 339 } 340 } 341 342 expRes = &v1.QueryProposalsResponse{ 343 Proposals: proposals, 344 } 345 }, 346 true, 347 }, 348 { 349 "request with filter of status deposit period with limit 2", 350 func() { 351 req = &v1.QueryProposalsRequest{ 352 ProposalStatus: v1.StatusDepositPeriod, 353 Pagination: &query.PageRequest{ 354 Limit: 2, 355 CountTotal: true, 356 }, 357 } 358 359 var proposals []*v1.Proposal 360 for i := 0; i < len(testProposals) && len(proposals) < 2; i++ { 361 if testProposals[i].GetStatus() == v1.StatusDepositPeriod { 362 proposals = append(proposals, testProposals[i]) 363 } 364 } 365 366 expRes = &v1.QueryProposalsResponse{ 367 Proposals: proposals, 368 } 369 }, 370 true, 371 }, 372 } 373 374 for _, testCase := range testCases { 375 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 376 testCase.malleate() 377 378 proposals, err := queryClient.Proposals(gocontext.Background(), req) 379 380 if testCase.expPass { 381 suite.Require().NoError(err) 382 383 suite.Require().Len(proposals.GetProposals(), len(expRes.GetProposals())) 384 for i := 0; i < len(proposals.GetProposals()); i++ { 385 suite.Require().NoError(err) 386 suite.Require().NotEmpty(proposals.GetProposals()[i]) 387 suite.Require().Equal(expRes.GetProposals()[i].String(), proposals.GetProposals()[i].String()) 388 } 389 390 } else { 391 suite.Require().Error(err) 392 suite.Require().Nil(proposals) 393 } 394 }) 395 } 396 } 397 398 func (suite *KeeperTestSuite) TestLegacyGRPCQueryProposals() { 399 suite.reset() 400 ctx, queryClient, addrs := suite.ctx, suite.legacyQueryClient, suite.addrs 401 402 var req *v1beta1.QueryProposalsRequest 403 404 testCases := []struct { 405 msg string 406 malleate func() 407 expPass bool 408 }{ 409 { 410 "valid request", 411 func() { 412 req = &v1beta1.QueryProposalsRequest{} 413 testProposal := v1beta1.NewTextProposal("Proposal", "testing proposal") 414 msgContent, err := v1.NewLegacyContent(testProposal, govAcct.String()) 415 suite.Require().NoError(err) 416 submittedProposal, err := suite.govKeeper.SubmitProposal(ctx, []sdk.Msg{msgContent}, "", "title", "summary", addrs[0], false) 417 suite.Require().NoError(err) 418 suite.Require().NotEmpty(submittedProposal) 419 }, 420 true, 421 }, 422 } 423 424 for _, testCase := range testCases { 425 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 426 testCase.malleate() 427 428 proposalRes, err := queryClient.Proposals(gocontext.Background(), req) 429 430 if testCase.expPass { 431 suite.Require().NoError(err) 432 suite.Require().NotNil(proposalRes.Proposals) 433 suite.Require().Equal(len(proposalRes.Proposals), 1) 434 } else { 435 suite.Require().Error(err) 436 suite.Require().Nil(proposalRes) 437 } 438 }) 439 } 440 } 441 442 func (suite *KeeperTestSuite) TestGRPCQueryVote() { 443 ctx, queryClient, addrs := suite.ctx, suite.queryClient, suite.addrs 444 445 var ( 446 req *v1.QueryVoteRequest 447 expRes *v1.QueryVoteResponse 448 proposal v1.Proposal 449 ) 450 451 testCases := []struct { 452 msg string 453 malleate func() 454 expPass bool 455 }{ 456 { 457 "empty request", 458 func() { 459 req = &v1.QueryVoteRequest{} 460 }, 461 false, 462 }, 463 { 464 "zero proposal id request", 465 func() { 466 req = &v1.QueryVoteRequest{ 467 ProposalId: 0, 468 Voter: addrs[0].String(), 469 } 470 }, 471 false, 472 }, 473 { 474 "empty voter request", 475 func() { 476 req = &v1.QueryVoteRequest{ 477 ProposalId: 1, 478 Voter: "", 479 } 480 }, 481 false, 482 }, 483 { 484 "non existed proposal", 485 func() { 486 req = &v1.QueryVoteRequest{ 487 ProposalId: 3, 488 Voter: addrs[0].String(), 489 } 490 }, 491 false, 492 }, 493 { 494 "no votes present", 495 func() { 496 var err error 497 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 498 suite.Require().NoError(err) 499 500 req = &v1.QueryVoteRequest{ 501 ProposalId: proposal.Id, 502 Voter: addrs[0].String(), 503 } 504 505 expRes = &v1.QueryVoteResponse{} 506 }, 507 false, 508 }, 509 { 510 "valid request", 511 func() { 512 proposal.Status = v1.StatusVotingPeriod 513 suite.govKeeper.SetProposal(ctx, proposal) 514 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, addrs[0], v1.NewNonSplitVoteOption(v1.OptionAbstain), "")) 515 516 req = &v1.QueryVoteRequest{ 517 ProposalId: proposal.Id, 518 Voter: addrs[0].String(), 519 } 520 521 expRes = &v1.QueryVoteResponse{Vote: &v1.Vote{ProposalId: proposal.Id, Voter: addrs[0].String(), Options: []*v1.WeightedVoteOption{{Option: v1.OptionAbstain, Weight: math.LegacyMustNewDecFromStr("1.0").String()}}}} 522 }, 523 true, 524 }, 525 { 526 "wrong voter id request", 527 func() { 528 req = &v1.QueryVoteRequest{ 529 ProposalId: proposal.Id, 530 Voter: addrs[1].String(), 531 } 532 533 expRes = &v1.QueryVoteResponse{} 534 }, 535 false, 536 }, 537 } 538 539 for _, testCase := range testCases { 540 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 541 testCase.malleate() 542 543 vote, err := queryClient.Vote(gocontext.Background(), req) 544 545 if testCase.expPass { 546 suite.Require().NoError(err) 547 suite.Require().Equal(expRes, vote) 548 } else { 549 suite.Require().Error(err) 550 suite.Require().Nil(vote) 551 } 552 }) 553 } 554 } 555 556 func (suite *KeeperTestSuite) TestLegacyGRPCQueryVote() { 557 ctx, queryClient, addrs := suite.ctx, suite.legacyQueryClient, suite.addrs 558 559 var ( 560 req *v1beta1.QueryVoteRequest 561 expRes *v1beta1.QueryVoteResponse 562 proposal v1.Proposal 563 ) 564 565 testCases := []struct { 566 msg string 567 malleate func() 568 expPass bool 569 }{ 570 { 571 "empty request", 572 func() { 573 req = &v1beta1.QueryVoteRequest{} 574 }, 575 false, 576 }, 577 { 578 "zero proposal id request", 579 func() { 580 req = &v1beta1.QueryVoteRequest{ 581 ProposalId: 0, 582 Voter: addrs[0].String(), 583 } 584 }, 585 false, 586 }, 587 { 588 "empty voter request", 589 func() { 590 req = &v1beta1.QueryVoteRequest{ 591 ProposalId: 1, 592 Voter: "", 593 } 594 }, 595 false, 596 }, 597 { 598 "non existed proposal", 599 func() { 600 req = &v1beta1.QueryVoteRequest{ 601 ProposalId: 3, 602 Voter: addrs[0].String(), 603 } 604 }, 605 false, 606 }, 607 { 608 "no votes present", 609 func() { 610 var err error 611 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 612 suite.Require().NoError(err) 613 614 req = &v1beta1.QueryVoteRequest{ 615 ProposalId: proposal.Id, 616 Voter: addrs[0].String(), 617 } 618 619 expRes = &v1beta1.QueryVoteResponse{} 620 }, 621 false, 622 }, 623 { 624 "valid request", 625 func() { 626 proposal.Status = v1.StatusVotingPeriod 627 suite.govKeeper.SetProposal(ctx, proposal) 628 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, addrs[0], v1.NewNonSplitVoteOption(v1.OptionAbstain), "")) 629 630 req = &v1beta1.QueryVoteRequest{ 631 ProposalId: proposal.Id, 632 Voter: addrs[0].String(), 633 } 634 635 expRes = &v1beta1.QueryVoteResponse{Vote: v1beta1.Vote{ProposalId: proposal.Id, Voter: addrs[0].String(), Options: []v1beta1.WeightedVoteOption{{Option: v1beta1.OptionAbstain, Weight: math.LegacyMustNewDecFromStr("1.0")}}}} 636 }, 637 true, 638 }, 639 { 640 "wrong voter id request", 641 func() { 642 req = &v1beta1.QueryVoteRequest{ 643 ProposalId: proposal.Id, 644 Voter: addrs[1].String(), 645 } 646 647 expRes = &v1beta1.QueryVoteResponse{} 648 }, 649 false, 650 }, 651 } 652 653 for _, testCase := range testCases { 654 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 655 testCase.malleate() 656 657 vote, err := queryClient.Vote(gocontext.Background(), req) 658 659 if testCase.expPass { 660 suite.Require().NoError(err) 661 suite.Require().Equal(expRes, vote) 662 } else { 663 suite.Require().Error(err) 664 suite.Require().Nil(vote) 665 } 666 }) 667 } 668 } 669 670 func (suite *KeeperTestSuite) TestGRPCQueryVotes() { 671 suite.reset() 672 ctx, queryClient := suite.ctx, suite.queryClient 673 674 addrs := simtestutil.AddTestAddrsIncremental(suite.bankKeeper, suite.stakingKeeper, ctx, 2, math.NewInt(30000000)) 675 676 var ( 677 req *v1.QueryVotesRequest 678 expRes *v1.QueryVotesResponse 679 proposal v1.Proposal 680 votes v1.Votes 681 ) 682 683 testCases := []struct { 684 msg string 685 malleate func() 686 expPass bool 687 }{ 688 { 689 "empty request", 690 func() { 691 req = &v1.QueryVotesRequest{} 692 }, 693 false, 694 }, 695 { 696 "zero proposal id request", 697 func() { 698 req = &v1.QueryVotesRequest{ 699 ProposalId: 0, 700 } 701 }, 702 false, 703 }, 704 { 705 "non existed proposals", 706 func() { 707 req = &v1.QueryVotesRequest{ 708 ProposalId: 2, 709 } 710 }, 711 true, 712 }, 713 { 714 "create a proposal and get votes", 715 func() { 716 var err error 717 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 718 suite.Require().NoError(err) 719 720 req = &v1.QueryVotesRequest{ 721 ProposalId: proposal.Id, 722 } 723 }, 724 true, 725 }, 726 { 727 "request after adding 2 votes", 728 func() { 729 proposal.Status = v1.StatusVotingPeriod 730 suite.govKeeper.SetProposal(ctx, proposal) 731 732 votes = []*v1.Vote{ 733 {ProposalId: proposal.Id, Voter: addrs[0].String(), Options: v1.NewNonSplitVoteOption(v1.OptionAbstain)}, 734 {ProposalId: proposal.Id, Voter: addrs[1].String(), Options: v1.NewNonSplitVoteOption(v1.OptionYes)}, 735 } 736 737 codec := address.NewBech32Codec("cosmos") 738 accAddr1, err1 := codec.StringToBytes(votes[0].Voter) 739 accAddr2, err2 := codec.StringToBytes(votes[1].Voter) 740 suite.Require().NoError(err1) 741 suite.Require().NoError(err2) 742 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr1, votes[0].Options, "")) 743 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr2, votes[1].Options, "")) 744 745 req = &v1.QueryVotesRequest{ 746 ProposalId: proposal.Id, 747 } 748 749 expRes = &v1.QueryVotesResponse{ 750 Votes: votes, 751 } 752 }, 753 true, 754 }, 755 } 756 757 for _, testCase := range testCases { 758 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 759 testCase.malleate() 760 761 votes, err := queryClient.Votes(gocontext.Background(), req) 762 763 if testCase.expPass { 764 suite.Require().NoError(err) 765 suite.Require().Equal(expRes.GetVotes(), votes.GetVotes()) 766 } else { 767 suite.Require().Error(err) 768 suite.Require().Nil(votes) 769 } 770 }) 771 } 772 } 773 774 func (suite *KeeperTestSuite) TestLegacyGRPCQueryVotes() { 775 suite.reset() 776 ctx, queryClient := suite.ctx, suite.legacyQueryClient 777 778 addrs := simtestutil.AddTestAddrsIncremental(suite.bankKeeper, suite.stakingKeeper, ctx, 2, math.NewInt(30000000)) 779 780 var ( 781 req *v1beta1.QueryVotesRequest 782 expRes *v1beta1.QueryVotesResponse 783 proposal v1.Proposal 784 votes v1beta1.Votes 785 ) 786 787 testCases := []struct { 788 msg string 789 malleate func() 790 expPass bool 791 }{ 792 { 793 "empty request", 794 func() { 795 req = &v1beta1.QueryVotesRequest{} 796 }, 797 false, 798 }, 799 { 800 "zero proposal id request", 801 func() { 802 req = &v1beta1.QueryVotesRequest{ 803 ProposalId: 0, 804 } 805 }, 806 false, 807 }, 808 { 809 "non existed proposals", 810 func() { 811 req = &v1beta1.QueryVotesRequest{ 812 ProposalId: 2, 813 } 814 }, 815 true, 816 }, 817 { 818 "create a proposal and get votes", 819 func() { 820 var err error 821 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 822 suite.Require().NoError(err) 823 824 req = &v1beta1.QueryVotesRequest{ 825 ProposalId: proposal.Id, 826 } 827 }, 828 true, 829 }, 830 { 831 "request after adding 2 votes", 832 func() { 833 proposal.Status = v1.StatusVotingPeriod 834 suite.govKeeper.SetProposal(ctx, proposal) 835 836 votes = []v1beta1.Vote{ 837 {ProposalId: proposal.Id, Voter: addrs[0].String(), Options: v1beta1.NewNonSplitVoteOption(v1beta1.OptionAbstain)}, 838 {ProposalId: proposal.Id, Voter: addrs[1].String(), Options: v1beta1.NewNonSplitVoteOption(v1beta1.OptionYes)}, 839 } 840 codec := address.NewBech32Codec("cosmos") 841 842 accAddr1, err1 := codec.StringToBytes(votes[0].Voter) 843 accAddr2, err2 := codec.StringToBytes(votes[1].Voter) 844 suite.Require().NoError(err1) 845 suite.Require().NoError(err2) 846 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr1, v1.NewNonSplitVoteOption(v1.OptionAbstain), "")) 847 suite.Require().NoError(suite.govKeeper.AddVote(ctx, proposal.Id, accAddr2, v1.NewNonSplitVoteOption(v1.OptionYes), "")) 848 849 req = &v1beta1.QueryVotesRequest{ 850 ProposalId: proposal.Id, 851 } 852 853 expRes = &v1beta1.QueryVotesResponse{ 854 Votes: votes, 855 } 856 }, 857 true, 858 }, 859 } 860 861 for _, testCase := range testCases { 862 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 863 testCase.malleate() 864 865 votes, err := queryClient.Votes(gocontext.Background(), req) 866 867 if testCase.expPass { 868 suite.Require().NoError(err) 869 suite.Require().Equal(expRes.GetVotes(), votes.GetVotes()) 870 } else { 871 suite.Require().Error(err) 872 suite.Require().Nil(votes) 873 } 874 }) 875 } 876 } 877 878 func (suite *KeeperTestSuite) TestGRPCQueryParams() { 879 queryClient := suite.queryClient 880 881 params := v1.DefaultParams() 882 883 var ( 884 req *v1.QueryParamsRequest 885 expRes *v1.QueryParamsResponse 886 ) 887 888 testCases := []struct { 889 msg string 890 malleate func() 891 expPass bool 892 }{ 893 { 894 "empty request (valid and returns all params)", 895 func() { 896 req = &v1.QueryParamsRequest{} 897 }, 898 true, 899 }, 900 { 901 "deposit params request", 902 func() { 903 req = &v1.QueryParamsRequest{ParamsType: v1.ParamDeposit} 904 depositParams := v1.NewDepositParams(params.MinDeposit, params.MaxDepositPeriod) //nolint:staticcheck // SA1019: params.MinDeposit is deprecated: Use MinInitialDeposit instead. 905 expRes = &v1.QueryParamsResponse{ 906 DepositParams: &depositParams, 907 } 908 }, 909 true, 910 }, 911 { 912 "voting params request", 913 func() { 914 req = &v1.QueryParamsRequest{ParamsType: v1.ParamVoting} 915 votingParams := v1.NewVotingParams(params.VotingPeriod) //nolint:staticcheck // SA1019: params.VotingPeriod is deprecated: Use VotingPeriod instead. 916 expRes = &v1.QueryParamsResponse{ 917 VotingParams: &votingParams, 918 } 919 }, 920 true, 921 }, 922 { 923 "tally params request", 924 func() { 925 req = &v1.QueryParamsRequest{ParamsType: v1.ParamTallying} 926 tallyParams := v1.NewTallyParams(params.Quorum, params.Threshold, params.VetoThreshold) //nolint:staticcheck // SA1019: params.Quorum is deprecated: Use Quorum instead. 927 expRes = &v1.QueryParamsResponse{ 928 TallyParams: &tallyParams, 929 } 930 }, 931 true, 932 }, 933 { 934 "invalid request", 935 func() { 936 req = &v1.QueryParamsRequest{ParamsType: "wrongPath"} 937 expRes = &v1.QueryParamsResponse{} 938 }, 939 false, 940 }, 941 } 942 943 for _, testCase := range testCases { 944 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 945 testCase.malleate() 946 947 params, err := queryClient.Params(gocontext.Background(), req) 948 949 if testCase.expPass { 950 suite.Require().NoError(err) 951 suite.Require().Equal(expRes.GetDepositParams(), params.GetDepositParams()) //nolint:staticcheck // SA1019: params.MinDeposit is deprecated: Use MinInitialDeposit instead. 952 suite.Require().Equal(expRes.GetVotingParams(), params.GetVotingParams()) //nolint:staticcheck // SA1019: params.VotingPeriod is deprecated: Use VotingPeriod instead. 953 suite.Require().Equal(expRes.GetTallyParams(), params.GetTallyParams()) //nolint:staticcheck // SA1019: params.Quorum is deprecated: Use Quorum instead. 954 } else { 955 suite.Require().Error(err) 956 suite.Require().Nil(params) 957 } 958 }) 959 } 960 } 961 962 func (suite *KeeperTestSuite) TestLegacyGRPCQueryParams() { 963 queryClient := suite.legacyQueryClient 964 965 var ( 966 req *v1beta1.QueryParamsRequest 967 expRes *v1beta1.QueryParamsResponse 968 ) 969 970 defaultTallyParams := v1beta1.TallyParams{ 971 Quorum: math.LegacyNewDec(0), 972 Threshold: math.LegacyNewDec(0), 973 VetoThreshold: math.LegacyNewDec(0), 974 } 975 976 testCases := []struct { 977 msg string 978 malleate func() 979 expPass bool 980 }{ 981 { 982 "empty request", 983 func() { 984 req = &v1beta1.QueryParamsRequest{} 985 }, 986 false, 987 }, 988 { 989 "deposit params request", 990 func() { 991 req = &v1beta1.QueryParamsRequest{ParamsType: v1beta1.ParamDeposit} 992 depositParams := v1beta1.DefaultDepositParams() 993 expRes = &v1beta1.QueryParamsResponse{ 994 DepositParams: depositParams, 995 TallyParams: defaultTallyParams, 996 } 997 }, 998 true, 999 }, 1000 { 1001 "voting params request", 1002 func() { 1003 req = &v1beta1.QueryParamsRequest{ParamsType: v1beta1.ParamVoting} 1004 votingParams := v1beta1.DefaultVotingParams() 1005 expRes = &v1beta1.QueryParamsResponse{ 1006 VotingParams: votingParams, 1007 TallyParams: defaultTallyParams, 1008 } 1009 }, 1010 true, 1011 }, 1012 { 1013 "tally params request", 1014 func() { 1015 req = &v1beta1.QueryParamsRequest{ParamsType: v1beta1.ParamTallying} 1016 tallyParams := v1beta1.DefaultTallyParams() 1017 expRes = &v1beta1.QueryParamsResponse{ 1018 TallyParams: tallyParams, 1019 } 1020 }, 1021 true, 1022 }, 1023 { 1024 "invalid request", 1025 func() { 1026 req = &v1beta1.QueryParamsRequest{ParamsType: "wrongPath"} 1027 expRes = &v1beta1.QueryParamsResponse{} 1028 }, 1029 false, 1030 }, 1031 } 1032 1033 for _, testCase := range testCases { 1034 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1035 testCase.malleate() 1036 1037 params, err := queryClient.Params(gocontext.Background(), req) 1038 1039 if testCase.expPass { 1040 suite.Require().NoError(err) 1041 suite.Require().Equal(expRes.GetDepositParams(), params.GetDepositParams()) 1042 suite.Require().Equal(expRes.GetVotingParams(), params.GetVotingParams()) 1043 suite.Require().Equal(expRes.GetTallyParams(), params.GetTallyParams()) 1044 } else { 1045 suite.Require().Error(err) 1046 suite.Require().Nil(params) 1047 } 1048 }) 1049 } 1050 } 1051 1052 func (suite *KeeperTestSuite) TestGRPCQueryDeposit() { 1053 suite.reset() 1054 ctx, queryClient, addrs := suite.ctx, suite.queryClient, suite.addrs 1055 1056 var ( 1057 req *v1.QueryDepositRequest 1058 expRes *v1.QueryDepositResponse 1059 proposal v1.Proposal 1060 ) 1061 1062 testCases := []struct { 1063 msg string 1064 malleate func() 1065 expPass bool 1066 }{ 1067 { 1068 "empty request", 1069 func() { 1070 req = &v1.QueryDepositRequest{} 1071 }, 1072 false, 1073 }, 1074 { 1075 "zero proposal id request", 1076 func() { 1077 req = &v1.QueryDepositRequest{ 1078 ProposalId: 0, 1079 Depositor: addrs[0].String(), 1080 } 1081 }, 1082 false, 1083 }, 1084 { 1085 "empty deposit address request", 1086 func() { 1087 req = &v1.QueryDepositRequest{ 1088 ProposalId: 1, 1089 Depositor: "", 1090 } 1091 }, 1092 false, 1093 }, 1094 { 1095 "non existed proposal", 1096 func() { 1097 req = &v1.QueryDepositRequest{ 1098 ProposalId: 2, 1099 Depositor: addrs[0].String(), 1100 } 1101 }, 1102 false, 1103 }, 1104 { 1105 "no deposits proposal", 1106 func() { 1107 var err error 1108 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 1109 suite.Require().NoError(err) 1110 suite.Require().NotNil(proposal) 1111 1112 req = &v1.QueryDepositRequest{ 1113 ProposalId: proposal.Id, 1114 Depositor: addrs[0].String(), 1115 } 1116 }, 1117 false, 1118 }, 1119 { 1120 "valid request", 1121 func() { 1122 depositCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 20))) 1123 deposit := v1.NewDeposit(proposal.Id, addrs[0], depositCoins) 1124 suite.govKeeper.SetDeposit(ctx, deposit) 1125 1126 req = &v1.QueryDepositRequest{ 1127 ProposalId: proposal.Id, 1128 Depositor: addrs[0].String(), 1129 } 1130 1131 expRes = &v1.QueryDepositResponse{Deposit: &deposit} 1132 }, 1133 true, 1134 }, 1135 } 1136 1137 for _, testCase := range testCases { 1138 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1139 testCase.malleate() 1140 1141 deposit, err := queryClient.Deposit(gocontext.Background(), req) 1142 1143 if testCase.expPass { 1144 suite.Require().NoError(err) 1145 suite.Require().Equal(deposit.GetDeposit(), expRes.GetDeposit()) 1146 } else { 1147 suite.Require().Error(err) 1148 suite.Require().Nil(expRes) 1149 } 1150 }) 1151 } 1152 } 1153 1154 func (suite *KeeperTestSuite) TestLegacyGRPCQueryDeposit() { 1155 ctx, queryClient, addrs := suite.ctx, suite.legacyQueryClient, suite.addrs 1156 1157 var ( 1158 req *v1beta1.QueryDepositRequest 1159 expRes *v1beta1.QueryDepositResponse 1160 proposal v1.Proposal 1161 ) 1162 1163 testCases := []struct { 1164 msg string 1165 malleate func() 1166 expPass bool 1167 }{ 1168 { 1169 "empty request", 1170 func() { 1171 req = &v1beta1.QueryDepositRequest{} 1172 }, 1173 false, 1174 }, 1175 { 1176 "zero proposal id request", 1177 func() { 1178 req = &v1beta1.QueryDepositRequest{ 1179 ProposalId: 0, 1180 Depositor: addrs[0].String(), 1181 } 1182 }, 1183 false, 1184 }, 1185 { 1186 "empty deposit address request", 1187 func() { 1188 req = &v1beta1.QueryDepositRequest{ 1189 ProposalId: 1, 1190 Depositor: "", 1191 } 1192 }, 1193 false, 1194 }, 1195 { 1196 "non existed proposal", 1197 func() { 1198 req = &v1beta1.QueryDepositRequest{ 1199 ProposalId: 2, 1200 Depositor: addrs[0].String(), 1201 } 1202 }, 1203 false, 1204 }, 1205 { 1206 "no deposits proposal", 1207 func() { 1208 var err error 1209 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 1210 suite.Require().NoError(err) 1211 suite.Require().NotNil(proposal) 1212 1213 req = &v1beta1.QueryDepositRequest{ 1214 ProposalId: proposal.Id, 1215 Depositor: addrs[0].String(), 1216 } 1217 }, 1218 false, 1219 }, 1220 { 1221 "valid request", 1222 func() { 1223 depositCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 20))) 1224 deposit := v1beta1.NewDeposit(proposal.Id, addrs[0], depositCoins) 1225 v1deposit := v1.NewDeposit(proposal.Id, addrs[0], depositCoins) 1226 suite.govKeeper.SetDeposit(ctx, v1deposit) 1227 1228 req = &v1beta1.QueryDepositRequest{ 1229 ProposalId: proposal.Id, 1230 Depositor: addrs[0].String(), 1231 } 1232 1233 expRes = &v1beta1.QueryDepositResponse{Deposit: deposit} 1234 }, 1235 true, 1236 }, 1237 } 1238 1239 for _, testCase := range testCases { 1240 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1241 testCase.malleate() 1242 1243 deposit, err := queryClient.Deposit(gocontext.Background(), req) 1244 1245 if testCase.expPass { 1246 suite.Require().NoError(err) 1247 suite.Require().Equal(deposit.GetDeposit(), expRes.GetDeposit()) 1248 } else { 1249 suite.Require().Error(err) 1250 suite.Require().Nil(expRes) 1251 } 1252 }) 1253 } 1254 } 1255 1256 func (suite *KeeperTestSuite) TestGRPCQueryDeposits() { 1257 ctx, queryClient, addrs := suite.ctx, suite.queryClient, suite.addrs 1258 1259 var ( 1260 req *v1.QueryDepositsRequest 1261 expRes *v1.QueryDepositsResponse 1262 proposal v1.Proposal 1263 ) 1264 1265 testCases := []struct { 1266 msg string 1267 malleate func() 1268 expPass bool 1269 }{ 1270 { 1271 "empty request", 1272 func() { 1273 req = &v1.QueryDepositsRequest{} 1274 }, 1275 false, 1276 }, 1277 { 1278 "zero proposal id request", 1279 func() { 1280 req = &v1.QueryDepositsRequest{ 1281 ProposalId: 0, 1282 } 1283 }, 1284 false, 1285 }, 1286 { 1287 "non existed proposal", 1288 func() { 1289 req = &v1.QueryDepositsRequest{ 1290 ProposalId: 2, 1291 } 1292 }, 1293 true, 1294 }, 1295 { 1296 "create a proposal and get deposits", 1297 func() { 1298 var err error 1299 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], true) 1300 suite.Require().NoError(err) 1301 1302 req = &v1.QueryDepositsRequest{ 1303 ProposalId: proposal.Id, 1304 } 1305 }, 1306 true, 1307 }, 1308 { 1309 "get deposits with default limit", 1310 func() { 1311 depositAmount1 := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 20))) 1312 deposit1 := v1.NewDeposit(proposal.Id, addrs[0], depositAmount1) 1313 suite.govKeeper.SetDeposit(ctx, deposit1) 1314 1315 depositAmount2 := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 30))) 1316 deposit2 := v1.NewDeposit(proposal.Id, addrs[1], depositAmount2) 1317 suite.govKeeper.SetDeposit(ctx, deposit2) 1318 1319 deposits := v1.Deposits{&deposit1, &deposit2} 1320 1321 req = &v1.QueryDepositsRequest{ 1322 ProposalId: proposal.Id, 1323 } 1324 1325 expRes = &v1.QueryDepositsResponse{ 1326 Deposits: deposits, 1327 } 1328 }, 1329 true, 1330 }, 1331 } 1332 1333 for _, testCase := range testCases { 1334 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1335 testCase.malleate() 1336 1337 deposits, err := queryClient.Deposits(gocontext.Background(), req) 1338 1339 if testCase.expPass { 1340 suite.Require().NoError(err) 1341 suite.Require().Equal(expRes.GetDeposits(), deposits.GetDeposits()) 1342 } else { 1343 suite.Require().Error(err) 1344 suite.Require().Nil(deposits) 1345 } 1346 }) 1347 } 1348 } 1349 1350 func (suite *KeeperTestSuite) TestLegacyGRPCQueryDeposits() { 1351 suite.reset() 1352 ctx, queryClient, addrs := suite.ctx, suite.legacyQueryClient, suite.addrs 1353 1354 var ( 1355 req *v1beta1.QueryDepositsRequest 1356 expRes *v1beta1.QueryDepositsResponse 1357 proposal v1.Proposal 1358 ) 1359 1360 testCases := []struct { 1361 msg string 1362 malleate func() 1363 expPass bool 1364 }{ 1365 { 1366 "empty request", 1367 func() { 1368 req = &v1beta1.QueryDepositsRequest{} 1369 }, 1370 false, 1371 }, 1372 { 1373 "zero proposal id request", 1374 func() { 1375 req = &v1beta1.QueryDepositsRequest{ 1376 ProposalId: 0, 1377 } 1378 }, 1379 false, 1380 }, 1381 { 1382 "non existed proposal", 1383 func() { 1384 req = &v1beta1.QueryDepositsRequest{ 1385 ProposalId: 2, 1386 } 1387 }, 1388 true, 1389 }, 1390 { 1391 "create a proposal and get deposits", 1392 func() { 1393 var err error 1394 proposal, err = suite.govKeeper.SubmitProposal(ctx, TestProposal, "", "title", "summary", addrs[0], false) 1395 suite.Require().NoError(err) 1396 1397 req = &v1beta1.QueryDepositsRequest{ 1398 ProposalId: proposal.Id, 1399 } 1400 }, 1401 true, 1402 }, 1403 { 1404 "get deposits with default limit", 1405 func() { 1406 depositAmount1 := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 20))) 1407 deposit1 := v1beta1.NewDeposit(proposal.Id, addrs[0], depositAmount1) 1408 v1deposit1 := v1.NewDeposit(proposal.Id, addrs[0], depositAmount1) 1409 suite.govKeeper.SetDeposit(ctx, v1deposit1) 1410 1411 depositAmount2 := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, suite.stakingKeeper.TokensFromConsensusPower(ctx, 30))) 1412 deposit2 := v1beta1.NewDeposit(proposal.Id, addrs[1], depositAmount2) 1413 v1deposit2 := v1.NewDeposit(proposal.Id, addrs[1], depositAmount2) 1414 suite.govKeeper.SetDeposit(ctx, v1deposit2) 1415 1416 deposits := v1beta1.Deposits{deposit1, deposit2} 1417 1418 req = &v1beta1.QueryDepositsRequest{ 1419 ProposalId: proposal.Id, 1420 } 1421 1422 expRes = &v1beta1.QueryDepositsResponse{ 1423 Deposits: deposits, 1424 } 1425 }, 1426 true, 1427 }, 1428 } 1429 1430 for _, testCase := range testCases { 1431 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1432 testCase.malleate() 1433 1434 deposits, err := queryClient.Deposits(gocontext.Background(), req) 1435 1436 if testCase.expPass { 1437 suite.Require().NoError(err) 1438 suite.Require().Equal(expRes.GetDeposits(), deposits.GetDeposits()) 1439 } else { 1440 suite.Require().Error(err) 1441 suite.Require().Nil(deposits) 1442 } 1443 }) 1444 } 1445 } 1446 1447 func (suite *KeeperTestSuite) TestGRPCQueryTallyResult() { 1448 suite.reset() 1449 ctx, queryClient := suite.ctx, suite.queryClient 1450 1451 var ( 1452 req *v1.QueryTallyResultRequest 1453 expTally *v1.TallyResult 1454 ) 1455 1456 testCases := []struct { 1457 msg string 1458 malleate func() 1459 expPass bool 1460 }{ 1461 { 1462 "empty request", 1463 func() { 1464 req = &v1.QueryTallyResultRequest{} 1465 }, 1466 false, 1467 }, 1468 { 1469 "non existing proposal request", 1470 func() { 1471 req = &v1.QueryTallyResultRequest{ProposalId: 2} 1472 }, 1473 false, 1474 }, 1475 { 1476 "zero proposal id request", 1477 func() { 1478 req = &v1.QueryTallyResultRequest{ProposalId: 0} 1479 }, 1480 false, 1481 }, 1482 { 1483 "valid request with proposal status passed", 1484 func() { 1485 propTime := time.Now() 1486 proposal := v1.Proposal{ 1487 Id: 1, 1488 Status: v1.StatusPassed, 1489 FinalTallyResult: &v1.TallyResult{ 1490 YesCount: "4", 1491 AbstainCount: "1", 1492 NoCount: "0", 1493 NoWithVetoCount: "0", 1494 }, 1495 SubmitTime: &propTime, 1496 VotingStartTime: &propTime, 1497 VotingEndTime: &propTime, 1498 Metadata: "proposal metadata", 1499 } 1500 suite.govKeeper.SetProposal(ctx, proposal) 1501 1502 req = &v1.QueryTallyResultRequest{ProposalId: proposal.Id} 1503 1504 expTally = &v1.TallyResult{ 1505 YesCount: "4", 1506 AbstainCount: "1", 1507 NoCount: "0", 1508 NoWithVetoCount: "0", 1509 } 1510 }, 1511 true, 1512 }, 1513 { 1514 "proposal status deposit", 1515 func() { 1516 propTime := time.Now() 1517 proposal := v1.Proposal{ 1518 Id: 1, 1519 Status: v1.StatusDepositPeriod, 1520 SubmitTime: &propTime, 1521 VotingStartTime: &propTime, 1522 VotingEndTime: &propTime, 1523 Metadata: "proposal metadata", 1524 } 1525 suite.govKeeper.SetProposal(ctx, proposal) 1526 1527 req = &v1.QueryTallyResultRequest{ProposalId: proposal.Id} 1528 1529 expTally = &v1.TallyResult{ 1530 YesCount: "0", 1531 AbstainCount: "0", 1532 NoCount: "0", 1533 NoWithVetoCount: "0", 1534 } 1535 }, 1536 true, 1537 }, 1538 { 1539 "proposal is in voting period", 1540 func() { 1541 propTime := time.Now() 1542 proposal := v1.Proposal{ 1543 Id: 1, 1544 Status: v1.StatusVotingPeriod, 1545 SubmitTime: &propTime, 1546 VotingStartTime: &propTime, 1547 VotingEndTime: &propTime, 1548 Metadata: "proposal metadata", 1549 } 1550 suite.govKeeper.SetProposal(ctx, proposal) 1551 1552 req = &v1.QueryTallyResultRequest{ProposalId: proposal.Id} 1553 1554 expTally = &v1.TallyResult{ 1555 YesCount: "0", 1556 AbstainCount: "0", 1557 NoCount: "0", 1558 NoWithVetoCount: "0", 1559 } 1560 }, 1561 true, 1562 }, 1563 { 1564 "proposal status failed", 1565 func() { 1566 propTime := time.Now() 1567 proposal := v1.Proposal{ 1568 Id: 1, 1569 Status: v1.StatusFailed, 1570 FinalTallyResult: &v1.TallyResult{ 1571 YesCount: "4", 1572 AbstainCount: "1", 1573 NoCount: "0", 1574 NoWithVetoCount: "0", 1575 }, 1576 SubmitTime: &propTime, 1577 VotingStartTime: &propTime, 1578 VotingEndTime: &propTime, 1579 Metadata: "proposal metadata", 1580 } 1581 err := suite.govKeeper.Proposals.Set(suite.ctx, proposal.Id, proposal) 1582 suite.Require().NoError(err) 1583 1584 req = &v1.QueryTallyResultRequest{ProposalId: proposal.Id} 1585 1586 expTally = &v1.TallyResult{ 1587 YesCount: "4", 1588 AbstainCount: "1", 1589 NoCount: "0", 1590 NoWithVetoCount: "0", 1591 } 1592 }, 1593 true, 1594 }, 1595 } 1596 1597 for _, testCase := range testCases { 1598 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1599 testCase.malleate() 1600 1601 tallyRes, err := queryClient.TallyResult(gocontext.Background(), req) 1602 1603 if testCase.expPass { 1604 suite.Require().NoError(err) 1605 suite.Require().NotEmpty(tallyRes.Tally.String()) 1606 suite.Require().Equal(expTally.String(), tallyRes.Tally.String()) 1607 } else { 1608 suite.Require().Error(err) 1609 suite.Require().Nil(tallyRes) 1610 } 1611 }) 1612 } 1613 } 1614 1615 func (suite *KeeperTestSuite) TestLegacyGRPCQueryTallyResult() { 1616 suite.reset() 1617 ctx, queryClient := suite.ctx, suite.legacyQueryClient 1618 1619 var ( 1620 req *v1beta1.QueryTallyResultRequest 1621 expTally *v1beta1.TallyResult 1622 ) 1623 1624 testCases := []struct { 1625 msg string 1626 malleate func() 1627 expPass bool 1628 }{ 1629 { 1630 "empty request", 1631 func() { 1632 req = &v1beta1.QueryTallyResultRequest{} 1633 }, 1634 false, 1635 }, 1636 { 1637 "non existing proposal request", 1638 func() { 1639 req = &v1beta1.QueryTallyResultRequest{ProposalId: 2} 1640 }, 1641 false, 1642 }, 1643 { 1644 "zero proposal id request", 1645 func() { 1646 req = &v1beta1.QueryTallyResultRequest{ProposalId: 0} 1647 }, 1648 false, 1649 }, 1650 { 1651 "valid request with proposal status passed", 1652 func() { 1653 propTime := time.Now() 1654 proposal := v1.Proposal{ 1655 Id: 1, 1656 Status: v1.StatusPassed, 1657 FinalTallyResult: &v1.TallyResult{ 1658 YesCount: "4", 1659 AbstainCount: "1", 1660 NoCount: "0", 1661 NoWithVetoCount: "0", 1662 }, 1663 SubmitTime: &propTime, 1664 VotingStartTime: &propTime, 1665 VotingEndTime: &propTime, 1666 Metadata: "proposal metadata", 1667 } 1668 suite.govKeeper.SetProposal(ctx, proposal) 1669 1670 req = &v1beta1.QueryTallyResultRequest{ProposalId: proposal.Id} 1671 1672 expTally = &v1beta1.TallyResult{ 1673 Yes: math.NewInt(4), 1674 Abstain: math.NewInt(1), 1675 No: math.NewInt(0), 1676 NoWithVeto: math.NewInt(0), 1677 } 1678 }, 1679 true, 1680 }, 1681 { 1682 "proposal status deposit", 1683 func() { 1684 propTime := time.Now() 1685 proposal := v1.Proposal{ 1686 Id: 1, 1687 Status: v1.StatusDepositPeriod, 1688 SubmitTime: &propTime, 1689 VotingStartTime: &propTime, 1690 VotingEndTime: &propTime, 1691 Metadata: "proposal metadata", 1692 } 1693 suite.govKeeper.SetProposal(ctx, proposal) 1694 1695 req = &v1beta1.QueryTallyResultRequest{ProposalId: proposal.Id} 1696 1697 expTally = &v1beta1.TallyResult{ 1698 Yes: math.NewInt(0), 1699 Abstain: math.NewInt(0), 1700 No: math.NewInt(0), 1701 NoWithVeto: math.NewInt(0), 1702 } 1703 }, 1704 true, 1705 }, 1706 { 1707 "proposal is in voting period", 1708 func() { 1709 propTime := time.Now() 1710 proposal := v1.Proposal{ 1711 Id: 1, 1712 Status: v1.StatusVotingPeriod, 1713 SubmitTime: &propTime, 1714 VotingStartTime: &propTime, 1715 VotingEndTime: &propTime, 1716 Metadata: "proposal metadata", 1717 } 1718 suite.govKeeper.SetProposal(ctx, proposal) 1719 1720 req = &v1beta1.QueryTallyResultRequest{ProposalId: proposal.Id} 1721 1722 expTally = &v1beta1.TallyResult{ 1723 Yes: math.NewInt(0), 1724 Abstain: math.NewInt(0), 1725 No: math.NewInt(0), 1726 NoWithVeto: math.NewInt(0), 1727 } 1728 }, 1729 true, 1730 }, 1731 { 1732 "proposal status failed", 1733 func() { 1734 propTime := time.Now() 1735 proposal := v1.Proposal{ 1736 Id: 1, 1737 Status: v1.StatusFailed, 1738 FinalTallyResult: &v1.TallyResult{ 1739 YesCount: "4", 1740 AbstainCount: "1", 1741 NoCount: "0", 1742 NoWithVetoCount: "0", 1743 }, 1744 SubmitTime: &propTime, 1745 VotingStartTime: &propTime, 1746 VotingEndTime: &propTime, 1747 Metadata: "proposal metadata", 1748 } 1749 err := suite.govKeeper.Proposals.Set(suite.ctx, proposal.Id, proposal) 1750 suite.Require().NoError(err) 1751 1752 req = &v1beta1.QueryTallyResultRequest{ProposalId: proposal.Id} 1753 1754 expTally = &v1beta1.TallyResult{ 1755 Yes: math.NewInt(4), 1756 Abstain: math.NewInt(1), 1757 No: math.NewInt(0), 1758 NoWithVeto: math.NewInt(0), 1759 } 1760 }, 1761 true, 1762 }, 1763 } 1764 1765 for _, testCase := range testCases { 1766 suite.Run(fmt.Sprintf("Case %s", testCase.msg), func() { 1767 testCase.malleate() 1768 1769 tallyRes, err := queryClient.TallyResult(gocontext.Background(), req) 1770 1771 if testCase.expPass { 1772 suite.Require().NoError(err) 1773 suite.Require().NotEmpty(tallyRes.Tally.String()) 1774 suite.Require().Equal(expTally.String(), tallyRes.Tally.String()) 1775 } else { 1776 suite.Require().Error(err) 1777 suite.Require().Nil(tallyRes) 1778 } 1779 }) 1780 } 1781 }