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  }