package main import ( "bytes" "testing" "github.com/carlosframework/platform/internal/analytics" ) func TestPrintAnalytics(t *testing.T) { res := apiAnalyticsResponse{ Range: "7d", PV: 5, Visitors: 4, Bytes: 100, Bots: 0, Pages: map[string]int64{ "/pricing": 3, "/": 2, }, Referers: map[string]int64{ "news.ycombinator.com": 5, }, Events: map[string]int64{ "signup": 1, }, Days: []analytics.DaySummary{ { Date: "2026-09-07", PV: 3, Bytes: 50, Bots: 0, Visitors: 2, Hours: [24]int64{1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }, { Date: "2026-09-06", PV: 2, Bytes: 50, Bots: 0, Visitors: 2, Hours: [24]int64{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, }, }, On: true, } var buf bytes.Buffer printAnalytics(&buf, res) output := buf.String() checks := []string{ "5", // PV count "4", // Visitors count "daily visitors, summed", // text from headline "/pricing", // page "news.ycombinator.com", // referer "signup", // event } for _, check := range checks { if !bytes.Contains(buf.Bytes(), []byte(check)) { t.Errorf("output missing %q:\n%s", check, output) } } } func TestAnalyticsSetFlags(t *testing.T) { tests := []struct { name string count string door string wantErr bool want map[string]string }{ { name: "both flags", count: "edge", door: "on", want: map[string]string{"count": "edge", "door": "on"}, }, { name: "count only", count: "off", want: map[string]string{"count": "off"}, }, { name: "door only", door: "off", want: map[string]string{"door": "off"}, }, { name: "neither", want: map[string]string{}, }, { name: "invalid count", count: "invalid", wantErr: true, }, { name: "invalid door", door: "maybe", wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := analyticsSetBody(tt.count, tt.door) if (err != nil) != tt.wantErr { t.Errorf("analyticsSetBody() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if len(got) != len(tt.want) { t.Errorf("analyticsSetBody() got %v, want %v", got, tt.want) return } for k, v := range tt.want { if got[k] != v { t.Errorf("analyticsSetBody() got %v, want %v", got, tt.want) return } } }) } }