package scheduler_test import ( "testing" "time" "galaxy/gamemaster/internal/service/scheduler" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestComputeNextHappyPathWithoutSkip(t *testing.T) { service := scheduler.New() after := time.Date(2026, time.April, 30, 12, 0, 0, 0, time.UTC) next, skipConsumed, err := service.ComputeNext("0 18 * * *", after, false) require.NoError(t, err) assert.False(t, skipConsumed) expected := time.Date(2026, time.April, 30, 18, 0, 0, 0, time.UTC) assert.Equal(t, expected, next) assert.Equal(t, time.UTC, next.Location()) } func TestComputeNextConsumesSkip(t *testing.T) { service := scheduler.New() after := time.Date(2026, time.April, 30, 12, 0, 0, 0, time.UTC) next, skipConsumed, err := service.ComputeNext("0 18 * * *", after, true) require.NoError(t, err) assert.True(t, skipConsumed) expected := time.Date(2026, time.May, 1, 18, 0, 0, 0, time.UTC) assert.Equal(t, expected, next) } func TestComputeNextEveryQuarterHourSkip(t *testing.T) { service := scheduler.New() after := time.Date(2026, time.April, 30, 12, 0, 0, 0, time.UTC) first, _, err := service.ComputeNext("*/15 * * * *", after, false) require.NoError(t, err) skipped, _, err := service.ComputeNext("*/15 * * * *", after, true) require.NoError(t, err) assert.Equal(t, first.Add(15*time.Minute), skipped, "skip advances by exactly one cron step") } func TestComputeNextRejectsInvalidCron(t *testing.T) { service := scheduler.New() _, _, err := service.ComputeNext("not-a-cron", time.Now().UTC(), false) require.Error(t, err) } func TestComputeNextTrimsWhitespace(t *testing.T) { service := scheduler.New() after := time.Date(2026, time.April, 30, 12, 0, 0, 0, time.UTC) next, _, err := service.ComputeNext(" 0 18 * * * ", after, false) require.NoError(t, err) expected := time.Date(2026, time.April, 30, 18, 0, 0, 0, time.UTC) assert.Equal(t, expected, next) } func TestNilServiceRejected(t *testing.T) { var service *scheduler.Service _, _, err := service.ComputeNext("0 18 * * *", time.Now().UTC(), false) require.Error(t, err) }