From d6836e5b06c720437522faf213c8483a694fbd13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Attila=20Bir=C3=B3?= Date: Thu, 2 Apr 2026 12:11:24 +0200 Subject: [PATCH] fix: validate --state flag values in issue list and pr list (#106) Reject invalid --state values with clear error message matching gh CLI. - issue list: open, closed, all - pr list: open, closed, merged, all --- pkg/cmd/issue/list/list.go | 6 ++++++ pkg/cmd/issue/list/list_test.go | 13 +++++++++++++ pkg/cmd/pr/list/list.go | 6 ++++++ pkg/cmd/pr/list/list_test.go | 13 +++++++++++++ 4 files changed, 38 insertions(+) diff --git a/pkg/cmd/issue/list/list.go b/pkg/cmd/issue/list/list.go index 20051de..ca32bd9 100644 --- a/pkg/cmd/issue/list/list.go +++ b/pkg/cmd/issue/list/list.go @@ -78,6 +78,12 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command { } func ListRun(opts *ListOptions) error { + switch opts.State { + case "open", "closed", "all": + default: + return fmt.Errorf("invalid state %q: valid values are {open|closed|all}", opts.State) + } + url := fmt.Sprintf("https://%s/api/v1/repos/%s/%s/issues?state=%s&limit=%d&type=issues", opts.Host, opts.Owner, opts.Repo, opts.State, opts.Limit) diff --git a/pkg/cmd/issue/list/list_test.go b/pkg/cmd/issue/list/list_test.go index 7606434..d6ba7b2 100644 --- a/pkg/cmd/issue/list/list_test.go +++ b/pkg/cmd/issue/list/list_test.go @@ -11,6 +11,19 @@ import ( "github.com/stretchr/testify/require" ) +func TestListRun_InvalidState(t *testing.T) { + ios, _, _, _ := iostreams.Test() + + opts := &ListOptions{ + IO: ios, + State: "invalid", + } + + err := ListRun(opts) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid state") +} + func TestListRun_Success(t *testing.T) { reg := &httpmock.Registry{} defer reg.Verify(t) diff --git a/pkg/cmd/pr/list/list.go b/pkg/cmd/pr/list/list.go index 71a7609..0759bac 100644 --- a/pkg/cmd/pr/list/list.go +++ b/pkg/cmd/pr/list/list.go @@ -84,6 +84,12 @@ func NewCmdList(f *cmdutil.Factory) *cobra.Command { } func ListRun(opts *ListOptions) error { + switch opts.State { + case "open", "closed", "merged", "all": + default: + return fmt.Errorf("invalid state %q: valid values are {open|closed|merged|all}", opts.State) + } + url := fmt.Sprintf("https://%s/api/v1/repos/%s/%s/pulls?state=%s&limit=%d", opts.Host, opts.Owner, opts.Repo, opts.State, opts.Limit) diff --git a/pkg/cmd/pr/list/list_test.go b/pkg/cmd/pr/list/list_test.go index dade0df..2cdbef9 100644 --- a/pkg/cmd/pr/list/list_test.go +++ b/pkg/cmd/pr/list/list_test.go @@ -11,6 +11,19 @@ import ( "github.com/stretchr/testify/require" ) +func TestListRun_InvalidState(t *testing.T) { + ios, _, _, _ := iostreams.Test() + + opts := &ListOptions{ + IO: ios, + State: "invalid", + } + + err := ListRun(opts) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid state") +} + func TestListRun_Success(t *testing.T) { reg := &httpmock.Registry{} defer reg.Verify(t)