diff --git a/x/gov/client/cli/cli_test.go b/x/gov/client/cli/cli_test.go index 981b13024c47..f0ee9b40e5ac 100644 --- a/x/gov/client/cli/cli_test.go +++ b/x/gov/client/cli/cli_test.go @@ -419,6 +419,14 @@ func (s *IntegrationTestSuite) TestCmdGetProposals() { }, false, }, + { + "get proposals with invalid status", + []string{ + "--status=unknown", + fmt.Sprintf("--%s=json", tmcli.OutputFlag), + }, + true, + }, } for _, tc := range testCases { diff --git a/x/gov/client/rest/grpc_query_test.go b/x/gov/client/rest/grpc_query_test.go index 8e2d4efa9ffa..885bf1c8f850 100644 --- a/x/gov/client/rest/grpc_query_test.go +++ b/x/gov/client/rest/grpc_query_test.go @@ -107,10 +107,11 @@ func (s *IntegrationTestSuite) TestGetProposalsGRPC() { val := s.network.Validators[0] testCases := []struct { - name string - url string - headers map[string]string - expErr bool + name string + url string + headers map[string]string + wantNumProposals int + expErr bool }{ { "get proposals with height 1", @@ -118,12 +119,21 @@ func (s *IntegrationTestSuite) TestGetProposalsGRPC() { map[string]string{ grpctypes.GRPCBlockHeightHeader: "1", }, + 0, true, }, { "valid request", fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals", val.APIAddress), map[string]string{}, + 3, + false, + }, + { + "valid request with filter by status", + fmt.Sprintf("%s/cosmos/gov/v1beta1/proposals?proposal_status=1", val.APIAddress), + map[string]string{}, + 1, false, }, } @@ -141,7 +151,11 @@ func (s *IntegrationTestSuite) TestGetProposalsGRPC() { s.Require().Empty(proposals.Proposals) } else { s.Require().NoError(err) +<<<<<<< HEAD s.Require().Len(proposals.Proposals, 2) +======= + s.Require().Len(proposals.Proposals, tc.wantNumProposals) +>>>>>>> be23295bd... x/gov: fix NormalizeProposalType() return values (#8808) } }) } diff --git a/x/gov/client/rest/rest_test.go b/x/gov/client/rest/rest_test.go index 0b1a274022cb..61c248da98c1 100644 --- a/x/gov/client/rest/rest_test.go +++ b/x/gov/client/rest/rest_test.go @@ -9,6 +9,62 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/types" ) +func (s *IntegrationTestSuite) TestLegacyGetAllProposals() { + val := s.network.Validators[0] + + testCases := []struct { + name string + url string + numProposals int + expErr bool + expErrMsg string + }{ + { + "get all existing proposals", + fmt.Sprintf("%s/gov/proposals", val.APIAddress), + 3, false, "", + }, + { + "get proposals in deposit period", + fmt.Sprintf("%s/gov/proposals?status=deposit_period", val.APIAddress), + 1, false, "", + }, + { + "get proposals in voting period", + fmt.Sprintf("%s/gov/proposals?status=voting_period", val.APIAddress), + 2, false, "", + }, + { + "wrong status parameter", + fmt.Sprintf("%s/gov/proposals?status=invalidstatus", val.APIAddress), + 0, true, "'invalidstatus' is not a valid proposal status", + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + respJSON, err := rest.GetRequest(tc.url) + s.Require().NoError(err) + + if tc.expErr { + var errResp rest.ErrorResponse + s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(respJSON, &errResp)) + s.Require().Equal(errResp.Error, tc.expErrMsg) + } else { + var resp = rest.ResponseWithHeight{} + err = val.ClientCtx.LegacyAmino.UnmarshalJSON(respJSON, &resp) + s.Require().NoError(err) + + // Check results. + var proposals types.Proposals + s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(resp.Result, &proposals)) + s.Require().Equal(tc.numProposals, len(proposals)) + } + }) + } +} + func (s *IntegrationTestSuite) TestLegacyGetVote() { val := s.network.Validators[0] voterAddressBech32 := val.Address.String() diff --git a/x/gov/client/utils/utils.go b/x/gov/client/utils/utils.go index 84c2884d1a7f..86e4dc5f3e96 100644 --- a/x/gov/client/utils/utils.go +++ b/x/gov/client/utils/utils.go @@ -37,13 +37,13 @@ func NormalizeProposalType(proposalType string) string { func NormalizeProposalStatus(status string) string { switch status { case "DepositPeriod", "deposit_period": - return "DepositPeriod" + return types.StatusDepositPeriod.String() case "VotingPeriod", "voting_period": - return "VotingPeriod" + return types.StatusVotingPeriod.String() case "Passed", "passed": - return "Passed" + return types.StatusPassed.String() case "Rejected", "rejected": - return "Rejected" + return types.StatusRejected.String() default: return status } diff --git a/x/gov/client/utils/utils_test.go b/x/gov/client/utils/utils_test.go new file mode 100644 index 000000000000..bc3c43ca81d6 --- /dev/null +++ b/x/gov/client/utils/utils_test.go @@ -0,0 +1,84 @@ +package utils_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/x/gov/client/utils" +) + +func TestNormalizeWeightedVoteOptions(t *testing.T) { + cases := map[string]struct { + options string + normalized string + }{ + "simple Yes": { + options: "Yes", + normalized: "VOTE_OPTION_YES=1", + }, + "simple yes": { + options: "yes", + normalized: "VOTE_OPTION_YES=1", + }, + "formal yes": { + options: "yes=1", + normalized: "VOTE_OPTION_YES=1", + }, + "half yes half no": { + options: "yes=0.5,no=0.5", + normalized: "VOTE_OPTION_YES=0.5,VOTE_OPTION_NO=0.5", + }, + "3 options": { + options: "Yes=0.5,No=0.4,NoWithVeto=0.1", + normalized: "VOTE_OPTION_YES=0.5,VOTE_OPTION_NO=0.4,VOTE_OPTION_NO_WITH_VETO=0.1", + }, + "zero weight option": { + options: "Yes=0.5,No=0.5,NoWithVeto=0", + normalized: "VOTE_OPTION_YES=0.5,VOTE_OPTION_NO=0.5,VOTE_OPTION_NO_WITH_VETO=0", + }, + "minus weight option": { + options: "Yes=0.5,No=0.6,NoWithVeto=-0.1", + normalized: "VOTE_OPTION_YES=0.5,VOTE_OPTION_NO=0.6,VOTE_OPTION_NO_WITH_VETO=-0.1", + }, + "empty options": { + options: "", + normalized: "=1", + }, + "not available option": { + options: "Yessss=1", + normalized: "Yessss=1", + }, + } + + for _, tc := range cases { + normalized := utils.NormalizeWeightedVoteOptions(tc.options) + require.Equal(t, normalized, tc.normalized) + } +} + +func TestNormalizeProposalStatus(t *testing.T) { + type args struct { + status string + } + tests := []struct { + name string + args args + want string + }{ + {"invalid", args{"unknown"}, "unknown"}, + {"deposit_period", args{"deposit_period"}, "PROPOSAL_STATUS_DEPOSIT_PERIOD"}, + {"DepositPeriod", args{"DepositPeriod"}, "PROPOSAL_STATUS_DEPOSIT_PERIOD"}, + {"voting_period", args{"deposit_period"}, "PROPOSAL_STATUS_DEPOSIT_PERIOD"}, + {"VotingPeriod", args{"DepositPeriod"}, "PROPOSAL_STATUS_DEPOSIT_PERIOD"}, + {"passed", args{"passed"}, "PROPOSAL_STATUS_PASSED"}, + {"Passed", args{"Passed"}, "PROPOSAL_STATUS_PASSED"}, + {"Rejected", args{"Rejected"}, "PROPOSAL_STATUS_REJECTED"}, + {"rejected", args{"rejected"}, "PROPOSAL_STATUS_REJECTED"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, utils.NormalizeProposalStatus(tt.args.status)) + }) + } +}