package analytics import ( "context" "testing" "time" "github.com/carlosframework/platform/internal/release" ) func TestReadRangeMergesBoxesAndDays(t *testing.T) { ctx := context.Background() s := release.NewDirStore(t.TempDir()) d1 := delta("box-a", 1, 10) d2 := delta("box-b", 1, 5) d3 := delta("box-a", 2, 7) d3.Date = "2026-09-08" d3.Restarted = true for _, d := range []Delta{d1, d2, d3} { if err := UpsertDay(ctx, s, "bab", "web", d); err != nil { t.Fatal(err) } } from := time.Date(2026, 9, 7, 0, 0, 0, 0, time.UTC) sum, err := ReadRange(ctx, s, "bab", "web", from, from.Add(24*time.Hour)) if err != nil { t.Fatal(err) } if len(sum.Days) != 2 || sum.Days[0].Date != "2026-09-07" || sum.Days[0].PV != 15 || sum.Days[1].PV != 7 { t.Fatalf("days = %+v", sum.Days) } if sum.PV != 22 || sum.Pages["/"] != 22 || sum.Days[0].Hours[9] != 15 || !sum.Days[1].Restarted || sum.Days[0].Restarted { t.Fatalf("summary = %+v", sum) } if sum.Visitors != sum.Days[0].Visitors+sum.Days[1].Visitors || sum.Days[0].Visitors < 1 { t.Fatalf("visitors must be daily sums: %+v", sum) } if len(sum.Boxes) != 2 { t.Fatalf("boxes = %v", sum.Boxes) } // An app with no day files reads as an empty summary, not an error. empty, err := ReadRange(ctx, s, "bab", "nothing", from, from) if err != nil || empty.PV != 0 || len(empty.Days) != 1 { t.Fatalf("empty = %+v %v", empty, err) } }