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 }