Skip to content

Commit 0b53739

Browse files
committed
fix(bounds): adjust weekly bounds when run on Sunday
The expression -int(date.Weekday()-time.Monday) was used as an offset from today back to the previous monday. But since time.Sunday=0, it goes into the next week when run on Sunday, producing incorrect partitions bounds. Also add tests for partition.getWeeklyBounds() Signed-off-by: Daniel Vérité <[email protected]>
1 parent a2e5ae6 commit 0b53739

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

internal/infra/partition/bounds.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ func getDailyBounds(date time.Time) (lowerBound, upperBound time.Time) {
3030
}
3131

3232
func getWeeklyBounds(date time.Time) (lowerBound, upperBound time.Time) {
33-
lowerBound = time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.UTC().Location()).AddDate(0, 0, -int(date.Weekday()-time.Monday))
33+
offset := int(date.Weekday() - time.Monday)
34+
if offset < 0 {
35+
offset = 6 // adjust Sunday to be 6 days after Monday instead of 1 day before
36+
}
37+
38+
lowerBound = time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.UTC().Location()).AddDate(0, 0, -1*offset)
3439
upperBound = lowerBound.AddDate(0, 0, nbDaysInAWeek)
3540

3641
return
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package partition
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"gotest.tools/assert"
8+
)
9+
10+
func TestGetWeeklyBounds(t *testing.T) {
11+
testCases := []struct {
12+
name string
13+
date time.Time
14+
expectedLower time.Time
15+
expectedUpper time.Time
16+
}{
17+
{
18+
name: "Monday",
19+
date: time.Date(2024, 1, 1, 12, 30, 0, 0, time.UTC), // Monday
20+
expectedLower: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
21+
expectedUpper: time.Date(2024, 1, 8, 0, 0, 0, 0, time.UTC),
22+
},
23+
{
24+
name: "Wednesday",
25+
date: time.Date(2024, 1, 3, 15, 45, 0, 0, time.UTC), // Wednesday
26+
expectedLower: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
27+
expectedUpper: time.Date(2024, 1, 8, 0, 0, 0, 0, time.UTC),
28+
},
29+
{
30+
name: "Sunday",
31+
date: time.Date(2024, 1, 7, 23, 59, 59, 0, time.UTC), // Sunday
32+
expectedLower: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
33+
expectedUpper: time.Date(2024, 1, 8, 0, 0, 0, 0, time.UTC),
34+
},
35+
{
36+
name: "Saturday",
37+
date: time.Date(2024, 1, 6, 0, 0, 0, 0, time.UTC), // Saturday
38+
expectedLower: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
39+
expectedUpper: time.Date(2024, 1, 8, 0, 0, 0, 0, time.UTC),
40+
},
41+
{
42+
name: "Month boundary",
43+
date: time.Date(2024, 1, 31, 12, 0, 0, 0, time.UTC), // Wednesday
44+
expectedLower: time.Date(2024, 1, 29, 0, 0, 0, 0, time.UTC),
45+
expectedUpper: time.Date(2024, 2, 5, 0, 0, 0, 0, time.UTC),
46+
},
47+
{
48+
name: "Year boundary",
49+
date: time.Date(2023, 12, 31, 23, 59, 59, 0, time.UTC), // Sunday
50+
expectedLower: time.Date(2023, 12, 25, 0, 0, 0, 0, time.UTC),
51+
expectedUpper: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC),
52+
},
53+
}
54+
55+
for _, tc := range testCases {
56+
t.Run(tc.name, func(t *testing.T) {
57+
lowerBound, upperBound := getWeeklyBounds(tc.date)
58+
59+
assert.Equal(t, lowerBound, tc.expectedLower, "Lower bound mismatch")
60+
assert.Equal(t, upperBound, tc.expectedUpper, "Upper bound mismatch")
61+
62+
// Verify the bounds span exactly 7 days
63+
daysDiff := upperBound.Sub(lowerBound).Hours() / 24
64+
assert.Equal(t, float64(nbDaysInAWeek), daysDiff, "Bounds should span exactly 7 days")
65+
})
66+
}
67+
}

0 commit comments

Comments
 (0)