164 lines
4.9 KiB
Python
164 lines
4.9 KiB
Python
"""Tests for the La Marzocco Update Entities."""
|
|
|
|
from collections.abc import Generator
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
from pylamarzocco.const import (
|
|
FirmwareType,
|
|
UpdateCommandStatus,
|
|
UpdateProgressInfo,
|
|
UpdateStatus,
|
|
)
|
|
from pylamarzocco.exceptions import RequestNotSuccessful
|
|
from pylamarzocco.models import UpdateDetails
|
|
import pytest
|
|
from syrupy import SnapshotAssertion
|
|
|
|
from homeassistant.components.update import DOMAIN as UPDATE_DOMAIN, SERVICE_INSTALL
|
|
from homeassistant.const import ATTR_ENTITY_ID, Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.exceptions import HomeAssistantError
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from . import async_init_integration
|
|
|
|
from tests.common import MockConfigEntry, snapshot_platform
|
|
from tests.typing import WebSocketGenerator
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def mock_sleep() -> Generator[AsyncMock]:
|
|
"""Mock asyncio.sleep."""
|
|
with patch(
|
|
"homeassistant.components.lamarzocco.update.asyncio.sleep",
|
|
return_value=AsyncMock(),
|
|
) as mock_sleep:
|
|
yield mock_sleep
|
|
|
|
|
|
async def test_update(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
entity_registry: er.EntityRegistry,
|
|
snapshot: SnapshotAssertion,
|
|
) -> None:
|
|
"""Test the La Marzocco updates."""
|
|
with patch("homeassistant.components.lamarzocco.PLATFORMS", [Platform.UPDATE]):
|
|
await async_init_integration(hass, mock_config_entry)
|
|
await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id)
|
|
|
|
|
|
async def test_update_process(
|
|
hass: HomeAssistant,
|
|
mock_lamarzocco: MagicMock,
|
|
mock_config_entry: MockConfigEntry,
|
|
hass_ws_client: WebSocketGenerator,
|
|
) -> None:
|
|
"""Test the La Marzocco update entities."""
|
|
|
|
serial_number = mock_lamarzocco.serial_number
|
|
|
|
mock_lamarzocco.get_firmware.side_effect = [
|
|
UpdateDetails(
|
|
status=UpdateStatus.TO_UPDATE,
|
|
command_status=UpdateCommandStatus.IN_PROGRESS,
|
|
progress_info=UpdateProgressInfo.STARTING_PROCESS,
|
|
progress_percentage=0,
|
|
),
|
|
UpdateDetails(
|
|
status=UpdateStatus.UPDATED,
|
|
command_status=None,
|
|
progress_info=None,
|
|
progress_percentage=None,
|
|
),
|
|
]
|
|
|
|
await async_init_integration(hass, mock_config_entry)
|
|
|
|
client = await hass_ws_client(hass)
|
|
await hass.async_block_till_done()
|
|
|
|
await client.send_json(
|
|
{
|
|
"id": 1,
|
|
"type": "update/release_notes",
|
|
"entity_id": f"update.{serial_number}_gateway_firmware",
|
|
}
|
|
)
|
|
result = await client.receive_json()
|
|
assert (
|
|
mock_lamarzocco.settings.firmwares[
|
|
FirmwareType.GATEWAY
|
|
].available_update.change_log
|
|
in result["result"]
|
|
)
|
|
|
|
await hass.services.async_call(
|
|
UPDATE_DOMAIN,
|
|
SERVICE_INSTALL,
|
|
{
|
|
ATTR_ENTITY_ID: f"update.{serial_number}_gateway_firmware",
|
|
},
|
|
blocking=True,
|
|
)
|
|
|
|
mock_lamarzocco.update_firmware.assert_called_once_with()
|
|
|
|
|
|
async def test_update_error(
|
|
hass: HomeAssistant,
|
|
mock_lamarzocco: MagicMock,
|
|
mock_config_entry: MockConfigEntry,
|
|
) -> None:
|
|
"""Test error during update."""
|
|
|
|
await async_init_integration(hass, mock_config_entry)
|
|
|
|
state = hass.states.get(f"update.{mock_lamarzocco.serial_number}_gateway_firmware")
|
|
assert state
|
|
|
|
mock_lamarzocco.update_firmware.side_effect = RequestNotSuccessful("Boom")
|
|
|
|
with pytest.raises(HomeAssistantError) as exc_info:
|
|
await hass.services.async_call(
|
|
UPDATE_DOMAIN,
|
|
SERVICE_INSTALL,
|
|
{
|
|
ATTR_ENTITY_ID: f"update.{mock_lamarzocco.serial_number}_gateway_firmware",
|
|
},
|
|
blocking=True,
|
|
)
|
|
assert exc_info.value.translation_key == "update_failed"
|
|
|
|
|
|
async def test_update_times_out(
|
|
hass: HomeAssistant,
|
|
mock_lamarzocco: MagicMock,
|
|
mock_config_entry: MockConfigEntry,
|
|
) -> None:
|
|
"""Test error during update."""
|
|
mock_lamarzocco.get_firmware.return_value = UpdateDetails(
|
|
status=UpdateStatus.TO_UPDATE,
|
|
command_status=UpdateCommandStatus.IN_PROGRESS,
|
|
progress_info=UpdateProgressInfo.STARTING_PROCESS,
|
|
progress_percentage=0,
|
|
)
|
|
await async_init_integration(hass, mock_config_entry)
|
|
|
|
state = hass.states.get(f"update.{mock_lamarzocco.serial_number}_gateway_firmware")
|
|
assert state
|
|
|
|
with (
|
|
patch("homeassistant.components.lamarzocco.update.MAX_UPDATE_WAIT", 0),
|
|
pytest.raises(HomeAssistantError) as exc_info,
|
|
):
|
|
await hass.services.async_call(
|
|
UPDATE_DOMAIN,
|
|
SERVICE_INSTALL,
|
|
{
|
|
ATTR_ENTITY_ID: f"update.{mock_lamarzocco.serial_number}_gateway_firmware",
|
|
},
|
|
blocking=True,
|
|
)
|
|
assert exc_info.value.translation_key == "update_failed"
|