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

     1  package testutil
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/gogo/protobuf/proto"
     9  	"github.com/stretchr/testify/suite"
    10  
    11  	ostcli "github.com/Finschia/ostracon/libs/cli"
    12  
    13  	"github.com/Finschia/finschia-sdk/client/flags"
    14  	"github.com/Finschia/finschia-sdk/testutil"
    15  	clitestutil "github.com/Finschia/finschia-sdk/testutil/cli"
    16  	"github.com/Finschia/finschia-sdk/testutil/network"
    17  	sdk "github.com/Finschia/finschia-sdk/types"
    18  	"github.com/Finschia/finschia-sdk/x/distribution/client/cli"
    19  	minttypes "github.com/Finschia/finschia-sdk/x/mint/types"
    20  )
    21  
    22  type IntegrationTestSuite struct {
    23  	suite.Suite
    24  
    25  	cfg     network.Config
    26  	network *network.Network
    27  }
    28  
    29  func NewIntegrationTestSuite(cfg network.Config) *IntegrationTestSuite {
    30  	return &IntegrationTestSuite{cfg: cfg}
    31  }
    32  
    33  // SetupTest creates a new network for _each_ integration test. We create a new
    34  // network for each test because there are some state modifications that are
    35  // needed to be made in order to make useful queries. However, we don't want
    36  // these state changes to be present in other tests.
    37  func (s *IntegrationTestSuite) SetupTest() {
    38  	s.T().Log("setting up integration test suite")
    39  
    40  	genesisState := s.cfg.GenesisState
    41  	var mintData minttypes.GenesisState
    42  	s.Require().NoError(s.cfg.Codec.UnmarshalJSON(genesisState[minttypes.ModuleName], &mintData))
    43  
    44  	inflation := sdk.MustNewDecFromStr("1.0")
    45  	mintData.Minter.Inflation = inflation
    46  	mintData.Params.InflationMin = inflation
    47  	mintData.Params.InflationMax = inflation
    48  
    49  	mintDataBz, err := s.cfg.Codec.MarshalJSON(&mintData)
    50  	s.Require().NoError(err)
    51  	genesisState[minttypes.ModuleName] = mintDataBz
    52  	s.cfg.GenesisState = genesisState
    53  
    54  	s.network = network.New(s.T(), s.cfg)
    55  
    56  	_, err = s.network.WaitForHeight(1)
    57  	s.Require().NoError(err)
    58  }
    59  
    60  // TearDownTest cleans up the curret test network after _each_ test.
    61  func (s *IntegrationTestSuite) TearDownTest() {
    62  	s.T().Log("tearing down integration test suite")
    63  	s.network.Cleanup()
    64  }
    65  
    66  func (s *IntegrationTestSuite) TestGetCmdQueryParams() {
    67  	val := s.network.Validators[0]
    68  
    69  	testCases := []struct {
    70  		name           string
    71  		args           []string
    72  		expectedOutput string
    73  	}{
    74  		{
    75  			"json output",
    76  			[]string{fmt.Sprintf("--%s=json", ostcli.OutputFlag)},
    77  			`{"community_tax":"0.020000000000000000","base_proposer_reward":"0.010000000000000000","bonus_proposer_reward":"0.040000000000000000","withdraw_addr_enabled":true}`,
    78  		},
    79  		{
    80  			"text output",
    81  			[]string{fmt.Sprintf("--%s=text", ostcli.OutputFlag)},
    82  			`base_proposer_reward: "0.010000000000000000"
    83  bonus_proposer_reward: "0.040000000000000000"
    84  community_tax: "0.020000000000000000"
    85  withdraw_addr_enabled: true`,
    86  		},
    87  	}
    88  
    89  	for _, tc := range testCases {
    90  		tc := tc
    91  
    92  		s.Run(tc.name, func() {
    93  			cmd := cli.GetCmdQueryParams()
    94  			clientCtx := val.ClientCtx
    95  
    96  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
    97  			s.Require().NoError(err)
    98  			s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
    99  		})
   100  	}
   101  }
   102  
   103  func (s *IntegrationTestSuite) TestGetCmdQueryValidatorOutstandingRewards() {
   104  	val := s.network.Validators[0]
   105  
   106  	_, err := s.network.WaitForHeight(4)
   107  	s.Require().NoError(err)
   108  
   109  	testCases := []struct {
   110  		name           string
   111  		args           []string
   112  		expectErr      bool
   113  		expectedOutput string
   114  	}{
   115  		{
   116  			"invalid validator address",
   117  			[]string{
   118  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   119  				"foo",
   120  			},
   121  			true,
   122  			"",
   123  		},
   124  		{
   125  			"json output",
   126  			[]string{
   127  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   128  				sdk.ValAddress(val.Address).String(),
   129  				fmt.Sprintf("--%s=json", ostcli.OutputFlag),
   130  			},
   131  			false,
   132  			`{"rewards":[{"denom":"stake","amount":"1164.240000000000000000"}]}`,
   133  		},
   134  		{
   135  			"text output",
   136  			[]string{
   137  				fmt.Sprintf("--%s=text", ostcli.OutputFlag),
   138  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   139  				sdk.ValAddress(val.Address).String(),
   140  			},
   141  			false,
   142  			`rewards:
   143  - amount: "1164.240000000000000000"
   144    denom: stake`,
   145  		},
   146  	}
   147  
   148  	for _, tc := range testCases {
   149  		tc := tc
   150  
   151  		s.Run(tc.name, func() {
   152  			cmd := cli.GetCmdQueryValidatorOutstandingRewards()
   153  			clientCtx := val.ClientCtx
   154  
   155  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   156  			if tc.expectErr {
   157  				s.Require().Error(err)
   158  			} else {
   159  				s.Require().NoError(err)
   160  				s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
   161  			}
   162  		})
   163  	}
   164  }
   165  
   166  func (s *IntegrationTestSuite) TestGetCmdQueryValidatorCommission() {
   167  	val := s.network.Validators[0]
   168  
   169  	_, err := s.network.WaitForHeight(4)
   170  	s.Require().NoError(err)
   171  
   172  	testCases := []struct {
   173  		name           string
   174  		args           []string
   175  		expectErr      bool
   176  		expectedOutput string
   177  	}{
   178  		{
   179  			"invalid validator address",
   180  			[]string{
   181  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   182  				"foo",
   183  			},
   184  			true,
   185  			"",
   186  		},
   187  		{
   188  			"json output",
   189  			[]string{
   190  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   191  				sdk.ValAddress(val.Address).String(),
   192  				fmt.Sprintf("--%s=json", ostcli.OutputFlag),
   193  			},
   194  			false,
   195  			`{"commission":[{"denom":"stake","amount":"464.520000000000000000"}]}`,
   196  		},
   197  		{
   198  			"text output",
   199  			[]string{
   200  				fmt.Sprintf("--%s=text", ostcli.OutputFlag),
   201  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   202  				sdk.ValAddress(val.Address).String(),
   203  			},
   204  			false,
   205  			`commission:
   206  - amount: "464.520000000000000000"
   207    denom: stake`,
   208  		},
   209  	}
   210  
   211  	for _, tc := range testCases {
   212  		tc := tc
   213  
   214  		s.Run(tc.name, func() {
   215  			cmd := cli.GetCmdQueryValidatorCommission()
   216  			clientCtx := val.ClientCtx
   217  
   218  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   219  			if tc.expectErr {
   220  				s.Require().Error(err)
   221  			} else {
   222  				s.Require().NoError(err)
   223  				s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
   224  			}
   225  		})
   226  	}
   227  }
   228  
   229  func (s *IntegrationTestSuite) TestGetCmdQueryValidatorSlashes() {
   230  	val := s.network.Validators[0]
   231  
   232  	_, err := s.network.WaitForHeight(4)
   233  	s.Require().NoError(err)
   234  
   235  	testCases := []struct {
   236  		name           string
   237  		args           []string
   238  		expectErr      bool
   239  		expectedOutput string
   240  	}{
   241  		{
   242  			"invalid validator address",
   243  			[]string{
   244  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   245  				"foo", "1", "3",
   246  			},
   247  			true,
   248  			"",
   249  		},
   250  		{
   251  			"invalid start height",
   252  			[]string{
   253  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   254  				sdk.ValAddress(val.Address).String(), "-1", "3",
   255  			},
   256  			true,
   257  			"",
   258  		},
   259  		{
   260  			"invalid end height",
   261  			[]string{
   262  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   263  				sdk.ValAddress(val.Address).String(), "1", "-3",
   264  			},
   265  			true,
   266  			"",
   267  		},
   268  		{
   269  			"json output",
   270  			[]string{
   271  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   272  				sdk.ValAddress(val.Address).String(), "1", "3",
   273  				fmt.Sprintf("--%s=json", ostcli.OutputFlag),
   274  			},
   275  			false,
   276  			"{\"slashes\":[],\"pagination\":{\"next_key\":null,\"total\":\"0\"}}",
   277  		},
   278  		{
   279  			"text output",
   280  			[]string{
   281  				fmt.Sprintf("--%s=text", ostcli.OutputFlag),
   282  				fmt.Sprintf("--%s=3", flags.FlagHeight),
   283  				sdk.ValAddress(val.Address).String(), "1", "3",
   284  			},
   285  			false,
   286  			"pagination:\n  next_key: null\n  total: \"0\"\nslashes: []",
   287  		},
   288  	}
   289  
   290  	for _, tc := range testCases {
   291  		tc := tc
   292  
   293  		s.Run(tc.name, func() {
   294  			cmd := cli.GetCmdQueryValidatorSlashes()
   295  			clientCtx := val.ClientCtx
   296  
   297  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   298  			if tc.expectErr {
   299  				s.Require().Error(err)
   300  			} else {
   301  				s.Require().NoError(err)
   302  				s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
   303  			}
   304  		})
   305  	}
   306  }
   307  
   308  func (s *IntegrationTestSuite) TestGetCmdQueryDelegatorRewards() {
   309  	val := s.network.Validators[0]
   310  	addr := val.Address
   311  	valAddr := sdk.ValAddress(addr)
   312  
   313  	_, err := s.network.WaitForHeightWithTimeout(11, time.Minute)
   314  	s.Require().NoError(err)
   315  
   316  	testCases := []struct {
   317  		name           string
   318  		args           []string
   319  		expectErr      bool
   320  		expectedOutput string
   321  	}{
   322  		{
   323  			"invalid delegator address",
   324  			[]string{
   325  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   326  				"foo", valAddr.String(),
   327  			},
   328  			true,
   329  			"",
   330  		},
   331  		{
   332  			"invalid validator address",
   333  			[]string{
   334  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   335  				addr.String(), "foo",
   336  			},
   337  			true,
   338  			"",
   339  		},
   340  		{
   341  			"json output",
   342  			[]string{
   343  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   344  				addr.String(),
   345  				fmt.Sprintf("--%s=json", ostcli.OutputFlag),
   346  			},
   347  			false,
   348  			fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[{"denom":"stake","amount":"387.100000000000000000"}]}],"total":[{"denom":"stake","amount":"387.100000000000000000"}]}`, valAddr.String()),
   349  		},
   350  		{
   351  			"json output (specific validator)",
   352  			[]string{
   353  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   354  				addr.String(), valAddr.String(),
   355  				fmt.Sprintf("--%s=json", ostcli.OutputFlag),
   356  			},
   357  			false,
   358  			`{"rewards":[{"denom":"stake","amount":"387.100000000000000000"}]}`,
   359  		},
   360  		{
   361  			"text output",
   362  			[]string{
   363  				fmt.Sprintf("--%s=text", ostcli.OutputFlag),
   364  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   365  				addr.String(),
   366  			},
   367  			false,
   368  			fmt.Sprintf(`rewards:
   369  - reward:
   370    - amount: "387.100000000000000000"
   371      denom: stake
   372    validator_address: %s
   373  total:
   374  - amount: "387.100000000000000000"
   375    denom: stake`, valAddr.String()),
   376  		},
   377  		{
   378  			"text output (specific validator)",
   379  			[]string{
   380  				fmt.Sprintf("--%s=text", ostcli.OutputFlag),
   381  				fmt.Sprintf("--%s=5", flags.FlagHeight),
   382  				addr.String(), valAddr.String(),
   383  			},
   384  			false,
   385  			`rewards:
   386  - amount: "387.100000000000000000"
   387    denom: stake`,
   388  		},
   389  	}
   390  
   391  	for _, tc := range testCases {
   392  		tc := tc
   393  
   394  		s.Run(tc.name, func() {
   395  			cmd := cli.GetCmdQueryDelegatorRewards()
   396  			clientCtx := val.ClientCtx
   397  
   398  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   399  			if tc.expectErr {
   400  				s.Require().Error(err)
   401  			} else {
   402  				s.Require().NoError(err)
   403  				s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
   404  			}
   405  		})
   406  	}
   407  }
   408  
   409  func (s *IntegrationTestSuite) TestGetCmdQueryCommunityPool() {
   410  	val := s.network.Validators[0]
   411  
   412  	_, err := s.network.WaitForHeight(4)
   413  	s.Require().NoError(err)
   414  
   415  	testCases := []struct {
   416  		name           string
   417  		args           []string
   418  		expectedOutput string
   419  	}{
   420  		{
   421  			"json output",
   422  			[]string{fmt.Sprintf("--%s=3", flags.FlagHeight), fmt.Sprintf("--%s=json", ostcli.OutputFlag)},
   423  			`{"pool":[{"denom":"stake","amount":"4.740000000000000000"}]}`,
   424  		},
   425  		{
   426  			"text output",
   427  			[]string{fmt.Sprintf("--%s=text", ostcli.OutputFlag), fmt.Sprintf("--%s=3", flags.FlagHeight)},
   428  			`pool:
   429  - amount: "4.740000000000000000"
   430    denom: stake`,
   431  		},
   432  	}
   433  
   434  	for _, tc := range testCases {
   435  		tc := tc
   436  
   437  		s.Run(tc.name, func() {
   438  			cmd := cli.GetCmdQueryCommunityPool()
   439  			clientCtx := val.ClientCtx
   440  
   441  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   442  			s.Require().NoError(err)
   443  			s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String()))
   444  		})
   445  	}
   446  }
   447  
   448  func (s *IntegrationTestSuite) TestNewWithdrawRewardsCmd() {
   449  	val := s.network.Validators[0]
   450  
   451  	testCases := []struct {
   452  		name         string
   453  		valAddr      fmt.Stringer
   454  		args         []string
   455  		expectErr    bool
   456  		expectedCode uint32
   457  		respType     proto.Message
   458  	}{
   459  		{
   460  			"invalid validator address",
   461  			val.Address,
   462  			[]string{
   463  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   464  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   465  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   466  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   467  			},
   468  			true, 0, nil,
   469  		},
   470  		{
   471  			"valid transaction",
   472  			sdk.ValAddress(val.Address),
   473  			[]string{
   474  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   475  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   476  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   477  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   478  			},
   479  			false, 0, &sdk.TxResponse{},
   480  		},
   481  		{
   482  			"valid transaction (with commission)",
   483  			sdk.ValAddress(val.Address),
   484  			[]string{
   485  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   486  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   487  				fmt.Sprintf("--%s=true", cli.FlagCommission),
   488  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   489  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   490  			},
   491  			false, 0, &sdk.TxResponse{},
   492  		},
   493  	}
   494  
   495  	for _, tc := range testCases {
   496  		tc := tc
   497  
   498  		s.Run(tc.name, func() {
   499  			clientCtx := val.ClientCtx
   500  
   501  			bz, err := MsgWithdrawDelegatorRewardExec(clientCtx, tc.valAddr, tc.args...)
   502  			if tc.expectErr {
   503  				s.Require().Error(err)
   504  			} else {
   505  				s.Require().NoError(err)
   506  				s.Require().NoError(clientCtx.Codec.UnmarshalJSON(bz, tc.respType), string(bz))
   507  
   508  				txResp := tc.respType.(*sdk.TxResponse)
   509  				s.Require().Equal(tc.expectedCode, txResp.Code)
   510  			}
   511  		})
   512  	}
   513  }
   514  
   515  func (s *IntegrationTestSuite) TestNewWithdrawAllRewardsCmd() {
   516  	val := s.network.Validators[0]
   517  
   518  	testCases := []struct {
   519  		name         string
   520  		args         []string
   521  		expectErr    bool
   522  		expectedCode uint32
   523  		respType     proto.Message
   524  	}{
   525  		{
   526  			"valid transaction (offline)",
   527  			[]string{
   528  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   529  				fmt.Sprintf("--%s=true", flags.FlagOffline),
   530  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   531  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   532  			},
   533  			true, 0, nil,
   534  		},
   535  		{
   536  			"valid transaction",
   537  			[]string{
   538  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   539  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   540  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   541  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   542  			},
   543  			false, 0, &sdk.TxResponse{},
   544  		},
   545  	}
   546  
   547  	for _, tc := range testCases {
   548  		tc := tc
   549  
   550  		s.Run(tc.name, func() {
   551  			cmd := cli.NewWithdrawAllRewardsCmd()
   552  			clientCtx := val.ClientCtx
   553  
   554  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   555  			if tc.expectErr {
   556  				s.Require().Error(err)
   557  			} else {
   558  				s.Require().NoError(err)
   559  				s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
   560  
   561  				txResp := tc.respType.(*sdk.TxResponse)
   562  				s.Require().Equal(tc.expectedCode, txResp.Code)
   563  			}
   564  		})
   565  	}
   566  }
   567  
   568  func (s *IntegrationTestSuite) TestNewSetWithdrawAddrCmd() {
   569  	val := s.network.Validators[0]
   570  
   571  	testCases := []struct {
   572  		name         string
   573  		args         []string
   574  		expectErr    bool
   575  		expectedCode uint32
   576  		respType     proto.Message
   577  	}{
   578  		{
   579  			"invalid withdraw address",
   580  			[]string{
   581  				"foo",
   582  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   583  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   584  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   585  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   586  			},
   587  			true, 0, nil,
   588  		},
   589  		{
   590  			"valid transaction",
   591  			[]string{
   592  				val.Address.String(),
   593  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   594  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   595  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   596  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   597  			},
   598  			false, 0, &sdk.TxResponse{},
   599  		},
   600  	}
   601  
   602  	for _, tc := range testCases {
   603  		tc := tc
   604  
   605  		s.Run(tc.name, func() {
   606  			cmd := cli.NewSetWithdrawAddrCmd()
   607  			clientCtx := val.ClientCtx
   608  
   609  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   610  			if tc.expectErr {
   611  				s.Require().Error(err)
   612  			} else {
   613  				s.Require().NoError(err)
   614  				s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
   615  
   616  				txResp := tc.respType.(*sdk.TxResponse)
   617  				s.Require().Equal(tc.expectedCode, txResp.Code)
   618  			}
   619  		})
   620  	}
   621  }
   622  
   623  func (s *IntegrationTestSuite) TestNewFundCommunityPoolCmd() {
   624  	val := s.network.Validators[0]
   625  
   626  	testCases := []struct {
   627  		name         string
   628  		args         []string
   629  		expectErr    bool
   630  		expectedCode uint32
   631  		respType     proto.Message
   632  	}{
   633  		{
   634  			"invalid funding amount",
   635  			[]string{
   636  				"-43foocoin",
   637  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   638  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   639  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   640  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   641  			},
   642  			true, 0, nil,
   643  		},
   644  		{
   645  			"valid transaction",
   646  			[]string{
   647  				sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431))).String(),
   648  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   649  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   650  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
   651  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   652  			},
   653  			false, 0, &sdk.TxResponse{},
   654  		},
   655  	}
   656  
   657  	for _, tc := range testCases {
   658  		tc := tc
   659  
   660  		s.Run(tc.name, func() {
   661  			cmd := cli.NewFundCommunityPoolCmd()
   662  			clientCtx := val.ClientCtx
   663  
   664  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   665  			if tc.expectErr {
   666  				s.Require().Error(err)
   667  			} else {
   668  				s.Require().NoError(err)
   669  				s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
   670  
   671  				txResp := tc.respType.(*sdk.TxResponse)
   672  				s.Require().Equal(tc.expectedCode, txResp.Code)
   673  			}
   674  		})
   675  	}
   676  }
   677  
   678  func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() {
   679  	val := s.network.Validators[0]
   680  	invalidProp := `{
   681    "title": "",
   682    "description": "Pay me some Atoms!",
   683    "recipient": "foo",
   684    "amount": "-343foocoin",
   685    "deposit": -324foocoin
   686  }`
   687  
   688  	invalidPropFile := testutil.WriteToNewTempFile(s.T(), invalidProp)
   689  
   690  	validProp := fmt.Sprintf(`{
   691    "title": "Community Pool Spend",
   692    "description": "Pay me some Atoms!",
   693    "recipient": "%s",
   694    "amount": "%s",
   695    "deposit": "%s"
   696  }`, val.Address.String(), sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431)), sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5431)))
   697  
   698  	validPropFile := testutil.WriteToNewTempFile(s.T(), validProp)
   699  	testCases := []struct {
   700  		name         string
   701  		args         []string
   702  		expectErr    bool
   703  		expectedCode uint32
   704  		respType     proto.Message
   705  	}{
   706  		{
   707  			"invalid proposal",
   708  			[]string{
   709  				invalidPropFile.Name(),
   710  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   711  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   712  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync),
   713  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   714  			},
   715  			true, 0, nil,
   716  		},
   717  		{
   718  			"valid transaction",
   719  			[]string{
   720  				validPropFile.Name(),
   721  				fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
   722  				fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
   723  				fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), // sync mode as there are no funds yet
   724  				fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
   725  			},
   726  			false, 0, &sdk.TxResponse{},
   727  		},
   728  	}
   729  
   730  	for _, tc := range testCases {
   731  		tc := tc
   732  
   733  		s.Run(tc.name, func() {
   734  			cmd := cli.GetCmdSubmitProposal()
   735  			clientCtx := val.ClientCtx
   736  			flags.AddTxFlagsToCmd(cmd)
   737  
   738  			out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
   739  			if tc.expectErr {
   740  				s.Require().Error(err)
   741  			} else {
   742  				s.Require().NoError(err)
   743  				s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String())
   744  
   745  				txResp := tc.respType.(*sdk.TxResponse)
   746  				s.Require().Equal(tc.expectedCode, txResp.Code, out.String())
   747  			}
   748  		})
   749  	}
   750  }