From 0429b321b8f3a7b3a381a96003f1d7c561f2eab4 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 20 Apr 2023 14:58:43 +0200 Subject: [PATCH] Include matching languages in WS conversation/agent/list (#91730) * Include matching languages in WS conversation/agent/list * Allow specifying country --- .../components/conversation/__init__.py | 14 ++- .../conversation/snapshots/test_init.ambr | 118 +++++++++++++++++- tests/components/conversation/test_init.py | 16 +++ 3 files changed, 138 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index 0f971704bef..5692ddf3a06 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -250,6 +250,7 @@ async def websocket_get_agent_info( { vol.Required("type"): "conversation/agent/list", vol.Optional("language"): str, + vol.Optional("country"): str, } ) @websocket_api.async_response @@ -259,15 +260,20 @@ async def websocket_list_agents( """List conversation agents and, optionally, if they support a given language.""" manager = _get_agent_manager(hass) + country = msg.get("country") language = msg.get("language") agents = [] for agent_info in manager.async_get_agent_info(): - agent_dict: dict[str, Any] = {"id": agent_info.id, "name": agent_info.name} + agent = await manager.async_get_agent(agent_info.id) + agent_dict: dict[str, Any] = { + "id": agent_info.id, + "name": agent_info.name, + "supported_languages": agent.supported_languages, + } if language: - agent = await manager.async_get_agent(agent_info.id) - agent_dict["language_supported"] = bool( - language_util.matches(language, agent.supported_languages) + agent_dict["supported_languages"] = language_util.matches( + language, agent.supported_languages, country ) agents.append(agent_dict) diff --git a/tests/components/conversation/snapshots/test_init.ambr b/tests/components/conversation/snapshots/test_init.ambr index 116e7da203e..cca40a57a72 100644 --- a/tests/components/conversation/snapshots/test_init.ambr +++ b/tests/components/conversation/snapshots/test_init.ambr @@ -23,10 +23,67 @@ dict({ 'id': 'homeassistant', 'name': 'Home Assistant', + 'supported_languages': list([ + 'ar', + 'bg', + 'bn', + 'ca', + 'cs', + 'da', + 'de', + 'de-CH', + 'el', + 'en', + 'es', + 'fa', + 'fi', + 'fr', + 'fr-CA', + 'gl', + 'gu', + 'he', + 'hi', + 'hr', + 'hu', + 'id', + 'is', + 'it', + 'ka', + 'kn', + 'lb', + 'lt', + 'lv', + 'ml', + 'mn', + 'ms', + 'nb', + 'nl', + 'pl', + 'pt', + 'pt-br', + 'ro', + 'ru', + 'sk', + 'sl', + 'sr', + 'sv', + 'sw', + 'te', + 'tr', + 'uk', + 'ur', + 'vi', + 'zh-cn', + 'zh-hk', + 'zh-tw', + ]), }), dict({ 'id': 'mock-entry', 'name': 'Mock Title', + 'supported_languages': list([ + 'smurfish', + ]), }), ]), }) @@ -36,13 +93,16 @@ 'agents': list([ dict({ 'id': 'homeassistant', - 'language_supported': False, 'name': 'Home Assistant', + 'supported_languages': list([ + ]), }), dict({ 'id': 'mock-entry', - 'language_supported': True, 'name': 'Mock Title', + 'supported_languages': list([ + 'smurfish', + ]), }), ]), }) @@ -52,13 +112,16 @@ 'agents': list([ dict({ 'id': 'homeassistant', - 'language_supported': True, 'name': 'Home Assistant', + 'supported_languages': list([ + 'en', + ]), }), dict({ 'id': 'mock-entry', - 'language_supported': False, 'name': 'Mock Title', + 'supported_languages': list([ + ]), }), ]), }) @@ -68,13 +131,56 @@ 'agents': list([ dict({ 'id': 'homeassistant', - 'language_supported': True, 'name': 'Home Assistant', + 'supported_languages': list([ + 'en', + ]), }), dict({ 'id': 'mock-entry', - 'language_supported': False, 'name': 'Mock Title', + 'supported_languages': list([ + ]), + }), + ]), + }) +# --- +# name: test_get_agent_list.4 + dict({ + 'agents': list([ + dict({ + 'id': 'homeassistant', + 'name': 'Home Assistant', + 'supported_languages': list([ + 'de', + 'de-CH', + ]), + }), + dict({ + 'id': 'mock-entry', + 'name': 'Mock Title', + 'supported_languages': list([ + ]), + }), + ]), + }) +# --- +# name: test_get_agent_list.5 + dict({ + 'agents': list([ + dict({ + 'id': 'homeassistant', + 'name': 'Home Assistant', + 'supported_languages': list([ + 'de', + 'de-CH', + ]), + }), + dict({ + 'id': 'mock-entry', + 'name': 'Mock Title', + 'supported_languages': list([ + ]), }), ]), }) diff --git a/tests/components/conversation/test_init.py b/tests/components/conversation/test_init.py index 88a7c53786b..8ab2f1748fe 100644 --- a/tests/components/conversation/test_init.py +++ b/tests/components/conversation/test_init.py @@ -1612,6 +1612,22 @@ async def test_get_agent_list( assert msg["success"] assert msg["result"] == snapshot + await client.send_json_auto_id( + {"type": "conversation/agent/list", "language": "de"} + ) + msg = await client.receive_json() + assert msg["type"] == "result" + assert msg["success"] + assert msg["result"] == snapshot + + await client.send_json_auto_id( + {"type": "conversation/agent/list", "language": "de", "country": "ch"} + ) + msg = await client.receive_json() + assert msg["type"] == "result" + assert msg["success"] + assert msg["result"] == snapshot + async def test_get_agent_info( hass: HomeAssistant, init_components, mock_agent, snapshot: SnapshotAssertion