package bot import ( "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNew_EmptyToken(t *testing.T) { _, err := New(Config{Token: ""}) require.Error(t, err, "New with empty token should return an error") } func TestIsAllowed_EmptyList(t *testing.T) { b := &Bot{ cfg: Config{AllowedChats: nil}, } assert.True(t, b.isAllowed(12345), "empty AllowedChats should allow any chat ID") assert.True(t, b.isAllowed(0), "empty AllowedChats should allow zero chat ID") assert.True(t, b.isAllowed(-999), "empty AllowedChats should allow negative chat ID") } func TestIsAllowed_RestrictedList(t *testing.T) { b := &Bot{ cfg: Config{AllowedChats: []int64{100, 200}}, } assert.True(t, b.isAllowed(100), "chat 100 should be allowed") assert.True(t, b.isAllowed(200), "chat 200 should be allowed") assert.False(t, b.isAllowed(999), "chat 999 should not be allowed") assert.False(t, b.isAllowed(0), "chat 0 should not be allowed") } func TestCheckRateLimit(t *testing.T) { b := &Bot{ rateLimits: make(map[int64]time.Time), } cooldown := 60 * time.Second // First call should be allowed. assert.True(t, b.checkRateLimit(1, cooldown), "first call should pass rate limit") // Immediate second call should be blocked. assert.False(t, b.checkRateLimit(1, cooldown), "immediate second call should be rate limited") // Different user should not be affected. assert.True(t, b.checkRateLimit(2, cooldown), "different user should pass rate limit") // After cooldown expires, the same user should be allowed again. b.rateMu.Lock() b.rateLimits[1] = time.Now().Add(-61 * time.Second) b.rateMu.Unlock() assert.True(t, b.checkRateLimit(1, cooldown), "should pass after cooldown expires") }