84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
"""Test the Reolink host."""
|
|
|
|
from asyncio import CancelledError
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
from aiohttp import ClientResponseError
|
|
import pytest
|
|
|
|
from homeassistant.components.reolink import const
|
|
from homeassistant.components.webhook import async_handle_webhook
|
|
from homeassistant.config_entries import ConfigEntryState
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
|
from homeassistant.util.aiohttp import MockRequest
|
|
|
|
from .conftest import TEST_UID
|
|
|
|
from tests.common import MockConfigEntry
|
|
from tests.typing import ClientSessionGenerator
|
|
|
|
|
|
async def test_webhook_callback(
|
|
hass: HomeAssistant,
|
|
hass_client_no_auth: ClientSessionGenerator,
|
|
config_entry: MockConfigEntry,
|
|
reolink_connect: MagicMock,
|
|
entity_registry: er.EntityRegistry,
|
|
) -> None:
|
|
"""Test webhook callback with motion sensor."""
|
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
assert config_entry.state is ConfigEntryState.LOADED
|
|
|
|
webhook_id = f"{const.DOMAIN}_{TEST_UID.replace(':', '')}_ONVIF"
|
|
|
|
signal_all = MagicMock()
|
|
signal_ch = MagicMock()
|
|
async_dispatcher_connect(hass, f"{webhook_id}_all", signal_all)
|
|
async_dispatcher_connect(hass, f"{webhook_id}_0", signal_ch)
|
|
|
|
client = await hass_client_no_auth()
|
|
|
|
# test webhook callback success all channels
|
|
reolink_connect.ONVIF_event_callback.return_value = None
|
|
await client.post(f"/api/webhook/{webhook_id}")
|
|
signal_all.assert_called_once()
|
|
|
|
# test webhook callback all channels with failure to read motion_state
|
|
signal_all.reset_mock()
|
|
reolink_connect.get_motion_state_all_ch.return_value = False
|
|
await client.post(f"/api/webhook/{webhook_id}")
|
|
signal_all.assert_not_called()
|
|
|
|
# test webhook callback success single channel
|
|
reolink_connect.ONVIF_event_callback.return_value = [0]
|
|
await client.post(f"/api/webhook/{webhook_id}", data="test_data")
|
|
signal_ch.assert_called_once()
|
|
|
|
# test webhook callback single channel with error in event callback
|
|
signal_ch.reset_mock()
|
|
reolink_connect.ONVIF_event_callback.side_effect = Exception("Test error")
|
|
await client.post(f"/api/webhook/{webhook_id}", data="test_data")
|
|
signal_ch.assert_not_called()
|
|
|
|
# test failure to read date from webhook post
|
|
request = MockRequest(
|
|
method="POST",
|
|
content=bytes("test", "utf-8"),
|
|
mock_source="test",
|
|
)
|
|
request.read = AsyncMock(side_effect=ConnectionResetError("Test error"))
|
|
await async_handle_webhook(hass, webhook_id, request)
|
|
signal_all.assert_not_called()
|
|
|
|
request.read = AsyncMock(side_effect=ClientResponseError("Test error", "Test"))
|
|
await async_handle_webhook(hass, webhook_id, request)
|
|
signal_all.assert_not_called()
|
|
|
|
request.read = AsyncMock(side_effect=CancelledError("Test error"))
|
|
with pytest.raises(CancelledError):
|
|
await async_handle_webhook(hass, webhook_id, request)
|
|
signal_all.assert_not_called()
|