github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/keeper/querier_test.go (about)

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