package tui import ( "testing" "time" "github.com/lerko/nib/internal/db" ) func TestGroupByDate(t *testing.T) { may19 := time.Date(2026, 5, 19, 10, 0, 0, 0, time.UTC) may19b := time.Date(2026, 5, 19, 14, 0, 0, 0, time.UTC) may18 := time.Date(2026, 5, 18, 9, 0, 0, 0, time.UTC) entities := []*db.Entity{ {ID: "1", CreatedAt: may19, Body: "a"}, {ID: "2", CreatedAt: may19b, Body: "b"}, {ID: "3", CreatedAt: may18, Body: "c"}, } groups := groupByDate(entities) if len(groups) != 2 { t.Fatalf("expected 2 groups, got %d", len(groups)) } if len(groups[0].entities) != 2 { t.Fatalf("first group should have 2 entities, got %d", len(groups[0].entities)) } if len(groups[1].entities) != 1 { t.Fatalf("second group should have 1 entity, got %d", len(groups[1].entities)) } if groups[0].label != "may 19" { t.Fatalf("first group label = %q, want %q", groups[0].label, "may 19") } } func TestGroupByDate_Empty(t *testing.T) { groups := groupByDate(nil) if len(groups) != 0 { t.Fatalf("expected 0 groups, got %d", len(groups)) } } func TestGroupByDate_SingleEntity(t *testing.T) { e := []*db.Entity{{ID: "1", CreatedAt: time.Now(), Body: "solo"}} groups := groupByDate(e) if len(groups) != 1 || len(groups[0].entities) != 1 { t.Fatal("single entity should produce 1 group with 1 entity") } } func TestTruncate(t *testing.T) { tests := []struct { name string input string maxLen int want string }{ {"short enough", "hello", 10, "hello"}, {"exact length", "hello", 5, "hello"}, {"truncated", "hello world", 6, "hello…"}, {"very short max", "hello", 3, "…"}, {"unicode", "héllo wörld", 7, "héllo …"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := truncate(tt.input, tt.maxLen) if got != tt.want { t.Fatalf("truncate(%q, %d) = %q, want %q", tt.input, tt.maxLen, got, tt.want) } }) } } func TestStripAnsi(t *testing.T) { tests := []struct { name string input string want string }{ {"no ansi", "hello", "hello"}, {"with color", "\x1b[31mred\x1b[0m", "red"}, {"empty", "", ""}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := stripAnsi(tt.input) if got != tt.want { t.Fatalf("stripAnsi(%q) = %q, want %q", tt.input, got, tt.want) } }) } }