// ABOUTME: Tests for the summary writer that emits run summaries via slog. // ABOUTME: Validates JSON output, text output, and nil summary handling. package summary import ( "bytes" "strings" "testing" "time" ) func TestSummaryWriter_JSON(t *testing.T) { var buf bytes.Buffer w := NewSummaryWriter(&buf, "json") s := &RunSummary{ StartTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2025, 1, 1, 0, 1, 0, 0, time.UTC), DurationSeconds: 60, SampleCount: 12, CPUTotal: StatSummary{Peak: 95.5, Avg: 42.0, P95: 88.0}, MemUsedBytes: StatSummary{Peak: 8000000, Avg: 4000000, P95: 7500000}, MemUsedPercent: StatSummary{Peak: 80.0, Avg: 40.0, P95: 75.0}, TopCPUProcesses: []ProcessPeak{ {PID: 1, Name: "busy", PeakCPU: 95.5, PeakMem: 1000}, }, TopMemProcesses: []ProcessPeak{ {PID: 2, Name: "hungry", PeakCPU: 10.0, PeakMem: 8000000}, }, } w.Write(s) output := buf.String() if !strings.Contains(output, "run_summary") { t.Errorf("output should contain 'run_summary', got: %s", output) } if !strings.Contains(output, "duration_seconds") { t.Errorf("output should contain 'duration_seconds', got: %s", output) } if !strings.Contains(output, "sample_count") { t.Errorf("output should contain 'sample_count', got: %s", output) } if !strings.Contains(output, "cpu_total_percent") { t.Errorf("output should contain 'cpu_total_percent', got: %s", output) } if !strings.Contains(output, "mem_used_bytes") { t.Errorf("output should contain 'mem_used_bytes', got: %s", output) } if !strings.Contains(output, "top_cpu_processes") { t.Errorf("output should contain 'top_cpu_processes', got: %s", output) } if !strings.Contains(output, "top_mem_processes") { t.Errorf("output should contain 'top_mem_processes', got: %s", output) } } func TestSummaryWriter_Text(t *testing.T) { var buf bytes.Buffer w := NewSummaryWriter(&buf, "text") s := &RunSummary{ StartTime: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2025, 1, 1, 0, 1, 0, 0, time.UTC), DurationSeconds: 60, SampleCount: 12, CPUTotal: StatSummary{Peak: 95.5, Avg: 42.0, P95: 88.0}, MemUsedBytes: StatSummary{Peak: 8000000, Avg: 4000000, P95: 7500000}, MemUsedPercent: StatSummary{Peak: 80.0, Avg: 40.0, P95: 75.0}, } w.Write(s) output := buf.String() if !strings.Contains(output, "run_summary") { t.Errorf("output should contain 'run_summary', got: %s", output) } if !strings.Contains(output, "duration_seconds") { t.Errorf("output should contain 'duration_seconds', got: %s", output) } } func TestSummaryWriter_NilSummary(t *testing.T) { var buf bytes.Buffer w := NewSummaryWriter(&buf, "json") // Should not panic and should not write anything w.Write(nil) if buf.Len() != 0 { t.Errorf("expected no output for nil summary, got: %s", buf.String()) } }