import pytest
import time
from rate_limiter import RateLimiter

def test_rate_limiter_allows_under_limit():
    """Test that requests under limit are allowed"""
    limiter = RateLimiter(max_requests=5, window_seconds=60)

    user_id = "test_user"

    # Should allow 5 messages
    for i in range(5):
        assert limiter.is_allowed(user_id) == True

def test_rate_limiter_blocks_over_limit():
    """Test that requests over limit are blocked"""
    limiter = RateLimiter(max_requests=5, window_seconds=60)

    user_id = "test_user"

    # First 5 should pass
    for i in range(5):
        assert limiter.is_allowed(user_id) == True

    # 6th should fail
    assert limiter.is_allowed(user_id) == False

def test_rate_limiter_resets_after_window():
    """Test that limit resets after time window"""
    limiter = RateLimiter(max_requests=2, window_seconds=1)

    user_id = "test_user"

    # Use up limit
    assert limiter.is_allowed(user_id) == True
    assert limiter.is_allowed(user_id) == True
    assert limiter.is_allowed(user_id) == False

    # Wait for window to pass (test with 1 second window)
    time.sleep(1.1)

    # Should be allowed again
    assert limiter.is_allowed(user_id) == True

def test_rate_limiter_per_user():
    """Test that rate limits are per-user"""
    limiter = RateLimiter(max_requests=2, window_seconds=60)

    # User 1 uses limit
    assert limiter.is_allowed("user1") == True
    assert limiter.is_allowed("user1") == True
    assert limiter.is_allowed("user1") == False

    # User 2 should have independent limit
    assert limiter.is_allowed("user2") == True
    assert limiter.is_allowed("user2") == True
    assert limiter.is_allowed("user2") == False
