github.com/Finschia/finschia-sdk@v0.48.1/x/gov/keeper/proposal_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  	"time"
     8  
     9  	sdk "github.com/Finschia/finschia-sdk/types"
    10  	"github.com/Finschia/finschia-sdk/x/gov/types"
    11  )
    12  
    13  func (suite *KeeperTestSuite) TestGetSetProposal() {
    14  	tp := TestProposal
    15  	proposal, err := suite.app.GovKeeper.SubmitProposal(suite.ctx, tp)
    16  	suite.Require().NoError(err)
    17  	proposalID := proposal.ProposalId
    18  	suite.app.GovKeeper.SetProposal(suite.ctx, proposal)
    19  
    20  	gotProposal, ok := suite.app.GovKeeper.GetProposal(suite.ctx, proposalID)
    21  	suite.Require().True(ok)
    22  	suite.Require().True(proposal.Equal(gotProposal))
    23  }
    24  
    25  func (suite *KeeperTestSuite) TestActivateVotingPeriod() {
    26  	tp := TestProposal
    27  	proposal, err := suite.app.GovKeeper.SubmitProposal(suite.ctx, tp)
    28  	suite.Require().NoError(err)
    29  
    30  	suite.Require().True(proposal.VotingStartTime.Equal(time.Time{}))
    31  
    32  	suite.app.GovKeeper.ActivateVotingPeriod(suite.ctx, proposal)
    33  
    34  	suite.Require().True(proposal.VotingStartTime.Equal(suite.ctx.BlockHeader().Time))
    35  
    36  	proposal, ok := suite.app.GovKeeper.GetProposal(suite.ctx, proposal.ProposalId)
    37  	suite.Require().True(ok)
    38  
    39  	activeIterator := suite.app.GovKeeper.ActiveProposalQueueIterator(suite.ctx, proposal.VotingEndTime)
    40  	suite.Require().True(activeIterator.Valid())
    41  
    42  	proposalID := types.GetProposalIDFromBytes(activeIterator.Value())
    43  	suite.Require().Equal(proposalID, proposal.ProposalId)
    44  	activeIterator.Close()
    45  }
    46  
    47  type invalidProposalRoute struct{ types.TextProposal }
    48  
    49  func (invalidProposalRoute) ProposalRoute() string { return "nonexistingroute" }
    50  
    51  func (suite *KeeperTestSuite) TestSubmitProposal() {
    52  	testCases := []struct {
    53  		content     types.Content
    54  		expectedErr error
    55  	}{
    56  		{&types.TextProposal{Title: "title", Description: "description"}, nil},
    57  		// Keeper does not check the validity of title and description, no error
    58  		{&types.TextProposal{Title: "", Description: "description"}, nil},
    59  		{&types.TextProposal{Title: strings.Repeat("1234567890", 100), Description: "description"}, nil},
    60  		{&types.TextProposal{Title: "title", Description: ""}, nil},
    61  		{&types.TextProposal{Title: "title", Description: strings.Repeat("1234567890", 1000)}, nil},
    62  		// error only when invalid route
    63  		{&invalidProposalRoute{}, types.ErrNoProposalHandlerExists},
    64  	}
    65  
    66  	for i, tc := range testCases {
    67  		_, err := suite.app.GovKeeper.SubmitProposal(suite.ctx, tc.content)
    68  		suite.Require().True(errors.Is(tc.expectedErr, err), "tc #%d; got: %v, expected: %v", i, err, tc.expectedErr)
    69  	}
    70  }
    71  
    72  func (suite *KeeperTestSuite) TestGetProposalsFiltered() {
    73  	proposalID := uint64(1)
    74  	status := []types.ProposalStatus{types.StatusDepositPeriod, types.StatusVotingPeriod}
    75  
    76  	addr1 := sdk.AccAddress("foo_________________")
    77  
    78  	for _, s := range status {
    79  		for i := 0; i < 50; i++ {
    80  			p, err := types.NewProposal(TestProposal, proposalID, time.Now(), time.Now())
    81  			suite.Require().NoError(err)
    82  
    83  			p.Status = s
    84  
    85  			if i%2 == 0 {
    86  				d := types.NewDeposit(proposalID, addr1, nil)
    87  				v := types.NewVote(proposalID, addr1, types.NewNonSplitVoteOption(types.OptionYes))
    88  				suite.app.GovKeeper.SetDeposit(suite.ctx, d)
    89  				suite.app.GovKeeper.SetVote(suite.ctx, v)
    90  			}
    91  
    92  			suite.app.GovKeeper.SetProposal(suite.ctx, p)
    93  			proposalID++
    94  		}
    95  	}
    96  
    97  	testCases := []struct {
    98  		params             types.QueryProposalsParams
    99  		expectedNumResults int
   100  	}{
   101  		{types.NewQueryProposalsParams(1, 50, types.StatusNil, nil, nil), 50},
   102  		{types.NewQueryProposalsParams(1, 50, types.StatusDepositPeriod, nil, nil), 50},
   103  		{types.NewQueryProposalsParams(1, 50, types.StatusVotingPeriod, nil, nil), 50},
   104  		{types.NewQueryProposalsParams(1, 25, types.StatusNil, nil, nil), 25},
   105  		{types.NewQueryProposalsParams(2, 25, types.StatusNil, nil, nil), 25},
   106  		{types.NewQueryProposalsParams(1, 50, types.StatusRejected, nil, nil), 0},
   107  		{types.NewQueryProposalsParams(1, 50, types.StatusNil, addr1, nil), 50},
   108  		{types.NewQueryProposalsParams(1, 50, types.StatusNil, nil, addr1), 50},
   109  		{types.NewQueryProposalsParams(1, 50, types.StatusNil, addr1, addr1), 50},
   110  		{types.NewQueryProposalsParams(1, 50, types.StatusDepositPeriod, addr1, addr1), 25},
   111  		{types.NewQueryProposalsParams(1, 50, types.StatusDepositPeriod, nil, nil), 50},
   112  		{types.NewQueryProposalsParams(1, 50, types.StatusVotingPeriod, nil, nil), 50},
   113  	}
   114  
   115  	for i, tc := range testCases {
   116  		suite.Run(fmt.Sprintf("Test Case %d", i), func() {
   117  			proposals := suite.app.GovKeeper.GetProposalsFiltered(suite.ctx, tc.params)
   118  			suite.Require().Len(proposals, tc.expectedNumResults)
   119  
   120  			for _, p := range proposals {
   121  				if types.ValidProposalStatus(tc.params.ProposalStatus) {
   122  					suite.Require().Equal(tc.params.ProposalStatus, p.Status)
   123  				}
   124  			}
   125  		})
   126  	}
   127  }