fetch_cat() передаёт x-api-key при наличии CAT_API_KEY в окружении
This commit is contained in:
parent
0d5d8dbe7b
commit
3888c3cd01
@ -2,6 +2,7 @@ DISCORD_TOKEN=your_bot_token_here
|
|||||||
MORNING_TIME=07:00
|
MORNING_TIME=07:00
|
||||||
MORNING_CHANNEL_ID=channel_id
|
MORNING_CHANNEL_ID=channel_id
|
||||||
LOG_LEVEL=INFO
|
LOG_LEVEL=INFO
|
||||||
|
CAT_API_KEY=your_cat_api_key_here
|
||||||
CAT_API_RATE=1
|
CAT_API_RATE=1
|
||||||
CAT_API_BURST=3
|
CAT_API_BURST=3
|
||||||
WEATHER_API_RATE=1
|
WEATHER_API_RATE=1
|
||||||
|
|||||||
@ -97,3 +97,28 @@ class TestFetchCat:
|
|||||||
mock_get.return_value = mock_response
|
mock_get.return_value = mock_response
|
||||||
result = await fetch_cat()
|
result = await fetch_cat()
|
||||||
assert result == "https://example.com/cat?w=100&h=200"
|
assert result == "https://example.com/cat?w=100&h=200"
|
||||||
|
|
||||||
|
@patch("utils.cat._session.get")
|
||||||
|
@patch("utils.cat._cat_api_key", "test-api-key-123")
|
||||||
|
async def test_fetch_cat_sends_api_key_header(self, mock_get) -> None:
|
||||||
|
"""При заданном CAT_API_KEY должен передаваться заголовок x-api-key."""
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.json.return_value = [{"url": "https://example.com/cat.jpg"}]
|
||||||
|
mock_response.raise_for_status = MagicMock()
|
||||||
|
mock_get.return_value = mock_response
|
||||||
|
await fetch_cat()
|
||||||
|
# Проверяем, что headers переданы с x-api-key
|
||||||
|
call_kwargs = mock_get.call_args
|
||||||
|
assert call_kwargs[1].get("headers") == {"x-api-key": "test-api-key-123"}
|
||||||
|
|
||||||
|
@patch("utils.cat._session.get")
|
||||||
|
@patch("utils.cat._cat_api_key", None)
|
||||||
|
async def test_fetch_cat_no_api_key_header(self, mock_get) -> None:
|
||||||
|
"""При отсутствии CAT_API_KEY заголовок x-api-key не передаётся."""
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.json.return_value = [{"url": "https://example.com/cat.jpg"}]
|
||||||
|
mock_response.raise_for_status = MagicMock()
|
||||||
|
mock_get.return_value = mock_response
|
||||||
|
await fetch_cat()
|
||||||
|
call_kwargs = mock_get.call_args
|
||||||
|
assert call_kwargs[1].get("headers") is None
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
@ -8,6 +9,7 @@ from utils.rate_limiter import cat_limiter
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
CAT_API_URL = "https://api.thecatapi.com/v1/images/search"
|
CAT_API_URL = "https://api.thecatapi.com/v1/images/search"
|
||||||
|
_cat_api_key: str | None = os.getenv("CAT_API_KEY")
|
||||||
|
|
||||||
_session = requests.Session()
|
_session = requests.Session()
|
||||||
|
|
||||||
@ -15,8 +17,13 @@ _session = requests.Session()
|
|||||||
async def fetch_cat() -> str | None:
|
async def fetch_cat() -> str | None:
|
||||||
"""Получить URL случайного котика. Вернуть None при ошибке."""
|
"""Получить URL случайного котика. Вернуть None при ошибке."""
|
||||||
await cat_limiter.acquire()
|
await cat_limiter.acquire()
|
||||||
|
headers: dict[str, str] | None = None
|
||||||
|
if _cat_api_key:
|
||||||
|
headers = {"x-api-key": _cat_api_key}
|
||||||
try:
|
try:
|
||||||
response = await asyncio.to_thread(_session.get, CAT_API_URL, timeout=10)
|
response = await asyncio.to_thread(
|
||||||
|
_session.get, CAT_API_URL, timeout=10, headers=headers
|
||||||
|
)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
data = response.json()
|
data = response.json()
|
||||||
return data[0]["url"]
|
return data[0]["url"]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user