Add date and ticket filters plus entry list to the project time report.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -70,3 +70,48 @@ func TestAggregateByDay(t *testing.T) {
|
||||
t.Fatalf("older day dur=%v", rows[1].Duration)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterEntries(t *testing.T) {
|
||||
d1 := time.Date(2026, 10, 18, 10, 0, 0, 0, time.Local)
|
||||
d2 := time.Date(2026, 10, 20, 11, 0, 0, 0, time.Local)
|
||||
entries := []ticket.TimeEntry{
|
||||
{ID: "1", TicketID: "a", Start: d1, Duration: time.Hour},
|
||||
{ID: "2", TicketID: "b", Start: d2, Duration: 30 * time.Minute},
|
||||
{ID: "3", TicketID: "a", Start: d2, Duration: 15 * time.Minute},
|
||||
}
|
||||
|
||||
byTicket := ticket.FilterEntries(entries, ticket.TimeFilter{TicketID: "a"})
|
||||
if len(byTicket) != 2 {
|
||||
t.Fatalf("ticket filter=%d", len(byTicket))
|
||||
}
|
||||
|
||||
from := time.Date(2026, 10, 19, 0, 0, 0, 0, time.Local)
|
||||
to := ticket.EndOfReportDay(time.Date(2026, 10, 20, 0, 0, 0, 0, time.Local))
|
||||
byRange := ticket.FilterEntries(entries, ticket.TimeFilter{From: from, To: to})
|
||||
if len(byRange) != 2 {
|
||||
t.Fatalf("range filter=%d", len(byRange))
|
||||
}
|
||||
|
||||
both := ticket.FilterEntries(entries, ticket.TimeFilter{From: from, To: to, TicketID: "a"})
|
||||
if len(both) != 1 || both[0].ID != "3" {
|
||||
t.Fatalf("combined=%+v", both)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseReportDay(t *testing.T) {
|
||||
got, err := ticket.ParseReportDay("2026-10-18")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
y, m, d := got.Date()
|
||||
if y != 2026 || m != 10 || d != 18 || got.Hour() != 0 {
|
||||
t.Fatalf("got %v", got)
|
||||
}
|
||||
empty, err := ticket.ParseReportDay("")
|
||||
if err != nil || !empty.IsZero() {
|
||||
t.Fatalf("empty: %v %v", empty, err)
|
||||
}
|
||||
if _, err := ticket.ParseReportDay("nope"); err == nil {
|
||||
t.Fatal("expected error")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user