"""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
