package business import ( "github.com/glebarez/sqlite" "github.com/robfig/cron/v3" "gorm.io/gorm" datatask "kra/internal/data/task" "path/filepath" "testing" "time" ) func TestAlertScheduleUpgradePreservesDisabledTaskAndUsesShanghaiMidnight(t *testing.T) { db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), "alert-schedule.db")), &gorm.Config{}) if err != nil { t.Fatal(err) } pool, _ := db.DB() t.Cleanup(func() { _ = pool.Close() }) for _, step := range datatask.Migrations() { if err := step.Migrate(db); err != nil { t.Fatal(err) } } if err := db.Exec("INSERT INTO sys_timed_tasks(name,method_name,spec,with_seconds,enabled) VALUES('历史预警任务','alertTriggerTask','*/5 * * * *',0,0)").Error; err != nil { t.Fatal(err) } for i := 0; i < 2; i++ { if err := migrateAlertSurface(db); err != nil { t.Fatal(err) } } var rows []struct { Spec string Enabled bool } if err := db.Table("sys_timed_tasks").Where("method_name='alertTriggerTask'").Scan(&rows).Error; err != nil { t.Fatal(err) } if len(rows) != 1 || rows[0].Enabled || rows[0].Spec != alertDetectionTask.Spec { t.Fatalf("迁移不应重复或启用管理员停用的任务: %+v", rows) } schedule, err := cron.ParseStandard(rows[0].Spec) if err != nil { t.Fatal(err) } next := schedule.Next(time.Date(2026, 11, 5, 12, 0, 0, 0, time.UTC)) if next.UTC() != time.Date(2026, 11, 5, 16, 0, 0, 0, time.UTC) { t.Fatalf("没有按上海零点执行: %v", next) } }