Files
task-master/internal/ticket/jsontimestore_test.go
T
2026-10-19 14:19:10 +02:00

129 lines
3.2 KiB
Go

package ticket_test
import (
"path/filepath"
"testing"
"time"
"task/internal/ticket"
)
func TestJSONTimeStoreRoundTrip(t *testing.T) {
dir := t.TempDir()
store := ticket.NewJSONTimeStore(dir)
created, err := store.Create(ticket.TimeEntry{
TicketID: "t1",
ProjectID: "inbox",
Start: time.Now().UTC().Add(-time.Hour),
End: time.Now().UTC(),
Duration: time.Hour,
Source: ticket.SourceManual,
})
if err != nil {
t.Fatal(err)
}
if created.ID == "" {
t.Fatal("expected id")
}
list, err := store.List()
if err != nil || len(list) != 1 {
t.Fatalf("list: %v len=%d", err, len(list))
}
sum, err := store.SumByTicket("t1")
if err != nil || sum != time.Hour {
t.Fatalf("sum: %v %v", err, sum)
}
timer := &ticket.ActiveTimer{TicketID: "t1", ProjectID: "inbox", StartedAt: time.Now().UTC()}
if err := store.SaveActiveTimer(timer); err != nil {
t.Fatal(err)
}
loaded, err := store.LoadActiveTimer()
if err != nil || loaded == nil || loaded.TicketID != "t1" {
t.Fatalf("load timer: %v %+v", err, loaded)
}
if err := store.SaveActiveTimer(nil); err != nil {
t.Fatal(err)
}
if loaded, err = store.LoadActiveTimer(); err != nil || loaded != nil {
t.Fatalf("cleared timer: %v %+v", err, loaded)
}
updated := created
updated.Duration = 90 * time.Minute
if err := store.Update(updated); err != nil {
t.Fatal(err)
}
list, err = store.ListByTicket("t1")
if err != nil || len(list) != 1 || list[0].Duration != 90*time.Minute {
t.Fatalf("after update: %v %+v", err, list)
}
if err := store.Delete(created.ID); err != nil {
t.Fatal(err)
}
list, err = store.List()
if err != nil || len(list) != 0 {
t.Fatalf("after delete: %v len=%d path=%s", err, len(list), filepath.Join(dir, "time_entries.json"))
}
}
func TestJSONTimeStoreDeleteByProject(t *testing.T) {
dir := t.TempDir()
store := ticket.NewJSONTimeStore(dir)
for _, e := range []ticket.TimeEntry{
{TicketID: "a", ProjectID: "p1", Duration: time.Hour, Source: ticket.SourceManual},
{TicketID: "b", ProjectID: "p1", Duration: time.Minute, Source: ticket.SourceManual},
{TicketID: "c", ProjectID: "p2", Duration: 30 * time.Minute, Source: ticket.SourceManual},
} {
if _, err := store.Create(e); err != nil {
t.Fatal(err)
}
}
if err := store.DeleteByProject("p1"); err != nil {
t.Fatal(err)
}
list, err := store.List()
if err != nil || len(list) != 1 || list[0].ProjectID != "p2" {
t.Fatalf("after DeleteByProject: %v %+v", err, list)
}
}
func TestJSONTimeStoreRetargetTicket(t *testing.T) {
dir := t.TempDir()
store := ticket.NewJSONTimeStore(dir)
if _, err := store.Create(ticket.TimeEntry{
TicketID: "t1", ProjectID: "old", Duration: time.Hour, Source: ticket.SourceManual,
}); err != nil {
t.Fatal(err)
}
if _, err := store.Create(ticket.TimeEntry{
TicketID: "t2", ProjectID: "old", Duration: time.Minute, Source: ticket.SourceManual,
}); err != nil {
t.Fatal(err)
}
if err := store.RetargetTicket("t1", "new"); err != nil {
t.Fatal(err)
}
list, err := store.List()
if err != nil {
t.Fatal(err)
}
for _, e := range list {
switch e.TicketID {
case "t1":
if e.ProjectID != "new" {
t.Fatalf("t1 project=%q", e.ProjectID)
}
case "t2":
if e.ProjectID != "old" {
t.Fatalf("t2 project=%q", e.ProjectID)
}
}
}
}