mirror of
https://github.com/home-assistant/core.git
synced 2026-02-21 18:38:17 +00:00
135 lines
4.1 KiB
Python
135 lines
4.1 KiB
Python
"""Test Yellow beta firmware switch entity."""
|
|
|
|
from unittest.mock import Mock, call, patch
|
|
|
|
from ha_silabs_firmware_client import FirmwareManifest, FirmwareMetadata
|
|
import pytest
|
|
from yarl import URL
|
|
|
|
from homeassistant.components.homeassistant_yellow.const import RADIO_DEVICE
|
|
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
|
|
from homeassistant.const import (
|
|
ATTR_ENTITY_ID,
|
|
SERVICE_TURN_OFF,
|
|
SERVICE_TURN_ON,
|
|
STATE_OFF,
|
|
STATE_ON,
|
|
)
|
|
from homeassistant.core import HomeAssistant, State
|
|
from homeassistant.setup import async_setup_component
|
|
from homeassistant.util import dt as dt_util
|
|
|
|
from tests.common import MockConfigEntry, mock_restore_cache
|
|
|
|
SWITCH_ENTITY_ID = "switch.home_assistant_yellow_radio_beta_firmware_updates"
|
|
|
|
TEST_MANIFEST = FirmwareManifest(
|
|
url=URL("https://example.org/firmware"),
|
|
html_url=URL("https://example.org/release_notes"),
|
|
created_at=dt_util.utcnow(),
|
|
firmwares=(
|
|
FirmwareMetadata(
|
|
filename="skyconnect_zigbee_ncp_test.gbl",
|
|
checksum="aaa",
|
|
size=123,
|
|
release_notes="Some release notes go here",
|
|
metadata={
|
|
"baudrate": 115200,
|
|
"ezsp_version": "7.4.4.0",
|
|
"fw_type": "zigbee_ncp",
|
|
"fw_variant": None,
|
|
"metadata_version": 2,
|
|
"sdk_version": "4.4.4",
|
|
},
|
|
url=URL("https://example.org/firmwares/skyconnect_zigbee_ncp_test.gbl"),
|
|
),
|
|
),
|
|
)
|
|
|
|
|
|
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
|
|
@pytest.mark.parametrize(
|
|
("service", "target_state", "expected_prerelease"),
|
|
[
|
|
(SERVICE_TURN_ON, STATE_ON, True),
|
|
(SERVICE_TURN_OFF, STATE_OFF, False),
|
|
],
|
|
)
|
|
async def test_switch_turn_on_off(
|
|
hass: HomeAssistant,
|
|
service: str,
|
|
target_state: str,
|
|
expected_prerelease: bool,
|
|
) -> None:
|
|
"""Test turning switch on/off updates state and coordinator."""
|
|
await async_setup_component(hass, "homeassistant", {})
|
|
|
|
# Start with opposite state
|
|
mock_restore_cache(
|
|
hass,
|
|
[
|
|
State(
|
|
SWITCH_ENTITY_ID,
|
|
STATE_ON if service == SERVICE_TURN_OFF else STATE_OFF,
|
|
)
|
|
],
|
|
)
|
|
|
|
# Set up the Yellow integration
|
|
yellow_config_entry = MockConfigEntry(
|
|
title="Home Assistant Yellow",
|
|
domain="homeassistant_yellow",
|
|
data={
|
|
"firmware": "ezsp",
|
|
"firmware_version": "7.3.1.0 build 0",
|
|
"device": RADIO_DEVICE,
|
|
},
|
|
version=1,
|
|
minor_version=3,
|
|
)
|
|
yellow_config_entry.add_to_hass(hass)
|
|
|
|
with (
|
|
patch(
|
|
"homeassistant.components.homeassistant_yellow.is_hassio", return_value=True
|
|
),
|
|
patch(
|
|
"homeassistant.components.homeassistant_yellow.get_os_info",
|
|
return_value={"board": "yellow"},
|
|
),
|
|
patch(
|
|
"homeassistant.components.homeassistant_hardware.coordinator.FirmwareUpdateClient"
|
|
) as mock_client,
|
|
patch(
|
|
"homeassistant.components.homeassistant_hardware.coordinator.FirmwareUpdateCoordinator.async_refresh"
|
|
) as mock_refresh,
|
|
):
|
|
mock_client.return_value.async_update_data.return_value = TEST_MANIFEST
|
|
mock_client.return_value.update_prerelease = Mock()
|
|
|
|
assert await hass.config_entries.async_setup(yellow_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
# Reset mocks after setup
|
|
mock_client.return_value.update_prerelease.reset_mock()
|
|
mock_refresh.reset_mock()
|
|
|
|
# Call the service
|
|
await hass.services.async_call(
|
|
SWITCH_DOMAIN,
|
|
service,
|
|
{ATTR_ENTITY_ID: SWITCH_ENTITY_ID},
|
|
blocking=True,
|
|
)
|
|
|
|
# Verify state changed
|
|
state = hass.states.get(SWITCH_ENTITY_ID)
|
|
assert state is not None
|
|
assert state.state == target_state
|
|
|
|
# Verify coordinator methods were called
|
|
assert mock_client.return_value.update_prerelease.mock_calls == [
|
|
call(expected_prerelease)
|
|
]
|
|
assert len(mock_refresh.mock_calls) == 1
|