Add unit test suite with pytest configuration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
92
tests/unit/test_rate_limiting.py
Normal file
92
tests/unit/test_rate_limiting.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""Tests for rate limiting logic in email and WhatsApp blueprints."""
|
||||
|
||||
import time
|
||||
|
||||
|
||||
class TestEmailRateLimit:
|
||||
def setup_method(self):
|
||||
"""Reset rate limit store before each test."""
|
||||
from blueprints.email import _rate_limit_store
|
||||
|
||||
_rate_limit_store.clear()
|
||||
|
||||
def test_allows_under_limit(self):
|
||||
from blueprints.email import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
assert _check_rate_limit("sender@test.com") is True
|
||||
|
||||
def test_blocks_at_limit(self):
|
||||
from blueprints.email import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
_check_rate_limit("sender@test.com")
|
||||
|
||||
assert _check_rate_limit("sender@test.com") is False
|
||||
|
||||
def test_different_senders_independent(self):
|
||||
from blueprints.email import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
_check_rate_limit("user1@test.com")
|
||||
|
||||
# user1 is at limit, but user2 should be fine
|
||||
assert _check_rate_limit("user1@test.com") is False
|
||||
assert _check_rate_limit("user2@test.com") is True
|
||||
|
||||
def test_window_expiry(self):
|
||||
from blueprints.email import (
|
||||
_check_rate_limit,
|
||||
_rate_limit_store,
|
||||
RATE_LIMIT_MAX,
|
||||
)
|
||||
|
||||
# Fill up the rate limit with timestamps in the past
|
||||
past = time.monotonic() - 999 # Well beyond any window
|
||||
_rate_limit_store["old@test.com"] = [past] * RATE_LIMIT_MAX
|
||||
|
||||
# Should be allowed because all timestamps are expired
|
||||
assert _check_rate_limit("old@test.com") is True
|
||||
|
||||
|
||||
class TestWhatsAppRateLimit:
|
||||
def setup_method(self):
|
||||
"""Reset rate limit store before each test."""
|
||||
from blueprints.whatsapp import _rate_limit_store
|
||||
|
||||
_rate_limit_store.clear()
|
||||
|
||||
def test_allows_under_limit(self):
|
||||
from blueprints.whatsapp import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
assert _check_rate_limit("whatsapp:+1234567890") is True
|
||||
|
||||
def test_blocks_at_limit(self):
|
||||
from blueprints.whatsapp import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
_check_rate_limit("whatsapp:+1234567890")
|
||||
|
||||
assert _check_rate_limit("whatsapp:+1234567890") is False
|
||||
|
||||
def test_different_numbers_independent(self):
|
||||
from blueprints.whatsapp import _check_rate_limit, RATE_LIMIT_MAX
|
||||
|
||||
for _ in range(RATE_LIMIT_MAX):
|
||||
_check_rate_limit("whatsapp:+1111111111")
|
||||
|
||||
assert _check_rate_limit("whatsapp:+1111111111") is False
|
||||
assert _check_rate_limit("whatsapp:+2222222222") is True
|
||||
|
||||
def test_window_expiry(self):
|
||||
from blueprints.whatsapp import (
|
||||
_check_rate_limit,
|
||||
_rate_limit_store,
|
||||
RATE_LIMIT_MAX,
|
||||
)
|
||||
|
||||
past = time.monotonic() - 999
|
||||
_rate_limit_store["whatsapp:+9999999999"] = [past] * RATE_LIMIT_MAX
|
||||
|
||||
assert _check_rate_limit("whatsapp:+9999999999") is True
|
||||
Reference in New Issue
Block a user