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