197 lines
5.2 KiB
Go
197 lines
5.2 KiB
Go
package cron
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/go-co-op/gocron/v2"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
|
)
|
|
|
|
func TestCronJobNextRunTimeWithIntervalPeriod(t *testing.T) {
|
|
scheduler, err := gocron.NewScheduler(
|
|
gocron.WithLocation(time.Local),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
job := CronJob{
|
|
Name: "TestCronJobWithIntervalPeriod",
|
|
Description: "The test cron job",
|
|
Period: CronJobIntervalPeriod{
|
|
Interval: 2*time.Hour + 34*time.Minute + 56*time.Second,
|
|
},
|
|
Run: func(c *core.CronContext) error {
|
|
return nil
|
|
},
|
|
}
|
|
|
|
gocronJob, err := scheduler.NewJob(
|
|
job.Period.ToJobDefinition(),
|
|
gocron.NewTask(job.doRun),
|
|
gocron.WithName(job.Name),
|
|
gocron.WithSingletonMode(gocron.LimitModeReschedule),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
scheduler.Start()
|
|
|
|
currentTime := time.Now()
|
|
nextRunTime, err := gocronJob.NextRun()
|
|
assert.Nil(t, err)
|
|
|
|
expectedNextTime := currentTime.Add(2 * time.Hour).Add(34 * time.Minute).Add(56 * time.Second)
|
|
|
|
assert.Equal(t, expectedNextTime.Year(), nextRunTime.Year())
|
|
assert.Equal(t, expectedNextTime.Month(), nextRunTime.Month())
|
|
assert.Equal(t, expectedNextTime.Day(), nextRunTime.Day())
|
|
assert.Equal(t, expectedNextTime.Hour(), nextRunTime.Hour())
|
|
assert.Equal(t, expectedNextTime.Minute(), nextRunTime.Minute())
|
|
assert.Equal(t, expectedNextTime.Second(), nextRunTime.Second())
|
|
|
|
err = scheduler.Shutdown()
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestCronJobNextRunTimeWithFixedHourPeriod(t *testing.T) {
|
|
scheduler, err := gocron.NewScheduler(
|
|
gocron.WithLocation(time.Local),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
job := CronJob{
|
|
Name: "TestCronJobWithFixedHourPeriod",
|
|
Description: "The test cron job",
|
|
Period: CronJobFixedHourPeriod{
|
|
Hour: 0,
|
|
},
|
|
Run: func(c *core.CronContext) error {
|
|
return nil
|
|
},
|
|
}
|
|
|
|
gocronJob, err := scheduler.NewJob(
|
|
job.Period.ToJobDefinition(),
|
|
gocron.NewTask(job.doRun),
|
|
gocron.WithName(job.Name),
|
|
gocron.WithSingletonMode(gocron.LimitModeReschedule),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
scheduler.Start()
|
|
|
|
nextRunTime, err := gocronJob.NextRun()
|
|
assert.Nil(t, err)
|
|
|
|
tomorrow := time.Now().AddDate(0, 0, 1)
|
|
|
|
assert.Equal(t, tomorrow.Year(), nextRunTime.Year())
|
|
assert.Equal(t, tomorrow.Month(), nextRunTime.Month())
|
|
assert.Equal(t, tomorrow.Day(), nextRunTime.Day())
|
|
assert.Equal(t, 0, nextRunTime.Hour())
|
|
assert.Equal(t, 0, nextRunTime.Minute())
|
|
assert.Equal(t, 0, nextRunTime.Second())
|
|
|
|
err = scheduler.Shutdown()
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestCronJobNextRunTimeWithEvery15MinutesPeriod(t *testing.T) {
|
|
scheduler, err := gocron.NewScheduler(
|
|
gocron.WithLocation(time.Local),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
expectedSecond := uint32(23)
|
|
|
|
job := CronJob{
|
|
Name: "TestCronJobWithEvery15MinutesPeriod",
|
|
Description: "The test cron job",
|
|
Period: CronJobEvery15MinutesPeriod{
|
|
Second: expectedSecond,
|
|
},
|
|
Run: func(c *core.CronContext) error {
|
|
return nil
|
|
},
|
|
}
|
|
|
|
assert.Equal(t, 15*time.Minute, job.Period.GetInterval())
|
|
|
|
gocronJob, err := scheduler.NewJob(
|
|
job.Period.ToJobDefinition(),
|
|
gocron.NewTask(job.doRun),
|
|
gocron.WithName(job.Name),
|
|
gocron.WithSingletonMode(gocron.LimitModeReschedule),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
scheduler.Start()
|
|
|
|
nextRunTime, err := gocronJob.NextRun()
|
|
assert.Nil(t, err)
|
|
|
|
nextMinuteTime := time.Now()
|
|
|
|
if (nextMinuteTime.Minute() == 0 || nextMinuteTime.Minute() == 15 || nextMinuteTime.Minute() == 30 || nextMinuteTime.Minute() == 45) && nextMinuteTime.Second() < int(expectedSecond) {
|
|
// Do Nothing
|
|
} else {
|
|
nextMinute := ((nextMinuteTime.Minute() / 15) + 1) * 15
|
|
minuteDiff := nextMinute - nextMinuteTime.Minute()
|
|
nextMinuteTime = nextMinuteTime.Add(time.Duration(int64(minuteDiff) * int64(time.Minute)))
|
|
}
|
|
|
|
assert.Equal(t, nextMinuteTime.Year(), nextRunTime.Year())
|
|
assert.Equal(t, nextMinuteTime.Month(), nextRunTime.Month())
|
|
assert.Equal(t, nextMinuteTime.Day(), nextRunTime.Day())
|
|
assert.Equal(t, nextMinuteTime.Hour(), nextRunTime.Hour())
|
|
assert.Equal(t, nextMinuteTime.Minute(), nextRunTime.Minute())
|
|
assert.Equal(t, int(expectedSecond), nextRunTime.Second())
|
|
|
|
err = scheduler.Shutdown()
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestCronJobNextRunTimeWithFixedTimePeriod(t *testing.T) {
|
|
scheduler, err := gocron.NewScheduler(
|
|
gocron.WithLocation(time.Local),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
expectedTime := time.Now().Add(123456789 * time.Second)
|
|
|
|
job := CronJob{
|
|
Name: "TestCronJobWithFixedTimePeriod",
|
|
Description: "The test cron job",
|
|
Period: CronJobFixedTimePeriod{
|
|
Time: expectedTime,
|
|
},
|
|
Run: func(c *core.CronContext) error {
|
|
return nil
|
|
},
|
|
}
|
|
|
|
gocronJob, err := scheduler.NewJob(
|
|
job.Period.ToJobDefinition(),
|
|
gocron.NewTask(job.doRun),
|
|
gocron.WithName(job.Name),
|
|
gocron.WithSingletonMode(gocron.LimitModeReschedule),
|
|
)
|
|
assert.Nil(t, err)
|
|
|
|
scheduler.Start()
|
|
|
|
nextRunTime, err := gocronJob.NextRun()
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, expectedTime.Year(), nextRunTime.Year())
|
|
assert.Equal(t, expectedTime.Month(), nextRunTime.Month())
|
|
assert.Equal(t, expectedTime.Day(), nextRunTime.Day())
|
|
assert.Equal(t, expectedTime.Hour(), nextRunTime.Hour())
|
|
assert.Equal(t, expectedTime.Minute(), nextRunTime.Minute())
|
|
assert.Equal(t, expectedTime.Second(), nextRunTime.Second())
|
|
|
|
err = scheduler.Shutdown()
|
|
assert.Nil(t, err)
|
|
}
|