64 lines
2.1 KiB
Go
64 lines
2.1 KiB
Go
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)
|
|
}
|