feat: implement output formatting and display (HAN-383)
CI / test (pull_request) Failing after 2m2s

Add text and JSON formatters with real-time progress via traverser hooks,
summary statistics, and CLI integration for --show-* and --json flags.

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
Gary Hansen
2026-06-08 02:21:13 +10:00
co-authored by multica-agent
parent 876542b2de
commit 5a54834c5f
13 changed files with 1359 additions and 180 deletions
+65
View File
@@ -0,0 +1,65 @@
package output
import (
"bytes"
"strings"
"testing"
"github.com/hits/ExploreDNS/internal/dns"
"github.com/hits/ExploreDNS/internal/traverse"
)
func TestTextFormatterProgressIndentation(t *testing.T) {
root := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
child := traverse.NewReferral("example.com.", dns.TypeA, "com.", 1, 0.5, root)
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.Color = false
formatter := newTextFormatter(cfg, &buf)
if err := formatter.WriteProgress(traverse.TraversalEvent{
Stage: traverse.EventStart,
Result: traverse.TraversalResult{Referral: child},
}); err != nil {
t.Fatalf("WriteProgress: %v", err)
}
out := buf.String()
if !strings.HasPrefix(out, " 2 ") {
t.Fatalf("expected depth-based indentation, got %q", out)
}
}
func TestAttachHooksRespectsShowFlags(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
var progressCount int
cfg := DefaultConfig()
cfg.ShowProgress = false
cfg.ShowResolves = false
cfg.ShowAllStats = false
var buf bytes.Buffer
formatter := NewFormatter(cfg, &buf)
hooks := AttachHooks(cfg, formatter)
hooks.OnEvent(traverse.TraversalEvent{
Stage: traverse.EventStart,
Result: traverse.TraversalResult{Referral: ref},
})
if buf.Len() != 0 {
t.Fatalf("expected no output when ShowProgress is false")
}
cfg.ShowProgress = true
hooks = AttachHooks(cfg, formatter)
hooks.OnEvent(traverse.TraversalEvent{
Stage: traverse.EventStart,
Result: traverse.TraversalResult{Referral: ref},
})
progressCount = strings.Count(buf.String(), "\n")
if progressCount == 0 {
t.Fatal("expected progress output when ShowProgress is true")
}
}