Files
commandkit/reporter_deferred_test.go

70 lines
2.4 KiB
Go

package commandkit
import (
"bytes"
"errors"
"fmt"
"io"
"strings"
"testing"
)
func TestHiddenSimpleDeferredMessagesDoNotAccumulate(t *testing.T) {
for _, mode := range []reportingMode{modeOrdinary, modeQuiet} {
t.Run(fmt.Sprint(mode), func(t *testing.T) {
reporter := newReporter(Streams{})
reporter.setVisibility(mode, false, false)
for index := 0; index < 256; index++ {
if err := reporter.AtEnd().Debug(fmt.Sprintf("hidden %d", index), nil); err != nil {
t.Fatal(err)
}
if err := reporter.AtEnd().Warn("hidden warning"); err != nil {
t.Fatal(err)
}
}
// This assertion owns the storage optimization, not a public queue API.
if len(reporter.state.deferred) != 0 {
t.Fatalf("retained %d renderer-free hidden messages", len(reporter.state.deferred))
}
got := reporter.finalize(Success(), nil)
if got.Status != 0 || got.Presentation.Diagnostics.State != DeliverySuppressed {
t.Fatalf("outcome=%#v", got)
}
if err := reporter.AtEnd().Debug("late"); !errors.Is(err, ErrReporterClosed) {
t.Fatalf("closed hidden submission=%v", err)
}
})
}
noContent := newReporter(Streams{})
_ = noContent.AtEnd().Warn("", nil)
if got := noContent.finalize(Success(), nil); got.Presentation.Diagnostics.State != DeliveryNone {
t.Fatalf("empty deferred submission became content: %#v", got)
}
}
func TestHiddenDeferredDetailsRemainDeferredAndCaptured(t *testing.T) {
var diagnostics bytes.Buffer
reporter := newReporter(Streams{Err: &diagnostics})
reporter.setVisibility(modeQuiet, false, false)
failure := errors.New("hidden rendering failed")
var order []string
details := []Detail{func(w io.Writer) error {
order = append(order, "first")
_, _ = io.WriteString(w, "hidden detail")
return failure
}}
_ = reporter.AtEnd().Warn("hidden", details...)
details[0] = func(io.Writer) error { t.Error("caller changed captured callback"); return nil }
_ = reporter.AtEnd().Info("", func(io.Writer) error { order = append(order, "second"); return nil })
if len(order) != 0 {
t.Fatal("details ran at submission")
}
got := reporter.finalize(Success(), nil)
if strings.Join(order, ",") != "first,second" || !errors.Is(got.Presentation.Diagnostics.RenderError, failure) || got.Status != 1 {
t.Fatalf("order=%v outcome=%#v", order, got)
}
if strings.Contains(diagnostics.String(), "hidden") || len(reporter.state.deferred) != 0 {
t.Fatalf("hidden content leaked or queue retained: %q", diagnostics.String())
}
}