home-assistant-core/tests/components/discord/test_notify.py
Ian Byrne 9be2704c11
Add option to include attachments from remote URL to Discord notifications (#74811)
* Add option to include attachments from remote URL to Discord notifications

* Use aiohttp instead of requests for Discord Notify URL retrieval

* Refactor discord notifications code

* Remove unecessary images check in discord notifier
2022-11-12 16:11:06 -08:00

97 lines
3.5 KiB
Python

"""Test Discord notify."""
import logging
import pytest
from homeassistant.components.discord.notify import DiscordNotificationService
from .conftest import CONTENT, MESSAGE, URL_ATTACHMENT
from tests.test_util.aiohttp import AiohttpClientMocker
async def test_send_message_without_target_logs_error(
discord_notification_service: DiscordNotificationService,
discord_aiohttp_mock_factory: AiohttpClientMocker,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test send message."""
discord_aiohttp_mock = discord_aiohttp_mock_factory()
with caplog.at_level(
logging.ERROR, logger="homeassistant.components.discord.notify"
):
await discord_notification_service.async_send_message(MESSAGE)
assert "No target specified" in caplog.text
assert discord_aiohttp_mock.call_count == 0
async def test_get_file_from_url(
discord_notification_service: DiscordNotificationService,
discord_aiohttp_mock_factory: AiohttpClientMocker,
) -> None:
"""Test getting a file from a URL."""
headers = {"Content-Length": str(len(CONTENT))}
discord_aiohttp_mock = discord_aiohttp_mock_factory(headers)
result = await discord_notification_service.async_get_file_from_url(
URL_ATTACHMENT, True, len(CONTENT)
)
assert discord_aiohttp_mock.call_count == 1
assert result == bytearray(CONTENT)
async def test_get_file_from_url_not_on_allowlist(
discord_notification_service: DiscordNotificationService,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test getting file from URL that isn't on the allowlist."""
url = "http://dodgyurl.com"
with caplog.at_level(
logging.WARNING, logger="homeassistant.components.discord.notify"
):
result = await discord_notification_service.async_get_file_from_url(
url, True, len(CONTENT)
)
assert f"URL not allowed: {url}" in caplog.text
assert result is None
async def test_get_file_from_url_with_large_attachment(
discord_notification_service: DiscordNotificationService,
discord_aiohttp_mock_factory: AiohttpClientMocker,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test getting file from URL with large attachment (per Content-Length header) throws error."""
headers = {"Content-Length": str(len(CONTENT) + 1)}
discord_aiohttp_mock = discord_aiohttp_mock_factory(headers)
with caplog.at_level(
logging.WARNING, logger="homeassistant.components.discord.notify"
):
result = await discord_notification_service.async_get_file_from_url(
URL_ATTACHMENT, True, len(CONTENT)
)
assert discord_aiohttp_mock.call_count == 1
assert "Attachment too large (Content-Length reports" in caplog.text
assert result is None
async def test_get_file_from_url_with_large_attachment_no_header(
discord_notification_service: DiscordNotificationService,
discord_aiohttp_mock_factory: AiohttpClientMocker,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test getting file from URL with large attachment (per content length) throws error."""
discord_aiohttp_mock = discord_aiohttp_mock_factory()
with caplog.at_level(
logging.WARNING, logger="homeassistant.components.discord.notify"
):
result = await discord_notification_service.async_get_file_from_url(
URL_ATTACHMENT, True, len(CONTENT) - 1
)
assert discord_aiohttp_mock.call_count == 1
assert "Attachment too large (Stream reports" in caplog.text
assert result is None