feat: comprehensive test suite (Phase 4.2) (#12)
CI / test (push) Failing after 1m30s

This commit was merged in pull request #12.
This commit is contained in:
2026-06-07 17:54:15 +00:00
parent fe1afe2a97
commit e6e07941a5
11 changed files with 2590 additions and 2 deletions
+187
View File
@@ -186,3 +186,190 @@ func TestRunTraversalUsesHooks(t *testing.T) {
t.Fatalf("expected formatted summary output, got %q", buf.String())
}
}
func TestJSONFormatterWriteResolveAndResult(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
server := net.ParseIP("198.41.0.4")
resp := &traverse.Response{
Referral: ref,
Server: server,
Type: traverse.RespAnswer,
Decoded: &dns.DecodedResponse{
Answers: []miekgdns.RR{
&miekgdns.A{
Hdr: miekgdns.RR_Header{Name: "example.com.", Rrtype: dns.TypeA, Class: miekgdns.ClassINET},
A: net.ParseIP("1.2.3.4"),
},
},
},
}
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.Format = FormatJSON
cfg.Domain = "example.com"
cfg.QueryType = "A"
cfg.ShowResolves = true
cfg.ShowAllStats = true
cfg.ShowProgress = true
f := NewFormatter(cfg, &buf).(*jsonFormatter)
// WriteResolve
if err := f.WriteResolve(traverse.TraversalEvent{
Stage: traverse.EventStart,
Result: traverse.TraversalResult{Referral: ref, Response: resp},
}); err != nil {
t.Fatalf("WriteResolve: %v", err)
}
// WriteResult
if err := f.WriteResult(traverse.TraversalResult{Referral: ref, Response: resp}); err != nil {
t.Fatalf("WriteResult: %v", err)
}
// WriteProgress with EventComplete to cover stageName "complete"
if err := f.WriteProgress(traverse.TraversalEvent{
Stage: traverse.EventComplete,
Result: traverse.TraversalResult{Referral: ref, Response: resp},
}); err != nil {
t.Fatalf("WriteProgress EventComplete: %v", err)
}
if err := f.Flush(); err != nil {
t.Fatalf("Flush: %v", err)
}
}
func TestJSONFormatterWriteResolveFlagOff(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.Format = FormatJSON
cfg.ShowResolves = false
cfg.ShowAllStats = false
f := NewFormatter(cfg, &buf).(*jsonFormatter)
if err := f.WriteResolve(traverse.TraversalEvent{
Stage: traverse.EventStart,
Result: traverse.TraversalResult{Referral: ref},
}); err != nil {
t.Fatalf("WriteResolve: %v", err)
}
if err := f.WriteResult(traverse.TraversalResult{Referral: ref}); err != nil {
t.Fatalf("WriteResult: %v", err)
}
}
func TestJSONFormatterWriteSummaryWithServers(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, "com.", 1, 1.0, nil)
server := net.ParseIP("1.2.3.4")
resp := &traverse.Response{
Referral: ref,
Server: server,
Type: traverse.RespAnswer,
Decoded: &dns.DecodedResponse{
Answers: []miekgdns.RR{
&miekgdns.A{
Hdr: miekgdns.RR_Header{Name: "example.com.", Rrtype: dns.TypeA, Class: miekgdns.ClassINET},
A: net.ParseIP("1.2.3.4"),
},
},
},
}
results := []traverse.TraversalResult{{Referral: ref, Response: resp}}
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.Format = FormatJSON
cfg.Domain = "example.com"
cfg.QueryType = "A"
cfg.ShowServers = true
cfg.ShowVersions = false
cfg.ShowResults = true
cfg.ShowSummaryResults = true
f := NewFormatter(cfg, &buf).(*jsonFormatter)
if err := f.WriteSummary(results); err != nil {
t.Fatalf("WriteSummary: %v", err)
}
if err := f.Flush(); err != nil {
t.Fatalf("Flush: %v", err)
}
var payload map[string]any
if err := json.Unmarshal(buf.Bytes(), &payload); err != nil {
t.Fatalf("invalid JSON: %v\n%s", err, buf.String())
}
if _, ok := payload["servers"]; !ok {
t.Error("expected 'servers' field in JSON output")
}
}
func TestNewFormatterNilWriter(t *testing.T) {
// Should not panic with nil writer
cfg := DefaultConfig()
f := NewFormatter(cfg, nil)
if f == nil {
t.Error("NewFormatter should not return nil")
}
}
func TestAttachHooksShowResolves(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
server := net.ParseIP("1.2.3.4")
resp := &traverse.Response{
Referral: ref,
Server: server,
Type: traverse.RespAnswer,
}
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.ShowProgress = false
cfg.ShowResolves = true
cfg.ShowAllStats = true
cfg.Color = false
formatter := NewFormatter(cfg, &buf)
hooks := AttachHooks(cfg, formatter)
// Trigger a resolve event
hooks.OnEvent(traverse.TraversalEvent{
Stage: traverse.EventStart,
IsResolve: true,
Result: traverse.TraversalResult{Referral: ref, Response: resp},
})
if buf.Len() == 0 {
t.Error("expected resolve output when ShowResolves is true")
}
}
func TestAttachHooksShowAllStats(t *testing.T) {
ref := traverse.NewReferral("example.com.", dns.TypeA, ".", 0, 1.0, nil)
server := net.ParseIP("1.2.3.4")
resp := &traverse.Response{
Referral: ref,
Server: server,
Type: traverse.RespAnswer,
Decoded: &dns.DecodedResponse{
Answers: []miekgdns.RR{
&miekgdns.A{Hdr: miekgdns.RR_Header{Name: "example.com.", Rrtype: dns.TypeA, Class: miekgdns.ClassINET}, A: net.ParseIP("1.2.3.4")},
},
},
}
var buf bytes.Buffer
cfg := DefaultConfig()
cfg.ShowProgress = false
cfg.ShowResolves = false
cfg.ShowAllStats = true
cfg.Color = false
formatter := NewFormatter(cfg, &buf)
hooks := AttachHooks(cfg, formatter)
hooks.OnEvent(traverse.TraversalEvent{
Stage: traverse.EventComplete,
Result: traverse.TraversalResult{Referral: ref, Response: resp},
})
}