summaryrefslogtreecommitdiff
path: root/internal/handlers/timeline_logic_test.go
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-02-06 14:53:47 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-02-06 14:53:47 -1000
commit27ee1a271248e9f1de8ecb981a6cabfa8e498b1b (patch)
tree7a5b8555ea4199094104f3e2b1227c08a33037ed /internal/handlers/timeline_logic_test.go
parent0a1001eb0bd2d1f7c0624ae1ef8ae7ccdb3447d4 (diff)
Fix missing settings button, disappeared events, and tab refresh bug
- Add settings gear icon link to dashboard header - Fix GetTasksByDateRange/GetCardsByDateRange to include overdue items (changed from BETWEEN to <= end, filter completed tasks) - Fix refresh replacing active tab with tasks tab by using htmx.trigger(body, 'refresh-tasks') instead of innerHTML+htmx.process - Add refresh-tasks hx-trigger to meals, shopping, conditions tabs - Add tests for overdue inclusion/exclusion, settings link, template data Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/handlers/timeline_logic_test.go')
-rw-r--r--internal/handlers/timeline_logic_test.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/internal/handlers/timeline_logic_test.go b/internal/handlers/timeline_logic_test.go
index 9a71741..11406b9 100644
--- a/internal/handlers/timeline_logic_test.go
+++ b/internal/handlers/timeline_logic_test.go
@@ -251,6 +251,78 @@ func TestCalcCalendarBounds(t *testing.T) {
}
}
+func TestBuildTimeline_IncludesOverdueItems(t *testing.T) {
+ s := setupTestStore(t)
+
+ // Base: "today" is Jan 2, 2023
+ today := time.Date(2023, 1, 2, 0, 0, 0, 0, time.UTC)
+ yesterday := time.Date(2023, 1, 1, 10, 0, 0, 0, time.UTC) // overdue
+ todayNoon := time.Date(2023, 1, 2, 12, 0, 0, 0, time.UTC) // current
+
+ // Save a task that is overdue (yesterday) and one that is current (today)
+ _ = s.SaveTasks([]models.Task{
+ {ID: "overdue1", Content: "Overdue task", DueDate: &yesterday},
+ {ID: "current1", Content: "Current task", DueDate: &todayNoon},
+ })
+
+ // Query range: today through tomorrow
+ end := today.AddDate(0, 0, 1)
+
+ items, err := BuildTimeline(context.Background(), s, nil, nil, today, end)
+ if err != nil {
+ t.Fatalf("BuildTimeline failed: %v", err)
+ }
+
+ // Should include both the overdue task and the current task
+ if len(items) < 2 {
+ t.Errorf("Expected at least 2 items (overdue + current), got %d", len(items))
+ for _, item := range items {
+ t.Logf(" item: %s (type=%s, time=%s)", item.Title, item.Type, item.Time)
+ }
+ }
+
+ // Verify overdue task is marked as overdue
+ foundOverdue := false
+ for _, item := range items {
+ if item.ID == "overdue1" {
+ foundOverdue = true
+ if !item.IsOverdue {
+ t.Error("Expected overdue task to be marked IsOverdue=true")
+ }
+ if item.DaySection != models.DaySectionToday {
+ t.Errorf("Expected overdue task in Today section, got %s", item.DaySection)
+ }
+ }
+ }
+ if !foundOverdue {
+ t.Error("Overdue task was not included in timeline results")
+ }
+}
+
+func TestBuildTimeline_ExcludesCompletedOverdue(t *testing.T) {
+ s := setupTestStore(t)
+
+ yesterday := time.Date(2023, 1, 1, 10, 0, 0, 0, time.UTC)
+ today := time.Date(2023, 1, 2, 0, 0, 0, 0, time.UTC)
+ end := today.AddDate(0, 0, 1)
+
+ // Save a completed overdue task — should NOT appear
+ _ = s.SaveTasks([]models.Task{
+ {ID: "done1", Content: "Done overdue", DueDate: &yesterday, Completed: true},
+ })
+
+ items, err := BuildTimeline(context.Background(), s, nil, nil, today, end)
+ if err != nil {
+ t.Fatalf("BuildTimeline failed: %v", err)
+ }
+
+ for _, item := range items {
+ if item.ID == "done1" {
+ t.Error("Completed overdue task should not appear in timeline")
+ }
+ }
+}
+
func timePtr(t time.Time) *time.Time {
return &t
}