summaryrefslogtreecommitdiff
path: root/internal/handlers/timeline_multiday_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/handlers/timeline_multiday_test.go')
-rw-r--r--internal/handlers/timeline_multiday_test.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/internal/handlers/timeline_multiday_test.go b/internal/handlers/timeline_multiday_test.go
new file mode 100644
index 0000000..3dc2005
--- /dev/null
+++ b/internal/handlers/timeline_multiday_test.go
@@ -0,0 +1,83 @@
+package handlers
+
+import (
+ "testing"
+ "time"
+
+ "task-dashboard/internal/models"
+)
+
+func multiDayEvent(startISO, endISO string) models.TimelineItem {
+ start, _ := time.Parse(time.RFC3339, startISO)
+ end, _ := time.Parse(time.RFC3339, endISO)
+ return models.TimelineItem{
+ ID: "evt-1",
+ Title: "Offsite",
+ Type: models.TimelineItemTypeEvent,
+ Time: start,
+ EndTime: &end,
+ }
+}
+
+func TestIsMultiDayEvent_SameDayTimedEvent_False(t *testing.T) {
+ item := multiDayEvent("2026-07-13T10:00:00Z", "2026-07-13T11:00:00Z")
+ if isMultiDayEvent(item) {
+ t.Error("expected same-day timed event to not be multi-day")
+ }
+}
+
+func TestIsMultiDayEvent_SpansMultipleDays_True(t *testing.T) {
+ item := multiDayEvent("2026-07-13T17:35:00Z", "2026-07-30T22:30:00Z")
+ if !isMultiDayEvent(item) {
+ t.Error("expected event spanning multiple days to be multi-day")
+ }
+}
+
+func TestIsMultiDayEvent_NonEventType_AlwaysFalse(t *testing.T) {
+ start, _ := time.Parse(time.RFC3339, "2026-07-13T10:00:00Z")
+ end, _ := time.Parse(time.RFC3339, "2026-07-30T22:30:00Z")
+ item := models.TimelineItem{ID: "t1", Type: models.TimelineItemTypeTask, Time: start, EndTime: &end}
+ if isMultiDayEvent(item) {
+ t.Error("expected non-event type to never be considered multi-day, regardless of span")
+ }
+}
+
+func TestIsMultiDayEvent_NoEndTime_False(t *testing.T) {
+ start, _ := time.Parse(time.RFC3339, "2026-07-13T10:00:00Z")
+ item := models.TimelineItem{ID: "e1", Type: models.TimelineItemTypeEvent, Time: start}
+ if isMultiDayEvent(item) {
+ t.Error("expected event with nil EndTime to not be multi-day")
+ }
+}
+
+func TestMultiDayVariant_StartDay_ReturnsStarts(t *testing.T) {
+ item := multiDayEvent("2026-07-13T17:35:00Z", "2026-07-30T22:30:00Z")
+ renderDay, _ := time.Parse(time.RFC3339, "2026-07-13T00:00:00Z")
+ if got := multiDayVariant(item, renderDay); got != "starts" {
+ t.Errorf("variant = %q, want %q", got, "starts")
+ }
+}
+
+func TestMultiDayVariant_EndDay_ReturnsEnds(t *testing.T) {
+ item := multiDayEvent("2026-07-13T17:35:00Z", "2026-07-30T22:30:00Z")
+ renderDay, _ := time.Parse(time.RFC3339, "2026-07-30T00:00:00Z")
+ if got := multiDayVariant(item, renderDay); got != "ends" {
+ t.Errorf("variant = %q, want %q", got, "ends")
+ }
+}
+
+func TestMultiDayVariant_MiddleDay_ReturnsSpans(t *testing.T) {
+ item := multiDayEvent("2026-07-13T17:35:00Z", "2026-07-30T22:30:00Z")
+ renderDay, _ := time.Parse(time.RFC3339, "2026-07-20T00:00:00Z")
+ if got := multiDayVariant(item, renderDay); got != "spans" {
+ t.Errorf("variant = %q, want %q", got, "spans")
+ }
+}
+
+func TestMultiDayVariant_DayOutsideSpan_ReturnsEmpty(t *testing.T) {
+ item := multiDayEvent("2026-07-13T17:35:00Z", "2026-07-30T22:30:00Z")
+ renderDay, _ := time.Parse(time.RFC3339, "2026-08-01T00:00:00Z")
+ if got := multiDayVariant(item, renderDay); got != "" {
+ t.Errorf("variant = %q, want empty", got)
+ }
+}