From cab6ec0363824ce78932a7b711ed1d3513d7946a Mon Sep 17 00:00:00 2001
From: Erik Montnemery <erik@montnemery.com>
Date: Wed, 26 Feb 2025 09:02:17 +0100
Subject: [PATCH] Fix homeassistant/expose_entity/list (#138872)

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
---
 .../homeassistant/exposed_entities.py         | 11 +++---
 .../homeassistant/test_exposed_entities.py    | 34 ++++++++++++++-----
 2 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/homeassistant/components/homeassistant/exposed_entities.py b/homeassistant/components/homeassistant/exposed_entities.py
index 7bd9f9ab7bc..b7e420dedde 100644
--- a/homeassistant/components/homeassistant/exposed_entities.py
+++ b/homeassistant/components/homeassistant/exposed_entities.py
@@ -437,18 +437,21 @@ def ws_expose_entity(
 def ws_list_exposed_entities(
     hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict[str, Any]
 ) -> None:
-    """Expose an entity to an assistant."""
+    """List entities which are exposed to assistants."""
     result: dict[str, Any] = {}
 
     exposed_entities = hass.data[DATA_EXPOSED_ENTITIES]
     entity_registry = er.async_get(hass)
     for entity_id in chain(exposed_entities.entities, entity_registry.entities):
-        result[entity_id] = {}
+        exposed_to = {}
         entity_settings = async_get_entity_settings(hass, entity_id)
         for assistant, settings in entity_settings.items():
-            if "should_expose" not in settings:
+            if "should_expose" not in settings or not settings["should_expose"]:
                 continue
-            result[entity_id][assistant] = settings["should_expose"]
+            exposed_to[assistant] = True
+        if not exposed_to:
+            continue
+        result[entity_id] = exposed_to
     connection.send_result(msg["id"], {"exposed_entities": result})
 
 
diff --git a/tests/components/homeassistant/test_exposed_entities.py b/tests/components/homeassistant/test_exposed_entities.py
index 1f1955c2f82..ec87672e75c 100644
--- a/tests/components/homeassistant/test_exposed_entities.py
+++ b/tests/components/homeassistant/test_exposed_entities.py
@@ -497,28 +497,48 @@ async def test_list_exposed_entities(
 
     entry1 = entity_registry.async_get_or_create("test", "test", "unique1")
     entry2 = entity_registry.async_get_or_create("test", "test", "unique2")
+    entity_registry.async_get_or_create("test", "test", "unique3")
 
     # Set options for registered entities
     await ws_client.send_json_auto_id(
         {
             "type": "homeassistant/expose_entity",
             "assistants": ["cloud.alexa", "cloud.google_assistant"],
-            "entity_ids": [entry1.entity_id, entry2.entity_id],
+            "entity_ids": [entry1.entity_id],
             "should_expose": True,
         }
     )
     response = await ws_client.receive_json()
     assert response["success"]
 
+    await ws_client.send_json_auto_id(
+        {
+            "type": "homeassistant/expose_entity",
+            "assistants": ["cloud.alexa", "cloud.google_assistant"],
+            "entity_ids": [entry2.entity_id],
+            "should_expose": False,
+        }
+    )
+    response = await ws_client.receive_json()
+    assert response["success"]
+
     # Set options for entities not in the entity registry
     await ws_client.send_json_auto_id(
         {
             "type": "homeassistant/expose_entity",
             "assistants": ["cloud.alexa", "cloud.google_assistant"],
-            "entity_ids": [
-                "test.test",
-                "test.test2",
-            ],
+            "entity_ids": ["test.test"],
+            "should_expose": True,
+        }
+    )
+    response = await ws_client.receive_json()
+    assert response["success"]
+
+    await ws_client.send_json_auto_id(
+        {
+            "type": "homeassistant/expose_entity",
+            "assistants": ["cloud.alexa", "cloud.google_assistant"],
+            "entity_ids": ["test.test2"],
             "should_expose": False,
         }
     )
@@ -531,10 +551,8 @@ async def test_list_exposed_entities(
     assert response["success"]
     assert response["result"] == {
         "exposed_entities": {
-            "test.test": {"cloud.alexa": False, "cloud.google_assistant": False},
-            "test.test2": {"cloud.alexa": False, "cloud.google_assistant": False},
+            "test.test": {"cloud.alexa": True, "cloud.google_assistant": True},
             "test.test_unique1": {"cloud.alexa": True, "cloud.google_assistant": True},
-            "test.test_unique2": {"cloud.alexa": True, "cloud.google_assistant": True},
         },
     }
 
-- 
GitLab