- 新增 cron模块,支持定时任务管理- 实现了任务列表获取、任务添加、任务移除和任务状态获取等接口 - 添加了默认任务,包括数据同步、数据清理、健康检查和缓存刷新等 - 实现了优雅关闭功能,确保在服务停止时正确停止所有任务 - 添加了定时任务相关文档和使用指南
146 lines
4.6 KiB
Go
146 lines
4.6 KiB
Go
package cron
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|
"github.com/gogf/gf/v2/os/genv"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
// 必须在任何import和g.Cfg()调用前设置环境变量
|
|
genv.Set("GF_GCFG_FILE", "D:/code/go/epic/manifest/config/config.yaml")
|
|
ctx := gctx.New()
|
|
_ = g.Cfg().MustGet(ctx, "server.address")
|
|
fmt.Println(g.Cfg().Get(ctx, "redis.default.address"))
|
|
code := m.Run()
|
|
os.Exit(code)
|
|
}
|
|
|
|
type mockSync struct {
|
|
fetchHeroDataErr error
|
|
fetchArtifactDataErr error
|
|
processHeroDataErr error
|
|
processArtifactErr error
|
|
}
|
|
|
|
func (m *mockSync) fetchHeroDataFromAPI(ctx context.Context) ([]byte, error) {
|
|
if m.fetchHeroDataErr != nil {
|
|
return nil, m.fetchHeroDataErr
|
|
}
|
|
return []byte(`[{"code":"hero1"},{"code":"hero2"}]`), nil
|
|
}
|
|
|
|
func (m *mockSync) fetchArtifactDataFromAPI(ctx context.Context) ([]byte, error) {
|
|
if m.fetchArtifactDataErr != nil {
|
|
return nil, m.fetchArtifactDataErr
|
|
}
|
|
return []byte(`[{"code":"artifact1"}]`), nil
|
|
}
|
|
|
|
func (m *mockSync) processAndSaveHeroData(ctx context.Context, data []byte) error {
|
|
return m.processHeroDataErr
|
|
}
|
|
|
|
func (m *mockSync) processAndSaveArtifactData(ctx context.Context, data []byte) error {
|
|
return m.processArtifactErr
|
|
}
|
|
|
|
//func TestSyncHeroData_Success(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// // 替换方法为mock
|
|
// sync.fetchHeroDataFromAPI = (&mockSync{}).fetchHeroDataFromAPI
|
|
// sync.processAndSaveHeroData = (&mockSync{}).processAndSaveHeroData
|
|
//
|
|
// err := sync.SyncHeroData(context.Background())
|
|
// if err != nil {
|
|
// t.Errorf("expected success, got error: %v", err)
|
|
// }
|
|
//}
|
|
//
|
|
//func TestSyncHeroData_FetchError(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// sync.fetchHeroDataFromAPI = (&mockSync{fetchHeroDataErr: errors.New("fetch error")}).fetchHeroDataFromAPI
|
|
// sync.processAndSaveHeroData = (&mockSync{}).processAndSaveHeroData
|
|
//
|
|
// err := sync.SyncHeroData(context.Background())
|
|
// if err == nil || err.Error() != "fetch error" {
|
|
// t.Errorf("expected fetch error, got: %v", err)
|
|
// }
|
|
//}
|
|
//
|
|
//func TestSyncHeroData_ProcessError(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// sync.fetchHeroDataFromAPI = (&mockSync{}).fetchHeroDataFromAPI
|
|
// sync.processAndSaveHeroData = (&mockSync{processHeroDataErr: errors.New("process error")}).processAndSaveHeroData
|
|
//
|
|
// err := sync.SyncHeroData(context.Background())
|
|
// if err == nil || err.Error() != "process error" {
|
|
// t.Errorf("expected process error, got: %v", err)
|
|
// }
|
|
//}
|
|
//
|
|
//func TestSyncArtifactData_Success(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// sync.fetchArtifactDataFromAPI = (&mockSync{}).fetchArtifactDataFromAPI
|
|
// sync.processAndSaveArtifactData = (&mockSync{}).processAndSaveArtifactData
|
|
//
|
|
// err := sync.SyncArtifactData(context.Background())
|
|
// if err != nil {
|
|
// t.Errorf("expected success, got error: %v", err)
|
|
// }
|
|
//}
|
|
//
|
|
//func TestSyncArtifactData_FetchError(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// sync.fetchArtifactDataFromAPI = (&mockSync{fetchArtifactDataErr: errors.New("fetch error")}).fetchArtifactDataFromAPI
|
|
// sync.processAndSaveArtifactData = (&mockSync{}).processAndSaveArtifactData
|
|
//
|
|
// err := sync.SyncArtifactData(context.Background())
|
|
// if err == nil || err.Error() != "fetch error" {
|
|
// t.Errorf("expected fetch error, got: %v", err)
|
|
// }
|
|
//}
|
|
//
|
|
//func TestSyncArtifactData_ProcessError(t *testing.T) {
|
|
// sync := &ThirdPartyDataSync{}
|
|
// sync.fetchArtifactDataFromAPI = (&mockSync{}).fetchArtifactDataFromAPI
|
|
// sync.processAndSaveArtifactData = (&mockSync{processArtifactErr: errors.New("process error")}).processAndSaveArtifactData
|
|
//
|
|
// err := sync.SyncArtifactData(context.Background())
|
|
// if err == nil || err.Error() != "process error" {
|
|
// t.Errorf("expected process error, got: %v", err)
|
|
// }
|
|
//}
|
|
|
|
func TestProcessAndSaveArtifactData(t *testing.T) {
|
|
sync := &ThirdPartyDataSync{}
|
|
// 构造一个合法的 JSON 数据
|
|
data := "[{\"code\":\"artifact1\"},{\"code\":\"artifact2\"}]"
|
|
if err := sync.processAndSaveArtifactData(context.Background(), data); err != nil {
|
|
t.Errorf("expected no error, got: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestProcessAndSaveHeroData(t *testing.T) {
|
|
sync := &ThirdPartyDataSync{}
|
|
// 构造一个合法的 JSON 数据
|
|
data := []byte(`[{"code":"hero1"},{"code":"hero2"}]`)
|
|
if err := sync.processAndSaveHeroData(context.Background(), data); err != nil {
|
|
t.Errorf("expected no error, got: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestSyncArtifactData_Success(t *testing.T) {
|
|
sync := NewThirdPartyDataSync()
|
|
|
|
err := sync.SyncArtifactData(context.Background())
|
|
if err != nil {
|
|
t.Errorf("expected success, but got error: %v", err)
|
|
}
|
|
}
|