Sentence trigger (#94613)
* Add async_register_trigger_sentences for default agent * Add trigger response and trigger handler * Check callback in test * Clean up and move response to callback * Add trigger test * Drop TriggerAction * Test we pass sentence to callback * Match triggers once, allow multiple sentences * Don't use trigger id * Use async callback * No response for now * Use asyncio.gather for callback responses * Fix after rebase * Use a list for trigger sentences --------- Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
This commit is contained in:
parent
29ef925d73
commit
d811fa0e74
4 changed files with 382 additions and 2 deletions
167
tests/components/conversation/test_trigger.py
Normal file
167
tests/components/conversation/test_trigger.py
Normal file
|
@ -0,0 +1,167 @@
|
|||
"""Test conversation triggers."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
from tests.common import async_mock_service
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def calls(hass):
|
||||
"""Track calls to a mock service."""
|
||||
return async_mock_service(hass, "test", "automation")
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
async def setup_comp(hass):
|
||||
"""Initialize components."""
|
||||
assert await async_setup_component(hass, "homeassistant", {})
|
||||
assert await async_setup_component(hass, "conversation", {})
|
||||
|
||||
|
||||
async def test_if_fires_on_event(hass: HomeAssistant, calls, setup_comp) -> None:
|
||||
"""Test the firing of events."""
|
||||
assert await async_setup_component(
|
||||
hass,
|
||||
"automation",
|
||||
{
|
||||
"automation": {
|
||||
"trigger": {
|
||||
"platform": "conversation",
|
||||
"command": [
|
||||
"Hey yo",
|
||||
"Ha ha ha",
|
||||
],
|
||||
},
|
||||
"action": {
|
||||
"service": "test.automation",
|
||||
"data_template": {"data": "{{ trigger }}"},
|
||||
},
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
await hass.services.async_call(
|
||||
"conversation",
|
||||
"process",
|
||||
{
|
||||
"text": "Ha ha ha",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
await hass.async_block_till_done()
|
||||
assert len(calls) == 1
|
||||
assert calls[0].data["data"] == {
|
||||
"alias": None,
|
||||
"id": "0",
|
||||
"idx": "0",
|
||||
"platform": "conversation",
|
||||
"sentence": "Ha ha ha",
|
||||
}
|
||||
|
||||
|
||||
async def test_same_trigger_multiple_sentences(
|
||||
hass: HomeAssistant, calls, setup_comp
|
||||
) -> None:
|
||||
"""Test matching of multiple sentences from the same trigger."""
|
||||
assert await async_setup_component(
|
||||
hass,
|
||||
"automation",
|
||||
{
|
||||
"automation": {
|
||||
"trigger": {
|
||||
"platform": "conversation",
|
||||
"command": ["hello", "hello[ world]"],
|
||||
},
|
||||
"action": {
|
||||
"service": "test.automation",
|
||||
"data_template": {"data": "{{ trigger }}"},
|
||||
},
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
await hass.services.async_call(
|
||||
"conversation",
|
||||
"process",
|
||||
{
|
||||
"text": "hello",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
# Only triggers once
|
||||
await hass.async_block_till_done()
|
||||
assert len(calls) == 1
|
||||
assert calls[0].data["data"] == {
|
||||
"alias": None,
|
||||
"id": "0",
|
||||
"idx": "0",
|
||||
"platform": "conversation",
|
||||
"sentence": "hello",
|
||||
}
|
||||
|
||||
|
||||
async def test_same_sentence_multiple_triggers(
|
||||
hass: HomeAssistant, calls, setup_comp
|
||||
) -> None:
|
||||
"""Test use of the same sentence in multiple triggers."""
|
||||
assert await async_setup_component(
|
||||
hass,
|
||||
"automation",
|
||||
{
|
||||
"automation": [
|
||||
{
|
||||
"trigger": {
|
||||
"id": "trigger1",
|
||||
"platform": "conversation",
|
||||
"command": [
|
||||
"hello",
|
||||
],
|
||||
},
|
||||
"action": {
|
||||
"service": "test.automation",
|
||||
"data_template": {"data": "{{ trigger }}"},
|
||||
},
|
||||
},
|
||||
{
|
||||
"trigger": {
|
||||
"id": "trigger2",
|
||||
"platform": "conversation",
|
||||
"command": [
|
||||
"hello[ world]",
|
||||
],
|
||||
},
|
||||
"action": {
|
||||
"service": "test.automation",
|
||||
"data_template": {"data": "{{ trigger }}"},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
await hass.services.async_call(
|
||||
"conversation",
|
||||
"process",
|
||||
{
|
||||
"text": "hello",
|
||||
},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
await hass.async_block_till_done()
|
||||
assert len(calls) == 2
|
||||
|
||||
# The calls may come in any order
|
||||
call_datas: set[tuple[str, str, str]] = set()
|
||||
for call in calls:
|
||||
call_data = call.data["data"]
|
||||
call_datas.add((call_data["id"], call_data["platform"], call_data["sentence"]))
|
||||
|
||||
assert call_datas == {
|
||||
("trigger1", "conversation", "hello"),
|
||||
("trigger2", "conversation", "hello"),
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue