From 155bcfaf21b5f33824e4eb6de2c8862b80a9c416 Mon Sep 17 00:00:00 2001 From: Likhita Polavarapu <78951027+likhita-809@users.noreply.github.com> Date: Thu, 3 Nov 2022 22:39:23 +0530 Subject: [PATCH] refactor(distribution): CLI tests using Tendermint Mock (#13692) * move distribution cli tests to e2e tests * wip: add cli tests * wip: remove duplicate helpers.go file * fix something Co-authored-by: Julien Robert Co-authored-by: atheeshp <59333759+atheeshp@users.noreply.github.com> Co-authored-by: Marko --- tests/e2e/distribution/cli_test.go | 8 +- .../e2e/distribution}/grpc_query_suite.go | 2 +- .../e2e/distribution}/suite.go | 5 +- .../e2e/distribution}/withdraw_all_suite.go | 2 +- x/distribution/client/cli/suite_test.go | 710 ++++++++++++++++++ 5 files changed, 718 insertions(+), 9 deletions(-) rename {x/distribution/client/testutil => tests/e2e/distribution}/grpc_query_suite.go (99%) rename {x/distribution/client/testutil => tests/e2e/distribution}/suite.go (99%) rename {x/distribution/client/testutil => tests/e2e/distribution}/withdraw_all_suite.go (99%) create mode 100644 x/distribution/client/cli/suite_test.go diff --git a/tests/e2e/distribution/cli_test.go b/tests/e2e/distribution/cli_test.go index 0029be1e38..d7a2b5ba29 100644 --- a/tests/e2e/distribution/cli_test.go +++ b/tests/e2e/distribution/cli_test.go @@ -7,18 +7,16 @@ import ( "testing" "github.com/stretchr/testify/suite" - - "github.com/cosmos/cosmos-sdk/x/distribution/client/testutil" ) func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(testutil.IntegrationTestSuite)) + suite.Run(t, new(IntegrationTestSuite)) } func TestGRPCQueryTestSuite(t *testing.T) { - suite.Run(t, new(testutil.GRPCQueryTestSuite)) + suite.Run(t, new(GRPCQueryTestSuite)) } func TestWithdrawAllSuite(t *testing.T) { - suite.Run(t, new(testutil.WithdrawAllTestSuite)) + suite.Run(t, new(WithdrawAllTestSuite)) } diff --git a/x/distribution/client/testutil/grpc_query_suite.go b/tests/e2e/distribution/grpc_query_suite.go similarity index 99% rename from x/distribution/client/testutil/grpc_query_suite.go rename to tests/e2e/distribution/grpc_query_suite.go index 018f011260..701a6c8ff8 100644 --- a/x/distribution/client/testutil/grpc_query_suite.go +++ b/tests/e2e/distribution/grpc_query_suite.go @@ -1,4 +1,4 @@ -package testutil +package distribution import ( "fmt" diff --git a/x/distribution/client/testutil/suite.go b/tests/e2e/distribution/suite.go similarity index 99% rename from x/distribution/client/testutil/suite.go rename to tests/e2e/distribution/suite.go index e72fba8996..8e775599fb 100644 --- a/x/distribution/client/testutil/suite.go +++ b/tests/e2e/distribution/suite.go @@ -1,4 +1,4 @@ -package testutil +package distribution import ( "encoding/hex" @@ -16,6 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" + distrclitestutil "github.com/cosmos/cosmos-sdk/x/distribution/client/testutil" "github.com/cosmos/cosmos-sdk/x/distribution/testutil" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" @@ -557,7 +558,7 @@ func (s *IntegrationTestSuite) TestNewWithdrawRewardsCmd() { clientCtx := val.ClientCtx _, _ = s.network.WaitForHeightWithTimeout(10, time.Minute) - bz, err := MsgWithdrawDelegatorRewardExec(clientCtx, tc.valAddr, tc.args...) + bz, err := distrclitestutil.MsgWithdrawDelegatorRewardExec(clientCtx, tc.valAddr, tc.args...) if tc.expectErr { s.Require().Error(err) } else { diff --git a/x/distribution/client/testutil/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go similarity index 99% rename from x/distribution/client/testutil/withdraw_all_suite.go rename to tests/e2e/distribution/withdraw_all_suite.go index 8f1c7fbd2f..b32ab47669 100644 --- a/x/distribution/client/testutil/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -1,4 +1,4 @@ -package testutil +package distribution import ( "fmt" diff --git a/x/distribution/client/cli/suite_test.go b/x/distribution/client/cli/suite_test.go new file mode 100644 index 0000000000..48fff7a969 --- /dev/null +++ b/x/distribution/client/cli/suite_test.go @@ -0,0 +1,710 @@ +package cli_test + +import ( + "bytes" + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/cosmos/gogoproto/proto" + "github.com/stretchr/testify/suite" + abci "github.com/tendermint/tendermint/abci/types" + tmbytes "github.com/tendermint/tendermint/libs/bytes" + tmcli "github.com/tendermint/tendermint/libs/cli" + rpcclient "github.com/tendermint/tendermint/rpc/client" + rpcclientmock "github.com/tendermint/tendermint/rpc/client/mock" + coretypes "github.com/tendermint/tendermint/rpc/core/types" + tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/testutil" + clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" + "github.com/cosmos/cosmos-sdk/testutil/network" + sdk "github.com/cosmos/cosmos-sdk/types" + testutilmod "github.com/cosmos/cosmos-sdk/types/module/testutil" + "github.com/cosmos/cosmos-sdk/x/bank" + "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" + distrclitestutil "github.com/cosmos/cosmos-sdk/x/distribution/client/testutil" + distrtestutil "github.com/cosmos/cosmos-sdk/x/distribution/testutil" + "github.com/cosmos/cosmos-sdk/x/gov" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" +) + +var _ client.TendermintRPC = (*mockTendermintRPC)(nil) + +type mockTendermintRPC struct { + rpcclientmock.Client + + responseQuery abci.ResponseQuery +} + +func newMockTendermintRPC(respQuery abci.ResponseQuery) mockTendermintRPC { + return mockTendermintRPC{responseQuery: respQuery} +} + +func (mockTendermintRPC) BroadcastTxSync(context.Context, tmtypes.Tx) (*coretypes.ResultBroadcastTx, error) { + return &coretypes.ResultBroadcastTx{Code: 0}, nil +} + +func (m mockTendermintRPC) ABCIQueryWithOptions( + _ context.Context, + _ string, _ tmbytes.HexBytes, + _ rpcclient.ABCIQueryOptions, +) (*coretypes.ResultABCIQuery, error) { + return &coretypes.ResultABCIQuery{Response: m.responseQuery}, nil +} + +type CLITestSuite struct { + suite.Suite + + kr keyring.Keyring + encCfg testutilmod.TestEncodingConfig + baseCtx client.Context + clientCtx client.Context +} + +func TestCLITestSuite(t *testing.T) { + suite.Run(t, new(CLITestSuite)) +} + +func (s *CLITestSuite) SetupSuite() { + s.encCfg = testutilmod.MakeTestEncodingConfig(gov.AppModuleBasic{}, bank.AppModuleBasic{}) + s.kr = keyring.NewInMemory(s.encCfg.Codec) + s.baseCtx = client.Context{}. + WithKeyring(s.kr). + WithTxConfig(s.encCfg.TxConfig). + WithCodec(s.encCfg.Codec). + WithClient(mockTendermintRPC{Client: rpcclientmock.Client{}}). + WithAccountRetriever(client.MockAccountRetriever{}). + WithOutput(io.Discard). + WithChainID("test-chain") + + var outBuf bytes.Buffer + ctxGen := func() client.Context { + bz, _ := s.encCfg.Codec.Marshal(&sdk.TxResponse{}) + c := newMockTendermintRPC(abci.ResponseQuery{ + Value: bz, + }) + return s.baseCtx.WithClient(c) + } + s.clientCtx = ctxGen().WithOutput(&outBuf) + + cfg, err := network.DefaultConfigWithAppConfig(distrtestutil.AppConfig) + s.Require().NoError(err) + + genesisState := cfg.GenesisState + var mintData minttypes.GenesisState + s.Require().NoError(cfg.Codec.UnmarshalJSON(genesisState[minttypes.ModuleName], &mintData)) + + inflation := sdk.MustNewDecFromStr("1.0") + mintData.Minter.Inflation = inflation + mintData.Params.InflationMin = inflation + mintData.Params.InflationMax = inflation + + mintDataBz, err := cfg.Codec.MarshalJSON(&mintData) + s.Require().NoError(err) + genesisState[minttypes.ModuleName] = mintDataBz + cfg.GenesisState = genesisState +} + +func (s *CLITestSuite) TestGetCmdQueryParams() { + testCases := []struct { + name string + args []string + expectedOutput string + }{ + { + "json output", + []string{fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + `{"community_tax":"0","base_proposer_reward":"0","bonus_proposer_reward":"0","withdraw_addr_enabled":false}`, + }, + { + "text output", + []string{fmt.Sprintf("--%s=text", tmcli.OutputFlag)}, + `base_proposer_reward: "0" +bonus_proposer_reward: "0" +community_tax: "0" +withdraw_addr_enabled: false`, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryParams() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryValidatorDistributionInfo() { + addr := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + val := sdk.ValAddress(addr[0].Address.String()) + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "invalid val address", + []string{"invalid address", fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + true, + }, + { + "json output", + []string{val.String(), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + false, + }, + { + "text output", + []string{val.String(), fmt.Sprintf("--%s=text", tmcli.OutputFlag)}, + false, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorDistributionInfo() + + _, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + } + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryValidatorOutstandingRewards() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + expectedOutput string + }{ + { + "invalid validator address", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + "foo", + }, + true, + "", + }, + { + "json output", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + false, + `{"rewards":[]}`, + }, + { + "text output", + []string{ + fmt.Sprintf("--%s=text", tmcli.OutputFlag), + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), + }, + false, + `rewards: []`, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorOutstandingRewards() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + } + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryValidatorCommission() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + expectedOutput string + }{ + { + "invalid validator address", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + "foo", + }, + true, + "", + }, + { + "json output", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + false, + `{"commission":[]}`, + }, + { + "text output", + []string{ + fmt.Sprintf("--%s=text", tmcli.OutputFlag), + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), + }, + false, + `commission: []`, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorCommission() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + } + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryValidatorSlashes() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + expectedOutput string + }{ + { + "invalid validator address", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + "foo", "1", "3", + }, + true, + "", + }, + { + "invalid start height", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), "-1", "3", + }, + true, + "", + }, + { + "invalid end height", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), "1", "-3", + }, + true, + "", + }, + { + "json output", + []string{ + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), "1", "3", + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + false, + "{\"slashes\":[],\"pagination\":null}", + }, + { + "text output", + []string{ + fmt.Sprintf("--%s=text", tmcli.OutputFlag), + fmt.Sprintf("--%s=3", flags.FlagHeight), + sdk.ValAddress(val[0].Address).String(), "1", "3", + }, + false, + "pagination: null\nslashes: []", + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorSlashes() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + } + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryDelegatorRewards() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + addr := val[0].Address + valAddr := sdk.ValAddress(addr) + + testCases := []struct { + name string + args []string + expectErr bool + expectedOutput string + }{ + { + "invalid delegator address", + []string{ + fmt.Sprintf("--%s=5", flags.FlagHeight), + "foo", valAddr.String(), + }, + true, + "", + }, + { + "invalid validator address", + []string{ + fmt.Sprintf("--%s=5", flags.FlagHeight), + addr.String(), "foo", + }, + true, + "", + }, + { + "json output", + []string{ + fmt.Sprintf("--%s=5", flags.FlagHeight), + addr.String(), + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + false, + `{"rewards":[],"total":[]}`, + }, + { + "json output (specific validator)", + []string{ + fmt.Sprintf("--%s=5", flags.FlagHeight), + addr.String(), valAddr.String(), + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + false, + `{"rewards":[]}`, + }, + { + "text output", + []string{ + fmt.Sprintf("--%s=text", tmcli.OutputFlag), + fmt.Sprintf("--%s=5", flags.FlagHeight), + addr.String(), + }, + false, + `rewards: [] +total: []`, + }, + { + "text output (specific validator)", + []string{ + fmt.Sprintf("--%s=text", tmcli.OutputFlag), + fmt.Sprintf("--%s=5", flags.FlagHeight), + addr.String(), valAddr.String(), + }, + false, + `rewards: []`, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryDelegatorRewards() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + } + }) + } +} + +func (s *CLITestSuite) TestGetCmdQueryCommunityPool() { + testCases := []struct { + name string + args []string + expectedOutput string + }{ + { + "json output", + []string{fmt.Sprintf("--%s=3", flags.FlagHeight), fmt.Sprintf("--%s=json", tmcli.OutputFlag)}, + `{"pool":[]}`, + }, + { + "text output", + []string{fmt.Sprintf("--%s=text", tmcli.OutputFlag), fmt.Sprintf("--%s=3", flags.FlagHeight)}, + `pool: []`, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryCommunityPool() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + }) + } +} + +func (s *CLITestSuite) TestNewWithdrawRewardsCmd() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + valAddr fmt.Stringer + args []string + expectErr bool + respType proto.Message + }{ + { + "invalid validator address", + val[0].Address, + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + true, nil, + }, + { + "valid transaction", + sdk.ValAddress(val[0].Address), + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + false, &sdk.TxResponse{}, + }, + { + "valid transaction (with commission)", + sdk.ValAddress(val[0].Address), + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=true", cli.FlagCommission), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + false, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + bz, err := distrclitestutil.MsgWithdrawDelegatorRewardExec(s.clientCtx, tc.valAddr, tc.args...) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(bz, tc.respType), string(bz)) + } + }) + } +} + +func (s *CLITestSuite) TestNewWithdrawAllRewardsCmd() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + expErrMsg string + respType proto.Message + }{ + { + "invalid transaction (offline)", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagOffline), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + true, + "cannot generate tx in offline mode", + nil, + }, + { + "valid transaction", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + false, "", &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewWithdrawAllRewardsCmd() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + s.Require().Contains(err.Error(), tc.expErrMsg) + } else { + s.Require().NoError(err) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + } + }) + } +} + +func (s *CLITestSuite) TestNewSetWithdrawAddrCmd() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + respType proto.Message + }{ + { + "invalid withdraw address", + []string{ + "foo", + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + true, nil, + }, + { + "valid transaction", + []string{ + val[0].Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + false, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewSetWithdrawAddrCmd() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + } + }) + } +} + +func (s *CLITestSuite) TestNewFundCommunityPoolCmd() { + val := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) + + testCases := []struct { + name string + args []string + expectErr bool + respType proto.Message + }{ + { + "invalid funding amount", + []string{ + "-43foocoin", + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + true, nil, + }, + { + "valid transaction", + []string{ + sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(5431))).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val[0].Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdk.NewInt(10))).String()), + }, + false, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewFundCommunityPoolCmd() + + out, err := clitestutil.ExecTestCLICmd(s.clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(s.clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + } + }) + } +}