diff --git a/internal/service/week_service.go b/internal/service/week_service.go index 5634861..f94d288 100644 --- a/internal/service/week_service.go +++ b/internal/service/week_service.go @@ -65,8 +65,11 @@ func weekDayKeys(weekKey string, tz *time.Location) ([]string, error) { // Find the Monday of that ISO week. // Jan 4 is always in week 1 of its year. jan4 := time.Date(year, time.January, 4, 0, 0, 0, 0, tz) + // (weekday+6)%7 gives days-since-Monday (Mon=0 … Sun=6), avoiding the + // sign issue when Weekday()==0 (Sunday) with the naive subtraction. + daysSinceMonday := int(jan4.Weekday()+6) % 7 _, jan4Week := jan4.ISOWeek() - monday := jan4.AddDate(0, 0, -int(jan4.Weekday()-time.Monday)+(week-jan4Week)*7) + monday := jan4.AddDate(0, 0, -daysSinceMonday+(week-jan4Week)*7) keys := make([]string, 7) for i := 0; i < 7; i++ { diff --git a/internal/service/week_service_test.go b/internal/service/week_service_test.go index a52781f..3224997 100644 --- a/internal/service/week_service_test.go +++ b/internal/service/week_service_test.go @@ -34,18 +34,30 @@ func newFullServices(t *testing.T) (*service.EntryService, *service.DayService, func TestWeekDayKeys(t *testing.T) { tz, _ := time.LoadLocation("UTC") - keys, err := service.WeekDayKeysExported("2024-W03", tz) - if err != nil { - t.Fatal(err) + + cases := []struct { + weekKey string + wantMon string + wantSun string + }{ + {"2024-W03", "2024-01-15", "2024-01-21"}, // Jan 4 = Thursday + {"2026-W18", "2026-04-27", "2026-05-03"}, // Jan 4 = Sunday — was broken + {"2023-W01", "2023-01-02", "2023-01-08"}, // Jan 4 = Wednesday } - if len(keys) != 7 { - t.Fatalf("expected 7 keys, got %d", len(keys)) - } - if keys[0] != "2024-01-15" { - t.Errorf("expected Monday 2024-01-15, got %s", keys[0]) - } - if keys[6] != "2024-01-21" { - t.Errorf("expected Sunday 2024-01-21, got %s", keys[6]) + for _, tc := range cases { + keys, err := service.WeekDayKeysExported(tc.weekKey, tz) + if err != nil { + t.Fatalf("%s: %v", tc.weekKey, err) + } + if len(keys) != 7 { + t.Fatalf("%s: expected 7 keys, got %d", tc.weekKey, len(keys)) + } + if keys[0] != tc.wantMon { + t.Errorf("%s: Monday want %s, got %s", tc.weekKey, tc.wantMon, keys[0]) + } + if keys[6] != tc.wantSun { + t.Errorf("%s: Sunday want %s, got %s", tc.weekKey, tc.wantSun, keys[6]) + } } }