package activity import ( "os" "path/filepath" "testing" "time" "ticktock/internal/autotrack" ) func TestLoadDayParsesAndSkipsMalformed(t *testing.T) { dir := t.TempDir() lines := `{"start": "2026-07-07T08:59:19", "end": "2026-07-07T09:00:09", "secs": 49, "app": "Trace", "title": "", "url": "", "domain": "", "idle": false} this line is not json {"start": "not-a-time", "end": "2026-07-07T09:10:00", "secs": 1, "app": "Bad", "title": "", "url": "", "domain": "", "idle": false} {"start": "2026-07-07T09:30:00", "end": "2026-07-07T10:00:00", "secs": 1800, "app": "", "title": "", "url": "", "domain": "", "idle": true} ` if err := os.WriteFile(filepath.Join(dir, "activity-2026-07-07.jsonl"), []byte(lines), 0o644); err != nil { t.Fatal(err) } segs, err := LoadDay(dir, "2026-07-07") if err != nil { t.Fatalf("tolerant parse must not error: %v", err) } if len(segs) != 2 { t.Fatalf("want 2 valid segments (malformed skipped), got %d", len(segs)) } want := time.Date(2026, 7, 7, 8, 59, 19, 0, time.Local) if segs[0].App != "Trace" || !segs[0].Start.Equal(want) { t.Errorf("seg0 = %+v", segs[0]) } if !segs[1].Idle { t.Errorf("seg1 should be idle: %+v", segs[1]) } } func TestLoadDayMissingFileIsEmptyNoError(t *testing.T) { segs, err := LoadDay(t.TempDir(), "2026-01-01") if err != nil || len(segs) != 0 { t.Fatalf("missing file ⇒ empty, nil; got %v, %v", segs, err) } segs, err = LoadDay("", "2026-01-01") if err != nil || len(segs) != 0 { t.Fatalf("empty dataDir ⇒ empty, nil; got %v, %v", segs, err) } } // Round-trip: what the writer persists, the reader loads back — the two // halves of the port agree on the byte shape. func TestRoundTripWithWriter(t *testing.T) { dir := t.TempDir() start := time.Date(2026, 7, 7, 9, 0, 0, 0, time.Local) seg := &autotrack.Segment{ Ctx: autotrack.Ctx{App: "Safari", Title: "GitHub", URL: "https://github.com/x", Domain: "github.com"}, Start: start, End: start.Add(120 * time.Second), } if err := autotrack.WriteSegment(dir, seg, 15); err != nil { t.Fatal(err) } segs, err := LoadDay(dir, "2026-07-07") if err != nil || len(segs) != 1 { t.Fatalf("round trip failed: %v, %v", segs, err) } got := segs[0] if got.App != "Safari" || got.Domain != "github.com" || got.URL != "https://github.com/x" || !got.Start.Equal(start) || !got.End.Equal(start.Add(120*time.Second)) || got.Idle { t.Errorf("round-trip mismatch: %+v", got) } }