github.com/Finschia/finschia-sdk@v0.49.1/x/gov/client/testutil/deposits.go (about) 1 package testutil 2 3 import ( 4 "fmt" 5 "time" 6 7 ostcli "github.com/Finschia/ostracon/libs/cli" 8 "github.com/stretchr/testify/suite" 9 10 clitestutil "github.com/Finschia/finschia-sdk/testutil/cli" 11 "github.com/Finschia/finschia-sdk/testutil/network" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 "github.com/Finschia/finschia-sdk/x/gov/client/cli" 14 "github.com/Finschia/finschia-sdk/x/gov/types" 15 ) 16 17 type DepositTestSuite struct { 18 suite.Suite 19 20 cfg network.Config 21 network *network.Network 22 fees string 23 } 24 25 func NewDepositTestSuite(cfg network.Config) *DepositTestSuite { 26 return &DepositTestSuite{cfg: cfg} 27 } 28 29 func (s *DepositTestSuite) SetupSuite() { 30 s.T().Log("setting up test suite") 31 32 s.network = network.New(s.T(), s.cfg) 33 34 _, err := s.network.WaitForHeight(1) 35 s.Require().NoError(err) 36 s.fees = sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(20))).String() 37 } 38 39 func (s *DepositTestSuite) TearDownSuite() { 40 s.T().Log("tearing down test suite") 41 s.network.Cleanup() 42 } 43 44 func (s *DepositTestSuite) TestQueryDepositsInitialDeposit() { 45 val := s.network.Validators[0] 46 clientCtx := val.ClientCtx 47 initialDeposit := sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Sub(sdk.NewInt(20))).String() 48 49 // create a proposal with deposit 50 _, err := MsgSubmitProposal(val.ClientCtx, val.Address.String(), 51 "Text Proposal 1", "Where is the title!?", types.ProposalTypeText, 52 fmt.Sprintf("--%s=%s", cli.FlagDeposit, initialDeposit)) 53 s.Require().NoError(err) 54 55 // deposit more amount 56 _, err = MsgDeposit(clientCtx, val.Address.String(), "1", sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(50)).String()) 57 s.Require().NoError(err) 58 59 // waiting for voting period to end 60 time.Sleep(20 * time.Second) 61 62 // query deposit & verify initial deposit 63 deposit := s.queryDeposit(val, "1", false) 64 s.Require().Equal(deposit.Amount.String(), initialDeposit) 65 66 // query deposits 67 deposits := s.queryDeposits(val, "1", false) 68 s.Require().Equal(len(deposits), 2) 69 // verify initial deposit 70 s.Require().Equal(deposits[0].Amount.String(), initialDeposit) 71 } 72 73 func (s *DepositTestSuite) TestQueryDepositsWithoutInitialDeposit() { 74 val := s.network.Validators[0] 75 clientCtx := val.ClientCtx 76 77 // create a proposal without deposit 78 _, err := MsgSubmitProposal(val.ClientCtx, val.Address.String(), 79 "Text Proposal 2", "Where is the title!?", types.ProposalTypeText) 80 s.Require().NoError(err) 81 82 // deposit amount 83 _, err = MsgDeposit(clientCtx, val.Address.String(), "2", sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Add(sdk.NewInt(50))).String()) 84 s.Require().NoError(err) 85 86 // waiting for voting period to end 87 time.Sleep(20 * time.Second) 88 89 // query deposit 90 deposit := s.queryDeposit(val, "2", false) 91 s.Require().Equal(deposit.Amount.String(), sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Add(sdk.NewInt(50))).String()) 92 93 // query deposits 94 deposits := s.queryDeposits(val, "2", false) 95 s.Require().Equal(len(deposits), 1) 96 // verify initial deposit 97 s.Require().Equal(deposits[0].Amount.String(), sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Add(sdk.NewInt(50))).String()) 98 } 99 100 func (s *DepositTestSuite) TestQueryProposalNotEnoughDeposits() { 101 val := s.network.Validators[0] 102 clientCtx := val.ClientCtx 103 initialDeposit := sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens.Sub(sdk.NewInt(2000))).String() 104 105 // create a proposal with deposit 106 _, err := MsgSubmitProposal(val.ClientCtx, val.Address.String(), 107 "Text Proposal 3", "Where is the title!?", types.ProposalTypeText, 108 fmt.Sprintf("--%s=%s", cli.FlagDeposit, initialDeposit)) 109 s.Require().NoError(err) 110 111 // query proposal 112 args := []string{"3", fmt.Sprintf("--%s=json", ostcli.OutputFlag)} 113 cmd := cli.GetCmdQueryProposal() 114 _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) 115 s.Require().NoError(err) 116 117 // waiting for deposit period to end 118 time.Sleep(20 * time.Second) 119 120 // query proposal 121 _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) 122 s.Require().Error(err) 123 s.Require().Contains(err.Error(), "proposal 3 doesn't exist") 124 } 125 126 func (s *DepositTestSuite) TestRejectedProposalDeposits() { 127 val := s.network.Validators[0] 128 clientCtx := val.ClientCtx 129 initialDeposit := sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens) 130 131 // create a proposal with deposit 132 _, err := MsgSubmitProposal(clientCtx, val.Address.String(), 133 "Text Proposal 4", "Where is the title!?", types.ProposalTypeText, 134 fmt.Sprintf("--%s=%s", cli.FlagDeposit, initialDeposit)) 135 s.Require().NoError(err) 136 137 // query deposits 138 var deposits types.QueryDepositsResponse 139 args := []string{"4", fmt.Sprintf("--%s=json", ostcli.OutputFlag)} 140 cmd := cli.GetCmdQueryDeposits() 141 out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) 142 s.Require().NoError(err) 143 s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(out.Bytes(), &deposits)) 144 s.Require().Equal(len(deposits.Deposits), 1) 145 // verify initial deposit 146 s.Require().Equal(deposits.Deposits[0].Amount.String(), sdk.NewCoin(s.cfg.BondDenom, types.DefaultMinDepositTokens).String()) 147 148 // vote 149 _, err = MsgVote(clientCtx, val.Address.String(), "4", "no") 150 s.Require().NoError(err) 151 152 time.Sleep(20 * time.Second) 153 154 args = []string{"4", fmt.Sprintf("--%s=json", ostcli.OutputFlag)} 155 cmd = cli.GetCmdQueryProposal() 156 _, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args) 157 s.Require().NoError(err) 158 159 // query deposits 160 depositsRes := s.queryDeposits(val, "4", false) 161 s.Require().Equal(len(depositsRes), 1) 162 // verify initial deposit 163 s.Require().Equal(depositsRes[0].Amount.String(), initialDeposit.String()) 164 } 165 166 func (s *DepositTestSuite) queryDeposits(val *network.Validator, proposalID string, exceptErr bool) types.Deposits { 167 args := []string{proposalID, fmt.Sprintf("--%s=json", ostcli.OutputFlag)} 168 var depositsRes types.Deposits 169 cmd := cli.GetCmdQueryDeposits() 170 out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) 171 if exceptErr { 172 s.Require().Error(err) 173 return nil 174 } 175 s.Require().NoError(err) 176 s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(out.Bytes(), &depositsRes)) 177 return depositsRes 178 } 179 180 func (s *DepositTestSuite) queryDeposit(val *network.Validator, proposalID string, exceptErr bool) *types.Deposit { 181 args := []string{proposalID, val.Address.String(), fmt.Sprintf("--%s=json", ostcli.OutputFlag)} 182 var depositRes types.Deposit 183 cmd := cli.GetCmdQueryDeposit() 184 out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args) 185 if exceptErr { 186 s.Require().Error(err) 187 return nil 188 } 189 s.Require().NoError(err) 190 s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(out.Bytes(), &depositRes)) 191 return &depositRes 192 }