Add config flow to radiotherm (#72874)
This commit is contained in:
parent
f7626bd511
commit
cac84e4160
16 changed files with 900 additions and 211 deletions
302
tests/components/radiotherm/test_config_flow.py
Normal file
302
tests/components/radiotherm/test_config_flow.py
Normal file
|
@ -0,0 +1,302 @@
|
|||
"""Test the Radio Thermostat config flow."""
|
||||
import socket
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from radiotherm import CommonThermostat
|
||||
from radiotherm.validate import RadiothermTstatError
|
||||
|
||||
from homeassistant import config_entries, data_entry_flow
|
||||
from homeassistant.components import dhcp
|
||||
from homeassistant.components.radiotherm.const import CONF_HOLD_TEMP, DOMAIN
|
||||
from homeassistant.const import CONF_HOST
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
|
||||
def _mock_radiotherm():
|
||||
tstat = MagicMock(autospec=CommonThermostat)
|
||||
tstat.name = {"raw": "My Name"}
|
||||
tstat.sys = {
|
||||
"raw": {"uuid": "aabbccddeeff", "fw_version": "1.2.3", "api_version": "4.5.6"}
|
||||
}
|
||||
tstat.model = {"raw": "Model"}
|
||||
return tstat
|
||||
|
||||
|
||||
async def test_form(hass):
|
||||
"""Test we get the form."""
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||
)
|
||||
assert result["type"] == "form"
|
||||
assert result["errors"] == {}
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
), patch(
|
||||
"homeassistant.components.radiotherm.async_setup_entry",
|
||||
return_value=True,
|
||||
) as mock_setup_entry:
|
||||
result2 = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"host": "1.2.3.4",
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result2["title"] == "My Name"
|
||||
assert result2["data"] == {
|
||||
"host": "1.2.3.4",
|
||||
}
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
|
||||
|
||||
async def test_form_unknown_error(hass):
|
||||
"""Test we handle unknown error."""
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||
)
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
side_effect=Exception,
|
||||
):
|
||||
result2 = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"host": "1.2.3.4",
|
||||
},
|
||||
)
|
||||
|
||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result2["errors"] == {"base": "unknown"}
|
||||
|
||||
|
||||
async def test_form_cannot_connect(hass):
|
||||
"""Test we handle cannot connect error."""
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||
)
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
side_effect=RadiothermTstatError,
|
||||
):
|
||||
result2 = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"host": "1.2.3.4",
|
||||
},
|
||||
)
|
||||
|
||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result2["errors"] == {CONF_HOST: "cannot_connect"}
|
||||
|
||||
|
||||
async def test_import(hass):
|
||||
"""Test we get can import from yaml."""
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
), patch(
|
||||
"homeassistant.components.radiotherm.async_setup_entry",
|
||||
return_value=True,
|
||||
) as mock_setup_entry:
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_IMPORT},
|
||||
data={CONF_HOST: "1.2.3.4", CONF_HOLD_TEMP: True},
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == "My Name"
|
||||
assert result["data"] == {
|
||||
CONF_HOST: "1.2.3.4",
|
||||
}
|
||||
assert result["options"] == {
|
||||
CONF_HOLD_TEMP: True,
|
||||
}
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
|
||||
|
||||
async def test_import_cannot_connect(hass):
|
||||
"""Test we abort if we cannot connect on import from yaml."""
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
side_effect=socket.timeout,
|
||||
):
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_IMPORT},
|
||||
data={CONF_HOST: "1.2.3.4", CONF_HOLD_TEMP: True},
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "cannot_connect"
|
||||
|
||||
|
||||
async def test_dhcp_can_confirm(hass):
|
||||
"""Test DHCP discovery flow can confirm right away."""
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
):
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_DHCP},
|
||||
data=dhcp.DhcpServiceInfo(
|
||||
hostname="radiotherm",
|
||||
ip="1.2.3.4",
|
||||
macaddress="aa:bb:cc:dd:ee:ff",
|
||||
),
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["step_id"] == "confirm"
|
||||
assert result["description_placeholders"] == {
|
||||
"host": "1.2.3.4",
|
||||
"name": "My Name",
|
||||
"model": "Model",
|
||||
}
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.async_setup_entry",
|
||||
return_value=True,
|
||||
) as mock_setup_entry:
|
||||
result2 = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result2["title"] == "My Name"
|
||||
assert result2["data"] == {
|
||||
"host": "1.2.3.4",
|
||||
}
|
||||
assert len(mock_setup_entry.mock_calls) == 1
|
||||
|
||||
|
||||
async def test_dhcp_fails_to_connect(hass):
|
||||
"""Test DHCP discovery flow that fails to connect."""
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
side_effect=RadiothermTstatError,
|
||||
):
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_DHCP},
|
||||
data=dhcp.DhcpServiceInfo(
|
||||
hostname="radiotherm",
|
||||
ip="1.2.3.4",
|
||||
macaddress="aa:bb:cc:dd:ee:ff",
|
||||
),
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "cannot_connect"
|
||||
|
||||
|
||||
async def test_dhcp_already_exists(hass):
|
||||
"""Test DHCP discovery flow that fails to connect."""
|
||||
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data={CONF_HOST: "1.2.3.4"},
|
||||
unique_id="aa:bb:cc:dd:ee:ff",
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
):
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN,
|
||||
context={"source": config_entries.SOURCE_DHCP},
|
||||
data=dhcp.DhcpServiceInfo(
|
||||
hostname="radiotherm",
|
||||
ip="1.2.3.4",
|
||||
macaddress="aa:bb:cc:dd:ee:ff",
|
||||
),
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
|
||||
async def test_user_unique_id_already_exists(hass):
|
||||
"""Test creating an entry where the unique_id already exists."""
|
||||
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data={CONF_HOST: "1.2.3.4"},
|
||||
unique_id="aa:bb:cc:dd:ee:ff",
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["errors"] == {}
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
), patch(
|
||||
"homeassistant.components.radiotherm.async_setup_entry",
|
||||
return_value=True,
|
||||
):
|
||||
result2 = await hass.config_entries.flow.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"host": "1.2.3.4",
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result2["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result2["reason"] == "already_configured"
|
||||
|
||||
|
||||
async def test_options_flow(hass):
|
||||
"""Test config flow options."""
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data={CONF_HOST: "1.2.3.4"},
|
||||
unique_id="aa:bb:cc:dd:ee:ff",
|
||||
options={CONF_HOLD_TEMP: False},
|
||||
)
|
||||
|
||||
entry.add_to_hass(hass)
|
||||
with patch(
|
||||
"homeassistant.components.radiotherm.data.radiotherm.get_thermostat",
|
||||
return_value=_mock_radiotherm(),
|
||||
):
|
||||
assert await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
result = await hass.config_entries.options.async_init(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
assert await hass.config_entries.async_unload(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["step_id"] == "init"
|
||||
|
||||
result = await hass.config_entries.options.async_configure(
|
||||
result["flow_id"], user_input={CONF_HOLD_TEMP: True}
|
||||
)
|
||||
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert entry.options == {CONF_HOLD_TEMP: True}
|
Loading…
Add table
Add a link
Reference in a new issue