diff --git a/internal/services/scheduler.go b/internal/services/scheduler.go index b60cc78..c714f61 100644 --- a/internal/services/scheduler.go +++ b/internal/services/scheduler.go @@ -66,7 +66,10 @@ func NewScheduler(worker *Worker, db Database) *Scheduler { func (s *Scheduler) Start() { s.wg.Add(1) - go s.runSettingsChecker() + go func() { + defer s.wg.Done() + s.runSettingsChecker() + }() } func (s *Scheduler) Stop() { @@ -74,7 +77,9 @@ func (s *Scheduler) Stop() { s.mu.Lock() for _, timer := range s.timers { - timer.Stop() + if timer != nil { + timer.Stop() + } } s.timers = make(map[string]*time.Timer) s.mu.Unlock() diff --git a/internal/services/scheduler_test.go b/internal/services/scheduler_test.go index edbaef8..994036b 100644 --- a/internal/services/scheduler_test.go +++ b/internal/services/scheduler_test.go @@ -9,6 +9,7 @@ import ( func TestScheduler_NewScheduler(t *testing.T) { worker := NewWorker(1) + defer worker.Shutdown() // Use nil database interface for basic testing scheduler := NewScheduler(worker, nil) @@ -31,10 +32,12 @@ func TestScheduler_StartStop(t *testing.T) { // Stop should not panic scheduler.Stop() + worker.Shutdown() } func TestScheduler_UpdateScanSettings(t *testing.T) { worker := NewWorker(1) + defer worker.Shutdown() scheduler := NewScheduler(worker, nil) userID := "test-user-123" @@ -54,6 +57,7 @@ func TestScheduler_UpdateScanSettings(t *testing.T) { func TestScheduler_UpdateScanSettings_Disabled(t *testing.T) { worker := NewWorker(1) + defer worker.Shutdown() scheduler := NewScheduler(worker, nil) userID := "test-user-456" @@ -72,6 +76,7 @@ func TestScheduler_UpdateScanSettings_Disabled(t *testing.T) { func TestScheduler_UpdateScanSettings_Overwrite(t *testing.T) { worker := NewWorker(1) + defer worker.Shutdown() scheduler := NewScheduler(worker, nil) userID := "test-user-789" @@ -110,13 +115,14 @@ func TestScheduler_StopWithActiveTimers(t *testing.T) { scheduler.mu.Unlock() assert.Equal(t, 0, timerCount) + + worker.Shutdown() } func TestScheduler_ConcurrentAccess(t *testing.T) { worker := NewWorker(1) scheduler := NewScheduler(worker, nil) scheduler.Start() - defer scheduler.Stop() // Concurrent updates should not cause race conditions done := make(chan bool, 10) @@ -140,4 +146,7 @@ func TestScheduler_ConcurrentAccess(t *testing.T) { scheduler.mu.Unlock() assert.Equal(t, 10, settingCount) + + scheduler.Stop() + worker.Shutdown() }