51 lines
1.6 KiB
Go
51 lines
1.6 KiB
Go
//go:build unit
|
|||
|
|
|
||
|
|
package service
|
||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
appTimezone "github.com/Wei-Shaw/sub2api/internal/pkg/timezone"
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
)
|
||
|
|
|
||
|
|
func useGroupUsageTestTimezone(t *testing.T, name string) {
|
||
|
|
t.Helper()
|
||
|
|
|
||
|
|
previousName := appTimezone.Name()
|
||
|
|
require.NoError(t, appTimezone.Init(name))
|
||
|
|
t.Cleanup(func() { require.NoError(t, appTimezone.Init(previousName)) })
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGroupUsageDateUsesConfiguredTimezoneBoundary(t *testing.T) {
|
||
|
|
useGroupUsageTestTimezone(t, "America/New_York")
|
||
|
|
|
||
|
|
beforeMidnight := time.Date(2026, 3, 9, 3, 59, 59, 0, time.UTC)
|
||
|
|
atMidnight := time.Date(2026, 3, 9, 4, 0, 0, 0, time.UTC)
|
||
|
|
|
||
|
|
require.Equal(t, "2026-03-08", GroupUsageDate(beforeMidnight))
|
||
|
|
require.Equal(t, "2026-03-09", GroupUsageDate(atMidnight))
|
||
|
|
require.Equal(t, atMidnight, GroupUsageTodayStart(atMidnight))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGroupUsageParseDateUsesConfiguredTimezone(t *testing.T) {
|
||
|
|
useGroupUsageTestTimezone(t, "America/New_York")
|
||
|
|
|
||
|
|
parsed, err := ParseGroupUsageDate("2026-03-08")
|
||
|
|
require.NoError(t, err)
|
||
|
|
require.Equal(t, time.Date(2026, 3, 8, 5, 0, 0, 0, time.UTC), parsed.UTC())
|
||
|
|
require.Equal(t, "America/New_York", parsed.Location().String())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGroupUsageYesterdayStartHandlesDST(t *testing.T) {
|
||
|
|
useGroupUsageTestTimezone(t, "America/New_York")
|
||
|
|
|
||
|
|
todayStart := time.Date(2026, 3, 9, 4, 0, 0, 0, time.UTC)
|
||
|
|
yesterdayStart := GroupUsageYesterdayStart(todayStart)
|
||
|
|
|
||
|
|
require.Equal(t, time.Date(2026, 3, 8, 5, 0, 0, 0, time.UTC), yesterdayStart)
|
||
|
|
require.Equal(t, 23*time.Hour, todayStart.Sub(yesterdayStart))
|
||
|
|
require.Equal(t, "America/New_York", GroupUsageTimezoneName())
|
||
|
|
}
|