From c701f4a7554d08e251f068de2dc8c7003f33c6fa Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Mon, 22 Jun 2026 21:26:09 +0200 Subject: [PATCH] fix yaml formatter buffering --- pkg/cmd/cmdutil.go | 3 +-- pkg/cmd/cmdutil_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/cmdutil.go b/pkg/cmd/cmdutil.go index 8607371..fa24189 100644 --- a/pkg/cmd/cmdutil.go +++ b/pkg/cmd/cmdutil.go @@ -552,8 +552,7 @@ func formatJSON(res gjson.Result, opts ShowJSONOpts) ([]byte, error) { if err := json2yaml.Convert(&yaml, input); err != nil { return nil, err } - _, err := opts.Stdout.Write([]byte(yaml.String())) - return nil, err + return []byte(yaml.String()), nil default: return nil, fmt.Errorf("Invalid format: %s, valid formats are: %s", opts.Format, strings.Join(OutputFormats, ", ")) } diff --git a/pkg/cmd/cmdutil_test.go b/pkg/cmd/cmdutil_test.go index 99cc371..371c3b5 100644 --- a/pkg/cmd/cmdutil_test.go +++ b/pkg/cmd/cmdutil_test.go @@ -220,6 +220,25 @@ func TestFormatJSON(t *testing.T) { require.NoError(t, err) require.Equal(t, `{"a":1}`+"\n", string(formatted)) }) + + t.Run("YAMLReturnsBytes", func(t *testing.T) { + t.Parallel() + + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + + res := gjson.Parse(`{"foo":128,"bar":null,"baz":false}`) + formatted, err := formatJSON(res, ShowJSONOpts{Format: "yaml", Stdout: w}) + require.NoError(t, err) + + require.NoError(t, w.Close()) + var buf bytes.Buffer + _, _ = buf.ReadFrom(r) + + assert.Empty(t, buf.String()) + assert.Equal(t, "foo: 128\nbar: null\nbaz: false\n", string(formatted)) + }) } func TestShowJSONIterator(t *testing.T) { @@ -258,6 +277,17 @@ func TestShowJSONIterator(t *testing.T) { captured := captureShowJSONIterator(t, iter, "raw", "", 2) assert.Equal(t, `{"id":"abc"}`+"\n"+`{"id":"def"}`+"\n", captured) }) + + t.Run("YAMLCapturesMultipleItems", func(t *testing.T) { + t.Parallel() + + iter := &sliceIterator[map[string]any]{items: []map[string]any{ + {"id": "abc"}, + {"id": "def"}, + }} + captured := captureShowJSONIterator(t, iter, "yaml", "", -1) + assert.Equal(t, "id: abc\nid: def\n", captured) + }) } func TestExploreFallback(t *testing.T) {