|
1 | 1 | """Test ESPHome binary sensors.""" |
2 | 2 |
|
3 | 3 | import asyncio |
| 4 | +from dataclasses import asdict |
4 | 5 | from typing import Any |
5 | 6 | from unittest.mock import AsyncMock |
6 | 7 |
|
7 | 8 | from aioesphomeapi import ( |
8 | 9 | APIClient, |
9 | 10 | BinarySensorInfo, |
10 | 11 | BinarySensorState, |
| 12 | + DeviceInfo, |
11 | 13 | SensorInfo, |
12 | 14 | SensorState, |
13 | 15 | build_unique_id, |
@@ -665,3 +667,63 @@ async def test_entity_id_preserved_on_upgrade_when_in_storage( |
665 | 667 | ) |
666 | 668 | state = hass.states.get("binary_sensor.user_named") |
667 | 669 | assert state is not None |
| 670 | + |
| 671 | + |
| 672 | +async def test_deep_sleep_added_after_setup( |
| 673 | + hass: HomeAssistant, |
| 674 | + mock_client: APIClient, |
| 675 | + mock_esphome_device: MockESPHomeDeviceType, |
| 676 | +) -> None: |
| 677 | + """Test deep sleep added after setup.""" |
| 678 | + mock_device = await mock_esphome_device( |
| 679 | + mock_client=mock_client, |
| 680 | + entity_info=[ |
| 681 | + BinarySensorInfo( |
| 682 | + object_id="test", |
| 683 | + key=1, |
| 684 | + name="test", |
| 685 | + unique_id="test", |
| 686 | + ), |
| 687 | + ], |
| 688 | + user_service=[], |
| 689 | + states=[ |
| 690 | + BinarySensorState(key=1, state=True, missing_state=False), |
| 691 | + ], |
| 692 | + device_info={"has_deep_sleep": False}, |
| 693 | + ) |
| 694 | + |
| 695 | + entity_id = "binary_sensor.test_test" |
| 696 | + state = hass.states.get(entity_id) |
| 697 | + assert state is not None |
| 698 | + assert state.state == STATE_ON |
| 699 | + |
| 700 | + await mock_device.mock_disconnect(expected_disconnect=True) |
| 701 | + |
| 702 | + # No deep sleep, should be unavailable |
| 703 | + state = hass.states.get(entity_id) |
| 704 | + assert state is not None |
| 705 | + assert state.state == STATE_UNAVAILABLE |
| 706 | + |
| 707 | + await mock_device.mock_connect() |
| 708 | + |
| 709 | + # reconnect, should be available |
| 710 | + state = hass.states.get(entity_id) |
| 711 | + assert state is not None |
| 712 | + assert state.state == STATE_ON |
| 713 | + |
| 714 | + await mock_device.mock_disconnect(expected_disconnect=True) |
| 715 | + new_device_info = DeviceInfo( |
| 716 | + **{**asdict(mock_device.device_info), "has_deep_sleep": True} |
| 717 | + ) |
| 718 | + mock_device.client.device_info = AsyncMock(return_value=new_device_info) |
| 719 | + mock_device.device_info = new_device_info |
| 720 | + |
| 721 | + await mock_device.mock_connect() |
| 722 | + |
| 723 | + # Now disconnect that deep sleep is set in device info |
| 724 | + await mock_device.mock_disconnect(expected_disconnect=True) |
| 725 | + |
| 726 | + # Deep sleep, should be available |
| 727 | + state = hass.states.get(entity_id) |
| 728 | + assert state is not None |
| 729 | + assert state.state == STATE_ON |
0 commit comments