core/tests/components/number/test_init.py

100 lines
2.6 KiB
Python

"""The tests for the Number component."""
from unittest.mock import MagicMock
import pytest
from homeassistant.components.number import (
ATTR_STEP,
ATTR_VALUE,
DOMAIN,
SERVICE_SET_VALUE,
NumberEntity,
)
from homeassistant.const import ATTR_ENTITY_ID, CONF_PLATFORM
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
class MockDefaultNumberEntity(NumberEntity):
"""Mock NumberEntity device to use in tests."""
@property
def value(self):
"""Return the current value."""
return 0.5
class MockNumberEntity(NumberEntity):
"""Mock NumberEntity device to use in tests."""
@property
def max_value(self) -> float:
"""Return the max value."""
return 1.0
@property
def value(self):
"""Return the current value."""
return 0.5
async def test_step(hass: HomeAssistant) -> None:
"""Test the step calculation."""
number = MockDefaultNumberEntity()
assert number.step == 1.0
number_2 = MockNumberEntity()
assert number_2.step == 0.1
async def test_sync_set_value(hass: HomeAssistant) -> None:
"""Test if async set_value calls sync set_value."""
number = MockDefaultNumberEntity()
number.hass = hass
number.set_value = MagicMock()
await number.async_set_value(42)
assert number.set_value.called
assert number.set_value.call_args[0][0] == 42
async def test_custom_integration_and_validation(
hass: HomeAssistant, enable_custom_integrations: None
) -> None:
"""Test we can only set valid values."""
platform = getattr(hass.components, f"test.{DOMAIN}")
platform.init()
assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "test"}})
await hass.async_block_till_done()
state = hass.states.get("number.test")
assert state.state == "50.0"
assert state.attributes.get(ATTR_STEP) == 1.0
await hass.services.async_call(
DOMAIN,
SERVICE_SET_VALUE,
{ATTR_VALUE: 60.0, ATTR_ENTITY_ID: "number.test"},
blocking=True,
)
hass.states.async_set("number.test", 60.0)
await hass.async_block_till_done()
state = hass.states.get("number.test")
assert state.state == "60.0"
# test ValueError trigger
with pytest.raises(ValueError):
await hass.services.async_call(
DOMAIN,
SERVICE_SET_VALUE,
{ATTR_VALUE: 110.0, ATTR_ENTITY_ID: "number.test"},
blocking=True,
)
await hass.async_block_till_done()
state = hass.states.get("number.test")
assert state.state == "60.0"