50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import asyncio
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from yuxi.channels.adapters.twitch.rate_limiter import RateLimiter
|
||
|
|
|
||
|
|
|
||
|
|
class TestRateLimiter:
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_acquire_initial_tokens(self):
|
||
|
|
limiter = RateLimiter(limit=5, window=30.0)
|
||
|
|
for _ in range(5):
|
||
|
|
assert await limiter.acquire() is True
|
||
|
|
assert await limiter.acquire() is False
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_switch_to_mod_increases_limit(self):
|
||
|
|
limiter = RateLimiter(limit=5, window=30.0, mod_limit=10)
|
||
|
|
await limiter.switch_to_mod()
|
||
|
|
for _ in range(10):
|
||
|
|
assert await limiter.acquire() is True
|
||
|
|
assert await limiter.acquire() is False
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_switch_to_known_decreases_limit(self):
|
||
|
|
limiter = RateLimiter(limit=2, window=30.0, mod_limit=10)
|
||
|
|
await limiter.switch_to_mod()
|
||
|
|
for _ in range(10):
|
||
|
|
assert await limiter.acquire() is True
|
||
|
|
await limiter.switch_to_known()
|
||
|
|
assert await limiter.acquire() is True
|
||
|
|
assert await limiter.acquire() is True
|
||
|
|
assert await limiter.acquire() is False
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_switch_to_mod_idempotent(self):
|
||
|
|
limiter = RateLimiter(limit=2, window=30.0, mod_limit=10)
|
||
|
|
await limiter.switch_to_mod()
|
||
|
|
tokens_before = limiter.available_tokens
|
||
|
|
await limiter.switch_to_mod()
|
||
|
|
assert limiter.available_tokens == tokens_before
|
||
|
|
|
||
|
|
@pytest.mark.asyncio
|
||
|
|
async def test_available_tokens_property(self):
|
||
|
|
limiter = RateLimiter(limit=3, window=30.0)
|
||
|
|
assert limiter.available_tokens == 3.0
|
||
|
|
await limiter.acquire()
|
||
|
|
assert limiter.available_tokens < 3.0
|