core/tests/components/random/test_config_flow.py

203 lines
5.6 KiB
Python
Raw Normal View History

"""Test the Random config flow."""
from typing import Any
from unittest.mock import patch
import pytest
from voluptuous import Invalid
from homeassistant import config_entries
from homeassistant.components.random import async_setup_entry
from homeassistant.components.random.const import DOMAIN
from homeassistant.components.sensor import SensorDeviceClass
from homeassistant.const import UnitOfEnergy, UnitOfPower
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType
from tests.common import MockConfigEntry
@pytest.mark.parametrize(
(
"entity_type",
"extra_input",
"extra_options",
),
[
(
"binary_sensor",
{},
{},
),
(
"sensor",
{
"device_class": SensorDeviceClass.POWER,
"unit_of_measurement": UnitOfPower.WATT,
},
{
"device_class": SensorDeviceClass.POWER,
"unit_of_measurement": UnitOfPower.WATT,
"minimum": 0,
"maximum": 20,
},
),
(
"sensor",
{},
{"minimum": 0, "maximum": 20},
),
],
)
async def test_config_flow(
hass: HomeAssistant,
entity_type: str,
extra_input: dict[str, Any],
extra_options: dict[str, Any],
) -> None:
"""Test the config flow."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
assert result["type"] is FlowResultType.MENU
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{"next_step_id": entity_type},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == entity_type
with patch(
"homeassistant.components.random.async_setup_entry", wraps=async_setup_entry
) as mock_setup_entry:
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"name": "My random entity",
**extra_input,
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["title"] == "My random entity"
assert result["data"] == {}
assert result["options"] == {
"name": "My random entity",
"entity_type": entity_type,
**extra_options,
}
assert len(mock_setup_entry.mock_calls) == 1
@pytest.mark.parametrize(
("device_class", "unit_of_measurement"),
[
(SensorDeviceClass.POWER, UnitOfEnergy.WATT_HOUR),
(SensorDeviceClass.ILLUMINANCE, UnitOfEnergy.WATT_HOUR),
],
)
async def test_wrong_uom(
hass: HomeAssistant, device_class: SensorDeviceClass, unit_of_measurement: str
) -> None:
"""Test entering a wrong unit of measurement."""
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
assert result["type"] is FlowResultType.MENU
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{"next_step_id": "sensor"},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "sensor"
with pytest.raises(Invalid, match="is not a valid unit for device class"):
await hass.config_entries.flow.async_configure(
result["flow_id"],
{
"name": "My random entity",
"device_class": device_class,
"unit_of_measurement": unit_of_measurement,
},
)
@pytest.mark.parametrize(
(
"entity_type",
"extra_options",
"options_options",
),
[
(
"sensor",
{
"device_class": SensorDeviceClass.ENERGY,
"unit_of_measurement": UnitOfEnergy.WATT_HOUR,
"minimum": 0,
"maximum": 20,
},
{
"minimum": 10,
"maximum": 20,
"device_class": SensorDeviceClass.POWER,
"unit_of_measurement": UnitOfPower.WATT,
},
),
],
)
async def test_options(
hass: HomeAssistant,
entity_type: str,
extra_options,
options_options,
) -> None:
"""Test reconfiguring."""
random_config_entry = MockConfigEntry(
data={},
domain=DOMAIN,
options={
"name": "My random",
"entity_type": entity_type,
**extra_options,
},
title="My random",
)
random_config_entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(random_config_entry.entry_id)
await hass.async_block_till_done()
config_entry = hass.config_entries.async_entries(DOMAIN)[0]
result = await hass.config_entries.options.async_init(config_entry.entry_id)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == entity_type
assert "name" not in result["data_schema"].schema
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input=options_options,
)
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
"name": "My random",
"entity_type": entity_type,
**options_options,
}
assert config_entry.data == {}
assert config_entry.options == {
"name": "My random",
"entity_type": entity_type,
**options_options,
}
assert config_entry.title == "My random"