package services import ( "testing" "time" "arma3-web-server/internal/models" ) func TestNewScheduler(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) s := NewScheduler(settings, modlists, steamcmd) if s == nil { t.Fatal("expected non-nil scheduler") } if s.cron == nil { t.Fatal("expected non-nil cron") } } func TestScheduler_StartStop(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) s := NewScheduler(settings, modlists, steamcmd) s.Start() time.Sleep(50 * time.Millisecond) s.Stop() } func TestScheduler_Refresh_Empty(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) s := NewScheduler(settings, modlists, steamcmd) s.Start() defer s.Stop() s.Refresh() if s.entryID != 0 { t.Errorf("expected entryID 0 with empty settings, got %d", s.entryID) } } func TestScheduler_Refresh_InvalidCron(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) _, err := settings.Update(func(s *models.ServerSettings) { s.ScheduledUpdate = "not-a-cron" }) if err != nil { t.Fatal(err) } sched := NewScheduler(settings, modlists, steamcmd) sched.Start() defer sched.Stop() sched.Refresh() if sched.entryID != 0 { t.Errorf("expected entryID 0 with invalid cron, got %d", sched.entryID) } } func TestScheduler_Refresh_ValidCron(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) _, err := settings.Update(func(s *models.ServerSettings) { s.ScheduledUpdate = "0 4 * * *" }) if err != nil { t.Fatal(err) } sched := NewScheduler(settings, modlists, steamcmd) sched.Start() defer sched.Stop() sched.Refresh() if sched.entryID == 0 { t.Errorf("expected non-zero entryID with valid cron") } } func TestScheduler_Refresh_Replace(t *testing.T) { dataDir := t.TempDir() settings := NewSettingsManager(dataDir) modlists := NewModlistManager(dataDir) streamer := NewLogStreamer() steamcmd := NewSteamCmdManager(t.TempDir(), streamer) sched := NewScheduler(settings, modlists, steamcmd) sched.Start() defer sched.Stop() _, err := settings.Update(func(s *models.ServerSettings) { s.ScheduledUpdate = "0 4 * * *" }) if err != nil { t.Fatal(err) } sched.Refresh() id1 := sched.entryID _, err = settings.Update(func(s *models.ServerSettings) { s.ScheduledUpdate = "0 5 * * *" }) if err != nil { t.Fatal(err) } sched.Refresh() id2 := sched.entryID if id1 == id2 { t.Errorf("expected different entryIDs after refresh, both got %d", id1) } }