144 lines
3.2 KiB
Go
144 lines
3.2 KiB
Go
package services
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestScheduler_NewScheduler(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
|
|
// Use nil database interface for basic testing
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
assert.NotNil(t, scheduler)
|
|
assert.NotNil(t, scheduler.worker)
|
|
assert.NotNil(t, scheduler.timers)
|
|
assert.NotNil(t, scheduler.scanSettings)
|
|
assert.NotNil(t, scheduler.ctx)
|
|
assert.NotNil(t, scheduler.cancel)
|
|
}
|
|
|
|
func TestScheduler_StartStop(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
// Start should not panic
|
|
scheduler.Start()
|
|
assert.NotNil(t, scheduler.ctx)
|
|
|
|
// Stop should not panic
|
|
scheduler.Stop()
|
|
}
|
|
|
|
func TestScheduler_UpdateScanSettings(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
userID := "test-user-123"
|
|
|
|
// Update scan settings
|
|
scheduler.UpdateScanSettings(userID, true, 30)
|
|
|
|
scheduler.mu.Lock()
|
|
settings, exists := scheduler.scanSettings[userID]
|
|
scheduler.mu.Unlock()
|
|
|
|
assert.True(t, exists)
|
|
assert.Equal(t, userID, settings.UserID)
|
|
assert.True(t, settings.Enabled)
|
|
assert.Equal(t, 30, settings.Frequency)
|
|
}
|
|
|
|
func TestScheduler_UpdateScanSettings_Disabled(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
userID := "test-user-456"
|
|
|
|
// Update scan settings to disabled
|
|
scheduler.UpdateScanSettings(userID, false, 60)
|
|
|
|
scheduler.mu.Lock()
|
|
settings, exists := scheduler.scanSettings[userID]
|
|
scheduler.mu.Unlock()
|
|
|
|
assert.True(t, exists)
|
|
assert.False(t, settings.Enabled)
|
|
assert.Equal(t, 60, settings.Frequency)
|
|
}
|
|
|
|
func TestScheduler_UpdateScanSettings_Overwrite(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
userID := "test-user-789"
|
|
|
|
// First update
|
|
scheduler.UpdateScanSettings(userID, true, 30)
|
|
|
|
// Overwrite with different settings
|
|
scheduler.UpdateScanSettings(userID, false, 45)
|
|
|
|
scheduler.mu.Lock()
|
|
settings, exists := scheduler.scanSettings[userID]
|
|
scheduler.mu.Unlock()
|
|
|
|
assert.True(t, exists)
|
|
assert.False(t, settings.Enabled)
|
|
assert.Equal(t, 45, settings.Frequency)
|
|
}
|
|
|
|
func TestScheduler_StopWithActiveTimers(t *testing.T) {
|
|
worker := NewWorker(1)
|
|
scheduler := NewScheduler(worker, nil)
|
|
|
|
// Add some fake timers
|
|
scheduler.mu.Lock()
|
|
scheduler.timers["timer1"] = nil
|
|
scheduler.timers["timer2"] = nil
|
|
scheduler.timers["timer3"] = nil
|
|
scheduler.mu.Unlock()
|
|
|
|
// Stop should clear timers
|
|
scheduler.Stop()
|
|
|
|
scheduler.mu.Lock()
|
|
timerCount := len(scheduler.timers)
|
|
scheduler.mu.Unlock()
|
|
|
|
assert.Equal(t, 0, timerCount)
|
|
}
|
|
|
|
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)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
go func(index int) {
|
|
userID := uuid.New().String()
|
|
scheduler.UpdateScanSettings(userID, true, 30)
|
|
done <- true
|
|
}(i)
|
|
}
|
|
|
|
// Wait for all goroutines
|
|
for i := 0; i < 10; i++ {
|
|
<-done
|
|
}
|
|
|
|
// Verify all settings were stored
|
|
scheduler.mu.Lock()
|
|
settingCount := len(scheduler.scanSettings)
|
|
scheduler.mu.Unlock()
|
|
|
|
assert.Equal(t, 10, settingCount)
|
|
}
|