Fix tests

This commit is contained in:
G Johansson 2025-07-08 17:10:03 +00:00
parent 404801f338
commit 018cf3b8c6
5 changed files with 172 additions and 524 deletions

View File

@ -103,6 +103,7 @@ async def async_setup_entry(
coordinator = entry.runtime_data coordinator = entry.runtime_data
for subentry in entry.subentries.values(): for subentry in entry.subentries.values():
sensor = dict(subentry.data) sensor = dict(subentry.data)
sensor.update(sensor.pop("advanced", {}))
sensor[CONF_UNIQUE_ID] = subentry.subentry_id sensor[CONF_UNIQUE_ID] = subentry.subentry_id
sensor[CONF_NAME] = subentry.title sensor[CONF_NAME] = subentry.title

View File

@ -4,7 +4,8 @@
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]" "already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
}, },
"error": { "error": {
"resource_error": "Could not update rest data. Verify your configuration" "resource_error": "Could not update rest data. Verify your configuration",
"no_data": "Rest data is empty. Verify your configuration"
}, },
"step": { "step": {
"user": { "user": {
@ -89,6 +90,10 @@
} }
}, },
"options": { "options": {
"error": {
"resource_error": "[%key:component::scrape::config::error::resource_error%]",
"no_data": "[%key:component::scrape::config::error::no_data%]"
},
"step": { "step": {
"init": { "init": {
"data": { "data": {

View File

@ -5,7 +5,6 @@ from __future__ import annotations
from collections.abc import Generator from collections.abc import Generator
from typing import Any from typing import Any
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
import uuid
import pytest import pytest
@ -21,10 +20,8 @@ from homeassistant.components.scrape.const import (
from homeassistant.config_entries import SOURCE_USER from homeassistant.config_entries import SOURCE_USER
from homeassistant.const import ( from homeassistant.const import (
CONF_METHOD, CONF_METHOD,
CONF_NAME,
CONF_RESOURCE, CONF_RESOURCE,
CONF_TIMEOUT, CONF_TIMEOUT,
CONF_UNIQUE_ID,
CONF_VERIFY_SSL, CONF_VERIFY_SSL,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -44,9 +41,9 @@ def mock_setup_entry() -> Generator[AsyncMock]:
yield mock_setup_entry yield mock_setup_entry
@pytest.fixture(name="get_config") @pytest.fixture(name="get_resource_config")
async def get_config_to_integration_load() -> dict[str, Any]: async def get_resource_config_to_integration_load() -> dict[str, Any]:
"""Return default minimal configuration. """Return default minimal configuration for resource.
To override the config, tests can be marked with: To override the config, tests can be marked with:
@pytest.mark.parametrize("get_config", [{...}]) @pytest.mark.parametrize("get_config", [{...}])
@ -54,20 +51,33 @@ async def get_config_to_integration_load() -> dict[str, Any]:
return { return {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: DEFAULT_METHOD, CONF_METHOD: DEFAULT_METHOD,
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, "auth": {},
CONF_TIMEOUT: DEFAULT_TIMEOUT, "advanced": {
CONF_ENCODING: DEFAULT_ENCODING, CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
"sensor": [ CONF_TIMEOUT: DEFAULT_TIMEOUT,
{ CONF_ENCODING: DEFAULT_ENCODING,
CONF_NAME: "Current version", },
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
} }
@pytest.fixture(name="get_sensor_config")
async def get_sensor_config_to_integration_load() -> tuple[dict[str, Any], ...]:
"""Return default minimal configuration for sensor.
To override the config, tests can be marked with:
@pytest.mark.parametrize("get_config", [{...}])
"""
return (
{
"data": {"advanced": {}, CONF_INDEX: 0, CONF_SELECT: ".current-version h1"},
"subentry_id": "01JZN07D8D23994A49YKS649S7",
"subentry_type": "entity",
"title": "Current version",
"unique_id": None,
},
)
@pytest.fixture(name="get_data") @pytest.fixture(name="get_data")
async def get_data_to_integration_load() -> MockRestData: async def get_data_to_integration_load() -> MockRestData:
"""Return RestData. """Return RestData.
@ -80,14 +90,19 @@ async def get_data_to_integration_load() -> MockRestData:
@pytest.fixture(name="loaded_entry") @pytest.fixture(name="loaded_entry")
async def load_integration( async def load_integration(
hass: HomeAssistant, get_config: dict[str, Any], get_data: MockRestData hass: HomeAssistant,
get_resource_config: dict[str, Any],
get_sensor_config: tuple[dict[str, Any], ...],
get_data: MockRestData,
) -> MockConfigEntry: ) -> MockConfigEntry:
"""Set up the Scrape integration in Home Assistant.""" """Set up the Scrape integration in Home Assistant."""
config_entry = MockConfigEntry( config_entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
source=SOURCE_USER, source=SOURCE_USER,
options=get_config, options=get_resource_config,
entry_id="1", entry_id="01JZN04ZJ9BQXXGXDS05WS7D6P",
subentries_data=get_sensor_config,
version=2,
) )
config_entry.add_to_hass(hass) config_entry.add_to_hass(hass)
@ -100,13 +115,3 @@ async def load_integration(
await hass.async_block_till_done() await hass.async_block_till_done()
return config_entry return config_entry
@pytest.fixture(autouse=True)
def uuid_fixture() -> str:
"""Automatically path uuid generator."""
with patch(
"homeassistant.components.scrape.config_flow.uuid.uuid1",
return_value=uuid.UUID("3699ef88-69e6-11ed-a1eb-0242ac120002"),
):
yield

View File

@ -3,7 +3,6 @@
from __future__ import annotations from __future__ import annotations
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
import uuid
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.rest.data import DEFAULT_TIMEOUT from homeassistant.components.rest.data import DEFAULT_TIMEOUT
@ -16,19 +15,13 @@ from homeassistant.components.scrape.const import (
DEFAULT_ENCODING, DEFAULT_ENCODING,
DEFAULT_VERIFY_SSL, DEFAULT_VERIFY_SSL,
) )
from homeassistant.components.sensor import CONF_STATE_CLASS
from homeassistant.const import ( from homeassistant.const import (
CONF_DEVICE_CLASS,
CONF_METHOD, CONF_METHOD,
CONF_NAME,
CONF_PASSWORD, CONF_PASSWORD,
CONF_PAYLOAD, CONF_PAYLOAD,
CONF_RESOURCE, CONF_RESOURCE,
CONF_TIMEOUT, CONF_TIMEOUT,
CONF_UNIQUE_ID,
CONF_UNIT_OF_MEASUREMENT,
CONF_USERNAME, CONF_USERNAME,
CONF_VALUE_TEMPLATE,
CONF_VERIFY_SSL, CONF_VERIFY_SSL,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -40,7 +33,7 @@ from . import MockRestData
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
async def test_form( async def test_entry_and_subentry(
hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock
) -> None: ) -> None:
"""Test we get the form.""" """Test we get the form."""
@ -55,47 +48,55 @@ async def test_form(
"homeassistant.components.rest.RestData", "homeassistant.components.rest.RestData",
return_value=get_data, return_value=get_data,
) as mock_data: ) as mock_data:
result2 = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10.0,
},
}, },
) )
await hass.async_block_till_done()
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
{
CONF_NAME: "Current version",
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
},
)
await hass.async_block_till_done()
assert result3["type"] is FlowResultType.CREATE_ENTRY assert result["type"] is FlowResultType.CREATE_ENTRY
assert result3["version"] == 1 assert result["version"] == 2
assert result3["options"] == { assert result["options"] == {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_ENCODING: "UTF-8", CONF_VERIFY_SSL: True,
"sensor": [ CONF_TIMEOUT: 10.0,
{ CONF_ENCODING: "UTF-8",
CONF_NAME: "Current version", },
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
} }
assert len(mock_data.mock_calls) == 1 assert len(mock_data.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
entry_id = result["result"].entry_id
result = await hass.config_entries.subentries.async_init(
(entry_id, "entity"), context={"source": config_entries.SOURCE_USER}
)
assert result["step_id"] == "user"
assert result["type"] is FlowResultType.FORM
result = await hass.config_entries.subentries.async_configure(
result["flow_id"],
{CONF_INDEX: 0, CONF_SELECT: ".current-version h1", "advanced": {}},
)
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_INDEX: 0,
CONF_SELECT: ".current-version h1",
"advanced": {},
}
async def test_form_with_post( async def test_form_with_post(
hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock
@ -112,44 +113,32 @@ async def test_form_with_post(
"homeassistant.components.rest.RestData", "homeassistant.components.rest.RestData",
return_value=get_data, return_value=get_data,
) as mock_data: ) as mock_data:
result2 = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_PAYLOAD: "POST", CONF_PAYLOAD: "POST",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10.0,
},
}, },
) )
await hass.async_block_till_done()
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
{
CONF_NAME: "Current version",
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
},
)
await hass.async_block_till_done()
assert result3["type"] is FlowResultType.CREATE_ENTRY assert result["type"] is FlowResultType.CREATE_ENTRY
assert result3["version"] == 1 assert result["version"] == 2
assert result3["options"] == { assert result["options"] == {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_PAYLOAD: "POST", CONF_PAYLOAD: "POST",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_ENCODING: "UTF-8", CONF_VERIFY_SSL: True,
"sensor": [ CONF_TIMEOUT: 10.0,
{ CONF_ENCODING: "UTF-8",
CONF_NAME: "Current version", },
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
} }
assert len(mock_data.mock_calls) == 1 assert len(mock_data.mock_calls) == 1
@ -172,74 +161,68 @@ async def test_flow_fails(
"homeassistant.components.rest.RestData", "homeassistant.components.rest.RestData",
side_effect=HomeAssistantError, side_effect=HomeAssistantError,
): ):
result2 = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
user_input={ user_input={
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10.0,
},
}, },
) )
assert result2["errors"] == {"base": "resource_error"} assert result["errors"] == {"base": "resource_error"}
with patch( with patch(
"homeassistant.components.rest.RestData", "homeassistant.components.rest.RestData",
return_value=MockRestData("test_scrape_sensor_no_data"), return_value=MockRestData("test_scrape_sensor_no_data"),
): ):
result2 = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
user_input={ user_input={
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10.0,
},
}, },
) )
assert result2["errors"] == {"base": "resource_error"} assert result["errors"] == {"base": "no_data"}
with patch( with patch(
"homeassistant.components.rest.RestData", "homeassistant.components.rest.RestData",
return_value=get_data, return_value=get_data,
): ):
result3 = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10.0,
},
}, },
) )
await hass.async_block_till_done()
result4 = await hass.config_entries.flow.async_configure(
result3["flow_id"],
{
CONF_NAME: "Current version",
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
},
)
await hass.async_block_till_done()
assert result4["type"] is FlowResultType.CREATE_ENTRY assert result["type"] is FlowResultType.CREATE_ENTRY
assert result4["title"] == "https://www.home-assistant.io" assert result["title"] == "https://www.home-assistant.io"
assert result4["options"] == { assert result["options"] == {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {},
CONF_TIMEOUT: 10.0, "advanced": {
CONF_ENCODING: "UTF-8", CONF_VERIFY_SSL: True,
"sensor": [ CONF_TIMEOUT: 10.0,
{ CONF_ENCODING: "UTF-8",
CONF_NAME: "Current version", },
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0.0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
} }
@ -253,16 +236,8 @@ async def test_options_resource_flow(
result = await hass.config_entries.options.async_init(loaded_entry.entry_id) result = await hass.config_entries.options.async_init(loaded_entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "resource"},
)
assert result["type"] is FlowResultType.FORM assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "resource" assert result["step_id"] == "init"
mocker = MockRestData("test_scrape_sensor2") mocker = MockRestData("test_scrape_sensor2")
with patch("homeassistant.components.rest.RestData", return_value=mocker): with patch("homeassistant.components.rest.RestData", return_value=mocker):
@ -271,11 +246,15 @@ async def test_options_resource_flow(
user_input={ user_input={
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: DEFAULT_METHOD, CONF_METHOD: DEFAULT_METHOD,
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, "auth": {
CONF_TIMEOUT: DEFAULT_TIMEOUT, CONF_USERNAME: "secret_username",
CONF_ENCODING: DEFAULT_ENCODING, CONF_PASSWORD: "secret_password",
CONF_USERNAME: "secret_username", },
CONF_PASSWORD: "secret_password", "advanced": {
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
CONF_TIMEOUT: DEFAULT_TIMEOUT,
CONF_ENCODING: DEFAULT_ENCODING,
},
}, },
) )
await hass.async_block_till_done() await hass.async_block_till_done()
@ -284,19 +263,15 @@ async def test_options_resource_flow(
assert result["data"] == { assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET", CONF_METHOD: "GET",
CONF_VERIFY_SSL: True, "auth": {
CONF_TIMEOUT: 10.0, CONF_USERNAME: "secret_username",
CONF_ENCODING: "UTF-8", CONF_PASSWORD: "secret_password",
CONF_USERNAME: "secret_username", },
CONF_PASSWORD: "secret_password", "advanced": {
"sensor": [ CONF_VERIFY_SSL: True,
{ CONF_TIMEOUT: 10.0,
CONF_NAME: "Current version", CONF_ENCODING: "UTF-8",
CONF_SELECT: ".current-version h1", },
CONF_INDEX: 0.0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
} }
await hass.async_block_till_done() await hass.async_block_till_done()
@ -307,351 +282,3 @@ async def test_options_resource_flow(
# Check the state of the entity has changed as expected # Check the state of the entity has changed as expected
state = hass.states.get("sensor.current_version") state = hass.states.get("sensor.current_version")
assert state.state == "Hidden Version: 2021.12.10" assert state.state == "Hidden Version: 2021.12.10"
async def test_options_add_remove_sensor_flow(
hass: HomeAssistant, loaded_entry: MockConfigEntry
) -> None:
"""Test options flow to add and remove a sensor."""
state = hass.states.get("sensor.current_version")
assert state.state == "Current Version: 2021.12.10"
result = await hass.config_entries.options.async_init(loaded_entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "add_sensor"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "add_sensor"
mocker = MockRestData("test_scrape_sensor2")
with (
patch("homeassistant.components.rest.RestData", return_value=mocker),
patch(
"homeassistant.components.scrape.config_flow.uuid.uuid1",
return_value=uuid.UUID("3699ef88-69e6-11ed-a1eb-0242ac120003"),
),
):
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
CONF_NAME: "Template",
CONF_SELECT: "template",
CONF_INDEX: 0.0,
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET",
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10,
CONF_ENCODING: "UTF-8",
"sensor": [
{
CONF_NAME: "Current version",
CONF_SELECT: ".current-version h1",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
},
{
CONF_NAME: "Template",
CONF_SELECT: "template",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120003",
},
],
}
await hass.async_block_till_done()
# Check the entity was updated, with the new entity
assert len(hass.states.async_all()) == 2
# Check the state of the entity has changed as expected
state = hass.states.get("sensor.current_version")
assert state.state == "Hidden Version: 2021.12.10"
state = hass.states.get("sensor.template")
assert state.state == "Trying to get"
# Now remove the original sensor
result = await hass.config_entries.options.async_init(loaded_entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "remove_sensor"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "remove_sensor"
mocker = MockRestData("test_scrape_sensor2")
with patch("homeassistant.components.rest.RestData", return_value=mocker):
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
CONF_INDEX: ["0"],
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET",
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10,
CONF_ENCODING: "UTF-8",
"sensor": [
{
CONF_NAME: "Template",
CONF_SELECT: "template",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120003",
},
],
}
await hass.async_block_till_done()
# Check the original entity was removed, with only the new entity left
assert len(hass.states.async_all()) == 1
# Check the state of the new entity
state = hass.states.get("sensor.template")
assert state.state == "Trying to get"
async def test_options_edit_sensor_flow(
hass: HomeAssistant, loaded_entry: MockConfigEntry
) -> None:
"""Test options flow to edit a sensor."""
state = hass.states.get("sensor.current_version")
assert state.state == "Current Version: 2021.12.10"
result = await hass.config_entries.options.async_init(loaded_entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "select_edit_sensor"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "select_edit_sensor"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"index": "0"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "edit_sensor"
mocker = MockRestData("test_scrape_sensor2")
with patch("homeassistant.components.rest.RestData", return_value=mocker):
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
CONF_SELECT: "template",
CONF_INDEX: 0.0,
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET",
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10,
CONF_ENCODING: "UTF-8",
"sensor": [
{
CONF_NAME: "Current version",
CONF_SELECT: "template",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
},
],
}
await hass.async_block_till_done()
# Check the entity was updated
assert len(hass.states.async_all()) == 1
# Check the state of the entity has changed as expected
state = hass.states.get("sensor.current_version")
assert state.state == "Trying to get"
async def test_sensor_options_add_device_class(
hass: HomeAssistant, mock_setup_entry: AsyncMock
) -> None:
"""Test options flow to edit a sensor."""
entry = MockConfigEntry(
domain=DOMAIN,
options={
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: DEFAULT_METHOD,
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
CONF_TIMEOUT: DEFAULT_TIMEOUT,
CONF_ENCODING: DEFAULT_ENCODING,
"sensor": [
{
CONF_NAME: "Current Temp",
CONF_SELECT: ".current-temp h3",
CONF_INDEX: 0,
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
},
entry_id="1",
)
entry.add_to_hass(hass)
result = await hass.config_entries.options.async_init(entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "select_edit_sensor"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "select_edit_sensor"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"index": "0"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "edit_sensor"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
CONF_SELECT: ".current-temp h3",
CONF_INDEX: 0.0,
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_DEVICE_CLASS: "temperature",
CONF_STATE_CLASS: "measurement",
CONF_UNIT_OF_MEASUREMENT: "°C",
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET",
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10,
CONF_ENCODING: "UTF-8",
"sensor": [
{
CONF_NAME: "Current Temp",
CONF_SELECT: ".current-temp h3",
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_INDEX: 0,
CONF_DEVICE_CLASS: "temperature",
CONF_STATE_CLASS: "measurement",
CONF_UNIT_OF_MEASUREMENT: "°C",
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
},
],
}
async def test_sensor_options_remove_device_class(
hass: HomeAssistant, mock_setup_entry: AsyncMock
) -> None:
"""Test options flow to edit a sensor."""
entry = MockConfigEntry(
domain=DOMAIN,
options={
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: DEFAULT_METHOD,
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
CONF_TIMEOUT: DEFAULT_TIMEOUT,
CONF_ENCODING: DEFAULT_ENCODING,
"sensor": [
{
CONF_NAME: "Current Temp",
CONF_SELECT: ".current-temp h3",
CONF_INDEX: 0,
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_DEVICE_CLASS: "temperature",
CONF_STATE_CLASS: "measurement",
CONF_UNIT_OF_MEASUREMENT: "°C",
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
}
],
},
entry_id="1",
)
entry.add_to_hass(hass)
result = await hass.config_entries.options.async_init(entry.entry_id)
assert result["type"] is FlowResultType.MENU
assert result["step_id"] == "init"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"next_step_id": "select_edit_sensor"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "select_edit_sensor"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
{"index": "0"},
)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "edit_sensor"
result = await hass.config_entries.options.async_configure(
result["flow_id"],
user_input={
CONF_SELECT: ".current-temp h3",
CONF_INDEX: 0.0,
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.CREATE_ENTRY
assert result["data"] == {
CONF_RESOURCE: "https://www.home-assistant.io",
CONF_METHOD: "GET",
CONF_VERIFY_SSL: True,
CONF_TIMEOUT: 10,
CONF_ENCODING: "UTF-8",
"sensor": [
{
CONF_NAME: "Current Temp",
CONF_SELECT: ".current-temp h3",
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_INDEX: 0,
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002",
},
],
}

View File

@ -18,7 +18,6 @@ from homeassistant.components.scrape.const import (
) )
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
CONF_STATE_CLASS, CONF_STATE_CLASS,
DOMAIN as SENSOR_DOMAIN,
SensorDeviceClass, SensorDeviceClass,
SensorStateClass, SensorStateClass,
) )
@ -494,7 +493,7 @@ async def test_setup_config_entry(
entity = entity_registry.async_get("sensor.current_version") entity = entity_registry.async_get("sensor.current_version")
assert entity.unique_id == "3699ef88-69e6-11ed-a1eb-0242ac120002" assert entity.unique_id == "01JZN07D8D23994A49YKS649S7"
async def test_templates_with_yaml(hass: HomeAssistant) -> None: async def test_templates_with_yaml(hass: HomeAssistant) -> None:
@ -578,27 +577,38 @@ async def test_templates_with_yaml(hass: HomeAssistant) -> None:
@pytest.mark.parametrize( @pytest.mark.parametrize(
"get_config", ("get_resource_config", "get_sensor_config"),
[ [
{ (
CONF_RESOURCE: "https://www.home-assistant.io", {
CONF_METHOD: "GET", CONF_RESOURCE: "https://www.home-assistant.io",
CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, CONF_METHOD: "GET",
CONF_TIMEOUT: 10, "auth": {},
CONF_ENCODING: DEFAULT_ENCODING, "advanced": {
SENSOR_DOMAIN: [ CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL,
CONF_TIMEOUT: 10,
CONF_ENCODING: DEFAULT_ENCODING,
},
},
(
{ {
CONF_SELECT: ".current-version h1", "data": {
CONF_NAME: "Current version", CONF_SELECT: ".current-version h1",
CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}", CONF_INDEX: 0,
CONF_INDEX: 0, "advanced": {
CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}",
CONF_AVAILABILITY: '{{ states("sensor.input1")=="on" }}', CONF_AVAILABILITY: '{{ states("sensor.input1")=="on" }}',
CONF_ICON: 'mdi:o{{ "n" if states("sensor.input1")=="on" else "ff" }}', CONF_ICON: 'mdi:o{{ "n" if states("sensor.input1")=="on" else "ff" }}',
CONF_PICTURE: 'o{{ "n" if states("sensor.input1")=="on" else "ff" }}.jpg', CONF_PICTURE: 'o{{ "n" if states("sensor.input1")=="on" else "ff" }}.jpg',
} },
], },
} # "subentry_id": "01JZN07D8D23994A49YKS649S7",
"subentry_type": "entity",
"title": "Current version",
"unique_id": None,
},
),
)
], ],
) )
async def test_availability( async def test_availability(