|
3 | 3 | import logging |
4 | 4 | from datetime import datetime |
5 | 5 |
|
| 6 | +import pytest |
| 7 | + |
6 | 8 | from homeassistant_api import Client |
7 | 9 | from homeassistant_api.errors import RequestError |
8 | 10 | from homeassistant_api.models import ConfigEntryDisabler |
@@ -154,6 +156,48 @@ async def test_async_get_entities(async_cached_client: Client) -> None: |
154 | 156 | assert "sun" in entities |
155 | 157 |
|
156 | 158 |
|
| 159 | +def test_websocket_get_config(websocket_client: WebsocketClient) -> None: |
| 160 | + """Tests the `"type": "get_config"` websocket command.""" |
| 161 | + config = websocket_client.get_config() |
| 162 | + assert isinstance(config, dict) |
| 163 | + assert config.get("state") in {"RUNNING", "NOT_RUNNING"} |
| 164 | + |
| 165 | + |
| 166 | +def test_websocket_get_state(websocket_client: WebsocketClient) -> None: |
| 167 | + """Tests WebsocketClient.get_state with entity_id.""" |
| 168 | + state = websocket_client.get_state(entity_id="sun.sun") |
| 169 | + assert state.entity_id == "sun.sun" |
| 170 | + assert state.state in {"above_horizon", "below_horizon"} |
| 171 | + |
| 172 | + |
| 173 | +def test_websocket_get_entity_by_group_slug(websocket_client: WebsocketClient) -> None: |
| 174 | + """Tests WebsocketClient.get_entity with group_id and slug.""" |
| 175 | + entity = websocket_client.get_entity(group_id="sun", slug="sun") |
| 176 | + assert entity is not None |
| 177 | + assert entity.entity_id == "sun.sun" |
| 178 | + |
| 179 | + |
| 180 | +def test_websocket_get_entity_by_entity_id(websocket_client: WebsocketClient) -> None: |
| 181 | + """Tests WebsocketClient.get_entity with entity_id.""" |
| 182 | + entity = websocket_client.get_entity(entity_id="sun.sun") |
| 183 | + assert entity is not None |
| 184 | + assert entity.entity_id == "sun.sun" |
| 185 | + |
| 186 | + |
| 187 | +def test_websocket_get_entity_no_args(websocket_client: WebsocketClient) -> None: |
| 188 | + """Tests WebsocketClient.get_entity raises ValueError with no arguments.""" |
| 189 | + with pytest.raises( |
| 190 | + ValueError, match="Neither group_id and slug or entity_id provided" |
| 191 | + ): |
| 192 | + websocket_client.get_entity() |
| 193 | + |
| 194 | + |
| 195 | +def test_websocket_get_state_not_found(websocket_client: WebsocketClient) -> None: |
| 196 | + """Tests WebsocketClient.get_state raises ValueError for nonexistent entity.""" |
| 197 | + with pytest.raises(ValueError, match="not found"): |
| 198 | + websocket_client.get_state(entity_id="fake.nonexistent_entity_12345") |
| 199 | + |
| 200 | + |
157 | 201 | def test_websocket_get_entities(websocket_client: WebsocketClient) -> None: |
158 | 202 | """Tests the `"type": "get_entities"` websocket command.""" |
159 | 203 | entities = websocket_client.get_entities() |
@@ -325,6 +369,22 @@ def test_websocket_trigger_service(websocket_client: WebsocketClient) -> None: |
325 | 369 | assert resp is None |
326 | 370 |
|
327 | 371 |
|
| 372 | +def test_websocket_trigger_service_with_entity_id( |
| 373 | + websocket_client: WebsocketClient, |
| 374 | +) -> None: |
| 375 | + """Tests websocket trigger_service with an entity_id target.""" |
| 376 | + state_before = websocket_client.get_state(entity_id="sun.sun") |
| 377 | + websocket_client.trigger_service( |
| 378 | + "homeassistant", |
| 379 | + "update_entity", |
| 380 | + entity_id="sun.sun", |
| 381 | + ) |
| 382 | + state_after = websocket_client.get_state(entity_id="sun.sun") |
| 383 | + # update_entity refreshes the entity; state should remain valid |
| 384 | + assert state_after.entity_id == state_before.entity_id |
| 385 | + assert state_after.state in {"above_horizon", "below_horizon"} |
| 386 | + |
| 387 | + |
328 | 388 | def test_trigger_service_with_response(cached_client: Client) -> None: |
329 | 389 | """Tests the `POST /api/services/<domain>/<service>?return_response` endpoint.""" |
330 | 390 | weather = cached_client.get_domain("weather") |
|
0 commit comments