bindbox-game/internal/api/admin/dashboard_admin_test.go
2026-03-05 12:50:06 +08:00

119 lines
3.4 KiB
Go
Executable File

package admin
import (
"testing"
"time"
)
func TestPercentChange(t *testing.T) {
if s := percentChange(0, 10); s != "+0%" {
t.Fatalf("prev0")
}
if s := percentChange(10, 15); s == "" {
t.Fatalf("empty")
}
}
func TestPreviousWindow(t *testing.T) {
s := time.Date(2025, 1, 1, 0, 0, 0, 0, time.Local)
e := s.Add(7 * 24 * time.Hour).Add(-time.Second)
ps, pe := previousWindow(s, e)
if !pe.Before(s) {
t.Fatalf("pe not before start")
}
if ps.After(pe) {
t.Fatalf("ps after pe")
}
}
func TestDaysBetween(t *testing.T) {
s := time.Date(2025, 1, 1, 0, 0, 0, 0, time.Local)
e := time.Date(2025, 1, 03, 23, 59, 59, 0, time.Local)
ds := daysBetween(s, e)
if len(ds) != 3 {
t.Fatalf("expect3")
}
}
func TestParseSalesTrendRange_PrefersStartEnd(t *testing.T) {
now := time.Date(2026, 3, 3, 12, 0, 0, 0, time.UTC)
s, e := parseSalesTrendRange("week", "2026-01-01", "2026-01-10", now, nil)
if !s.Equal(time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)) {
t.Fatalf("unexpected start: %v", s)
}
if !e.Equal(time.Date(2026, 1, 10, 23, 59, 59, 0, time.UTC)) {
t.Fatalf("unexpected end: %v", e)
}
}
func TestParseSalesTrendRange_AliasAndAllFallback(t *testing.T) {
now := time.Date(2026, 3, 3, 12, 0, 0, 0, time.UTC)
sWeek, eWeek := parseSalesTrendRange("week", "", "", now, nil)
if !eWeek.Equal(now) {
t.Fatalf("week end should be now")
}
if sWeek.Sub(eWeek) != -7*24*time.Hour {
t.Fatalf("week should be 7 days")
}
sMonth, eMonth := parseSalesTrendRange("month", "", "", now, nil)
if !eMonth.Equal(now) {
t.Fatalf("month end should be now")
}
if sMonth.Sub(eMonth) != -30*24*time.Hour {
t.Fatalf("month should be 30 days")
}
sAllFallback, eAllFallback := parseSalesTrendRange("all", "", "", now, nil)
if !eAllFallback.Equal(now) {
t.Fatalf("all fallback end should be now")
}
if sAllFallback.Sub(eAllFallback) != -30*24*time.Hour {
t.Fatalf("all fallback should be 30 days")
}
allStart := time.Date(2025, 1, 15, 10, 0, 0, 0, time.UTC)
sAll, eAll := parseSalesTrendRange("all", "", "", now, &allStart)
if !sAll.Equal(time.Date(2025, 1, 15, 0, 0, 0, 0, time.UTC)) {
t.Fatalf("all start should align to date start, got: %v", sAll)
}
if !eAll.Equal(now) {
t.Fatalf("all end should be now")
}
}
func TestParseSalesTrendRange_CustomSpanCap(t *testing.T) {
now := time.Date(2026, 3, 3, 12, 0, 0, 0, time.UTC)
s, e := parseSalesTrendRange("custom", "2025-01-01", "2026-12-31", now, nil)
expectedStart := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
expectedEnd := expectedStart.Add(365 * 24 * time.Hour).Add(-time.Second)
if !s.Equal(expectedStart) {
t.Fatalf("unexpected custom start: %v", s)
}
if !e.Equal(expectedEnd) {
t.Fatalf("unexpected custom end: %v", e)
}
}
func TestShouldUseMonthlyGranularityForAll(t *testing.T) {
start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
endLong := start.Add(181 * 24 * time.Hour)
endShort := start.Add(180 * 24 * time.Hour)
if !shouldUseMonthlyGranularityForAll("all", "day", start, endLong) {
t.Fatalf("expected monthly for all with >180 days")
}
if shouldUseMonthlyGranularityForAll("all", "day", start, endShort) {
t.Fatalf("should not switch for exactly 180 days")
}
if shouldUseMonthlyGranularityForAll("week", "day", start, endLong) {
t.Fatalf("non-all rangeType should not switch")
}
if shouldUseMonthlyGranularityForAll("all", "month", start, endLong) {
t.Fatalf("non-day granularity should not switch")
}
}