github.com/Finschia/finschia-sdk@v0.48.1/x/gov/client/testutil/deposits.go (about)

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