Files
ezbookkeeping/pkg/cron/cron_container_test.go
T
2024-08-19 00:35:45 +08:00

140 lines
3.4 KiB
Go

package cron
import (
"sync/atomic"
"testing"
"time"
"github.com/go-co-op/gocron/v2"
"github.com/stretchr/testify/assert"
"github.com/mayswind/ezbookkeeping/pkg/core"
"github.com/mayswind/ezbookkeeping/pkg/duplicatechecker"
"github.com/mayswind/ezbookkeeping/pkg/settings"
)
func TestCronJobSchedulerContainerRegisterIntervalJob(t *testing.T) {
var err error
container := &CronJobSchedulerContainer{
allJobsMap: make(map[string]*CronJob),
allGocronJobsMap: make(map[string]gocron.Job),
}
container.scheduler, err = gocron.NewScheduler(
gocron.WithLocation(time.Local),
gocron.WithLogger(NewGocronLoggerAdapter()),
)
assert.Nil(t, err)
actualValue := false
job := &CronJob{
Name: "TestRegisterIntervalJob",
Description: "The test cron job",
Period: CronJobIntervalPeriod{
Interval: 1 * time.Second,
},
Run: func(c *core.CronContext) error {
actualValue = true
return nil
},
}
container.registerIntervalJob(core.NewNullContext(), job)
container.scheduler.Start()
assert.Equal(t, 1, len(container.GetAllJobs()))
assert.Equal(t, job, container.GetAllJobs()[0])
time.Sleep(2 * time.Second)
assert.True(t, actualValue)
err = container.scheduler.Shutdown()
assert.Nil(t, err)
}
func TestCronJobSchedulerContainerSyncRunJobNow(t *testing.T) {
var err error
container := &CronJobSchedulerContainer{
allJobsMap: make(map[string]*CronJob),
allGocronJobsMap: make(map[string]gocron.Job),
}
container.scheduler, err = gocron.NewScheduler(
gocron.WithLocation(time.Local),
gocron.WithLogger(NewGocronLoggerAdapter()),
)
assert.Nil(t, err)
actualValue := false
job := &CronJob{
Name: "TestSyncRunJob",
Description: "The test cron job",
Period: CronJobIntervalPeriod{
Interval: 24 * time.Hour,
},
Run: func(c *core.CronContext) error {
actualValue = true
return nil
},
}
container.registerIntervalJob(core.NewNullContext(), job)
err = container.SyncRunJobNow("TestSyncRunJob")
assert.Nil(t, err)
assert.True(t, actualValue)
}
func TestCronJobSchedulerContainerRepeatRun(t *testing.T) {
var err error
checker, _ := duplicatechecker.NewInMemoryDuplicateChecker(&settings.Config{
DuplicateSubmissionsIntervalDuration: 60 * time.Second,
InMemoryDuplicateCheckerCleanupIntervalDuration: 60 * time.Second,
})
duplicatechecker.Container.Current = checker
container := &CronJobSchedulerContainer{
allJobsMap: make(map[string]*CronJob),
allGocronJobsMap: make(map[string]gocron.Job),
}
container.scheduler, err = gocron.NewScheduler(
gocron.WithLocation(time.Local),
gocron.WithLogger(NewGocronLoggerAdapter()),
)
assert.Nil(t, err)
var runCount atomic.Uint32
runTime := time.Now().Add(time.Second)
job := &CronJob{
Name: "TestRepeatRunJob",
Description: "The test cron job",
Period: CronJobFixedTimePeriod{
Time: runTime,
},
Run: func(c *core.CronContext) error {
runCount.Add(1)
return nil
},
}
container.registerIntervalJob(core.NewNullContext(), job)
container.registerIntervalJob(core.NewNullContext(), job)
container.registerIntervalJob(core.NewNullContext(), job)
container.registerIntervalJob(core.NewNullContext(), job)
container.registerIntervalJob(core.NewNullContext(), job)
container.scheduler.Start()
time.Sleep(10 * time.Second)
assert.Nil(t, err)
assert.Equal(t, uint32(1), runCount.Load())
err = container.scheduler.Shutdown()
assert.Nil(t, err)
}