mirror of
https://github.com/home-assistant/core.git
synced 2026-02-21 10:27:52 +00:00
151 lines
4.8 KiB
Python
151 lines
4.8 KiB
Python
"""Test the ekey bionyx event platform."""
|
|
|
|
from http import HTTPStatus
|
|
|
|
from aiohttp.test_utils import TestClient
|
|
|
|
from homeassistant.components.event import ATTR_EVENT_TYPE, ATTR_EVENT_TYPES
|
|
from homeassistant.config_entries import ConfigEntryState
|
|
from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
async def test_event_entity_setup(
|
|
hass: HomeAssistant, load_config_entry: None, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test event entity is set up correctly."""
|
|
# Check that entity was created
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
|
|
async def test_event_types_attribute(
|
|
hass: HomeAssistant, load_config_entry: None, config_entry: MockConfigEntry
|
|
) -> None:
|
|
"""Test event entity has correct event_types attribute."""
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
|
|
# Check event_types attribute
|
|
event_types = state.attributes.get(ATTR_EVENT_TYPES)
|
|
assert event_types is not None
|
|
assert event_types == ["event happened"]
|
|
|
|
|
|
async def test_config_entry_unload(
|
|
hass: HomeAssistant,
|
|
load_config_entry: None,
|
|
config_entry: MockConfigEntry,
|
|
) -> None:
|
|
"""Test config entry can be unloaded."""
|
|
assert config_entry.state is ConfigEntryState.LOADED
|
|
|
|
# Verify entity exists
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
# Unload config entry
|
|
await hass.config_entries.async_unload(config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert config_entry.state is ConfigEntryState.NOT_LOADED
|
|
|
|
# Entity should become unavailable
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNAVAILABLE
|
|
|
|
|
|
async def test_webhook_handler_triggers_event(
|
|
hass: HomeAssistant,
|
|
config_entry: MockConfigEntry,
|
|
webhook_test_env: TestClient,
|
|
) -> None:
|
|
"""Test webhook handler triggers event via HTTP request."""
|
|
webhook_data = config_entry.data["webhooks"][0]
|
|
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
response = await webhook_test_env.post(
|
|
f"/api/webhook/{webhook_data['webhook_id']}",
|
|
json={"auth": webhook_data["auth"]},
|
|
)
|
|
assert response.status == HTTPStatus.OK
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state not in (STATE_UNKNOWN, None)
|
|
assert state.attributes.get(ATTR_EVENT_TYPE) == "event happened"
|
|
|
|
|
|
async def test_webhook_handler_rejects_invalid_auth(
|
|
hass: HomeAssistant,
|
|
config_entry: MockConfigEntry,
|
|
webhook_test_env: TestClient,
|
|
) -> None:
|
|
"""Test webhook handler ignores requests with invalid auth."""
|
|
webhook_data = config_entry.data["webhooks"][0]
|
|
|
|
response = await webhook_test_env.post(
|
|
f"/api/webhook/{webhook_data['webhook_id']}",
|
|
json={"auth": "invalid"},
|
|
)
|
|
assert response.status == HTTPStatus.UNAUTHORIZED
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
|
|
async def test_webhook_handler_missing_auth(
|
|
hass: HomeAssistant,
|
|
config_entry: MockConfigEntry,
|
|
webhook_test_env: TestClient,
|
|
) -> None:
|
|
"""Test webhook handler requires the auth field."""
|
|
webhook_data = config_entry.data["webhooks"][0]
|
|
|
|
response = await webhook_test_env.post(
|
|
f"/api/webhook/{webhook_data['webhook_id']}",
|
|
json={"not_auth": "value"},
|
|
)
|
|
assert response.status == HTTPStatus.BAD_REQUEST
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
|
|
async def test_webhook_handler_invalid_json(
|
|
hass: HomeAssistant,
|
|
config_entry: MockConfigEntry,
|
|
webhook_test_env: TestClient,
|
|
) -> None:
|
|
"""Test webhook handler rejects invalid JSON payloads."""
|
|
webhook_data = config_entry.data["webhooks"][0]
|
|
|
|
response = await webhook_test_env.post(
|
|
f"/api/webhook/{webhook_data['webhook_id']}",
|
|
data="not json",
|
|
headers={"Content-Type": "application/json"},
|
|
)
|
|
assert response.status == HTTPStatus.BAD_REQUEST
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
state = hass.states.get(f"event.{config_entry.data['webhooks'][0]['name']}")
|
|
assert state is not None
|
|
assert state.state == STATE_UNKNOWN
|