diff --git a/homeassistant/components/scrape/sensor.py b/homeassistant/components/scrape/sensor.py index eddbf2d5f3e..0c34dd8d84a 100644 --- a/homeassistant/components/scrape/sensor.py +++ b/homeassistant/components/scrape/sensor.py @@ -103,6 +103,7 @@ async def async_setup_entry( coordinator = entry.runtime_data for subentry in entry.subentries.values(): sensor = dict(subentry.data) + sensor.update(sensor.pop("advanced", {})) sensor[CONF_UNIQUE_ID] = subentry.subentry_id sensor[CONF_NAME] = subentry.title diff --git a/homeassistant/components/scrape/strings.json b/homeassistant/components/scrape/strings.json index e2fb2055116..8d514347816 100644 --- a/homeassistant/components/scrape/strings.json +++ b/homeassistant/components/scrape/strings.json @@ -4,7 +4,8 @@ "already_configured": "[%key:common::config_flow::abort::already_configured_account%]" }, "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": { "user": { @@ -89,6 +90,10 @@ } }, "options": { + "error": { + "resource_error": "[%key:component::scrape::config::error::resource_error%]", + "no_data": "[%key:component::scrape::config::error::no_data%]" + }, "step": { "init": { "data": { diff --git a/tests/components/scrape/conftest.py b/tests/components/scrape/conftest.py index 5b84f4fd44a..9274f4f50c1 100644 --- a/tests/components/scrape/conftest.py +++ b/tests/components/scrape/conftest.py @@ -5,7 +5,6 @@ from __future__ import annotations from collections.abc import Generator from typing import Any from unittest.mock import AsyncMock, patch -import uuid import pytest @@ -21,10 +20,8 @@ from homeassistant.components.scrape.const import ( from homeassistant.config_entries import SOURCE_USER from homeassistant.const import ( CONF_METHOD, - CONF_NAME, CONF_RESOURCE, CONF_TIMEOUT, - CONF_UNIQUE_ID, CONF_VERIFY_SSL, ) from homeassistant.core import HomeAssistant @@ -44,9 +41,9 @@ def mock_setup_entry() -> Generator[AsyncMock]: yield mock_setup_entry -@pytest.fixture(name="get_config") -async def get_config_to_integration_load() -> dict[str, Any]: - """Return default minimal configuration. +@pytest.fixture(name="get_resource_config") +async def get_resource_config_to_integration_load() -> dict[str, Any]: + """Return default minimal configuration for resource. To override the config, tests can be marked with: @pytest.mark.parametrize("get_config", [{...}]) @@ -54,20 +51,33 @@ async def get_config_to_integration_load() -> dict[str, Any]: return { 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 version", - CONF_SELECT: ".current-version h1", - CONF_INDEX: 0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - } - ], + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, + CONF_TIMEOUT: DEFAULT_TIMEOUT, + CONF_ENCODING: DEFAULT_ENCODING, + }, } +@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") async def get_data_to_integration_load() -> MockRestData: """Return RestData. @@ -80,14 +90,19 @@ async def get_data_to_integration_load() -> MockRestData: @pytest.fixture(name="loaded_entry") 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: """Set up the Scrape integration in Home Assistant.""" config_entry = MockConfigEntry( domain=DOMAIN, source=SOURCE_USER, - options=get_config, - entry_id="1", + options=get_resource_config, + entry_id="01JZN04ZJ9BQXXGXDS05WS7D6P", + subentries_data=get_sensor_config, + version=2, ) config_entry.add_to_hass(hass) @@ -100,13 +115,3 @@ async def load_integration( await hass.async_block_till_done() 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 diff --git a/tests/components/scrape/test_config_flow.py b/tests/components/scrape/test_config_flow.py index 17a527d2975..be4aeb7ea6f 100644 --- a/tests/components/scrape/test_config_flow.py +++ b/tests/components/scrape/test_config_flow.py @@ -3,7 +3,6 @@ from __future__ import annotations from unittest.mock import AsyncMock, patch -import uuid from homeassistant import config_entries from homeassistant.components.rest.data import DEFAULT_TIMEOUT @@ -16,19 +15,13 @@ from homeassistant.components.scrape.const import ( DEFAULT_ENCODING, DEFAULT_VERIFY_SSL, ) -from homeassistant.components.sensor import CONF_STATE_CLASS from homeassistant.const import ( - CONF_DEVICE_CLASS, CONF_METHOD, - CONF_NAME, CONF_PASSWORD, CONF_PAYLOAD, CONF_RESOURCE, CONF_TIMEOUT, - CONF_UNIQUE_ID, - CONF_UNIT_OF_MEASUREMENT, CONF_USERNAME, - CONF_VALUE_TEMPLATE, CONF_VERIFY_SSL, ) from homeassistant.core import HomeAssistant @@ -40,7 +33,7 @@ from . import MockRestData from tests.common import MockConfigEntry -async def test_form( +async def test_entry_and_subentry( hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock ) -> None: """Test we get the form.""" @@ -55,47 +48,55 @@ async def test_form( "homeassistant.components.rest.RestData", return_value=get_data, ) as mock_data: - result2 = await hass.config_entries.flow.async_configure( + result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, + "auth": {}, + "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 result3["version"] == 1 - assert result3["options"] == { + assert result["type"] is FlowResultType.CREATE_ENTRY + assert result["version"] == 2 + assert result["options"] == { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, - CONF_ENCODING: "UTF-8", - "sensor": [ - { - CONF_NAME: "Current version", - CONF_SELECT: ".current-version h1", - CONF_INDEX: 0.0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - } - ], + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + CONF_ENCODING: "UTF-8", + }, } assert len(mock_data.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( hass: HomeAssistant, get_data: MockRestData, mock_setup_entry: AsyncMock @@ -112,44 +113,32 @@ async def test_form_with_post( "homeassistant.components.rest.RestData", return_value=get_data, ) as mock_data: - result2 = await hass.config_entries.flow.async_configure( + result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", CONF_PAYLOAD: "POST", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, + "auth": {}, + "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 result3["version"] == 1 - assert result3["options"] == { + assert result["type"] is FlowResultType.CREATE_ENTRY + assert result["version"] == 2 + assert result["options"] == { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", CONF_PAYLOAD: "POST", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, - CONF_ENCODING: "UTF-8", - "sensor": [ - { - CONF_NAME: "Current version", - CONF_SELECT: ".current-version h1", - CONF_INDEX: 0.0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - } - ], + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + CONF_ENCODING: "UTF-8", + }, } assert len(mock_data.mock_calls) == 1 @@ -172,74 +161,68 @@ async def test_flow_fails( "homeassistant.components.rest.RestData", side_effect=HomeAssistantError, ): - result2 = await hass.config_entries.flow.async_configure( + result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input={ CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + }, }, ) - assert result2["errors"] == {"base": "resource_error"} + assert result["errors"] == {"base": "resource_error"} with patch( "homeassistant.components.rest.RestData", 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"], user_input={ CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + }, }, ) - assert result2["errors"] == {"base": "resource_error"} + assert result["errors"] == {"base": "no_data"} with patch( "homeassistant.components.rest.RestData", return_value=get_data, ): - result3 = await hass.config_entries.flow.async_configure( + result = await hass.config_entries.flow.async_configure( result["flow_id"], { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, + "auth": {}, + "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 result4["title"] == "https://www.home-assistant.io" - assert result4["options"] == { + assert result["type"] is FlowResultType.CREATE_ENTRY + assert result["title"] == "https://www.home-assistant.io" + assert result["options"] == { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, - CONF_ENCODING: "UTF-8", - "sensor": [ - { - CONF_NAME: "Current version", - CONF_SELECT: ".current-version h1", - CONF_INDEX: 0.0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - } - ], + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + CONF_ENCODING: "UTF-8", + }, } @@ -253,16 +236,8 @@ async def test_options_resource_flow( 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["step_id"] == "resource" + assert result["step_id"] == "init" mocker = MockRestData("test_scrape_sensor2") with patch("homeassistant.components.rest.RestData", return_value=mocker): @@ -271,11 +246,15 @@ async def test_options_resource_flow( user_input={ 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, - CONF_USERNAME: "secret_username", - CONF_PASSWORD: "secret_password", + "auth": { + 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() @@ -284,19 +263,15 @@ async def test_options_resource_flow( assert result["data"] == { CONF_RESOURCE: "https://www.home-assistant.io", CONF_METHOD: "GET", - CONF_VERIFY_SSL: True, - CONF_TIMEOUT: 10.0, - CONF_ENCODING: "UTF-8", - CONF_USERNAME: "secret_username", - CONF_PASSWORD: "secret_password", - "sensor": [ - { - CONF_NAME: "Current version", - CONF_SELECT: ".current-version h1", - CONF_INDEX: 0.0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - } - ], + "auth": { + CONF_USERNAME: "secret_username", + CONF_PASSWORD: "secret_password", + }, + "advanced": { + CONF_VERIFY_SSL: True, + CONF_TIMEOUT: 10.0, + CONF_ENCODING: "UTF-8", + }, } 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 state = hass.states.get("sensor.current_version") 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", - }, - ], - } diff --git a/tests/components/scrape/test_sensor.py b/tests/components/scrape/test_sensor.py index c97e2cd3716..40803beb7e5 100644 --- a/tests/components/scrape/test_sensor.py +++ b/tests/components/scrape/test_sensor.py @@ -18,7 +18,6 @@ from homeassistant.components.scrape.const import ( ) from homeassistant.components.sensor import ( CONF_STATE_CLASS, - DOMAIN as SENSOR_DOMAIN, SensorDeviceClass, SensorStateClass, ) @@ -494,7 +493,7 @@ async def test_setup_config_entry( 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: @@ -578,27 +577,38 @@ async def test_templates_with_yaml(hass: HomeAssistant) -> None: @pytest.mark.parametrize( - "get_config", + ("get_resource_config", "get_sensor_config"), [ - { - CONF_RESOURCE: "https://www.home-assistant.io", - CONF_METHOD: "GET", - CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, - CONF_TIMEOUT: 10, - CONF_ENCODING: DEFAULT_ENCODING, - SENSOR_DOMAIN: [ + ( + { + CONF_RESOURCE: "https://www.home-assistant.io", + CONF_METHOD: "GET", + "auth": {}, + "advanced": { + CONF_VERIFY_SSL: DEFAULT_VERIFY_SSL, + CONF_TIMEOUT: 10, + CONF_ENCODING: DEFAULT_ENCODING, + }, + }, + ( { - CONF_SELECT: ".current-version h1", - CONF_NAME: "Current version", - CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}", - CONF_INDEX: 0, - CONF_UNIQUE_ID: "3699ef88-69e6-11ed-a1eb-0242ac120002", - CONF_AVAILABILITY: '{{ states("sensor.input1")=="on" }}', - CONF_ICON: 'mdi:o{{ "n" if states("sensor.input1")=="on" else "ff" }}', - CONF_PICTURE: 'o{{ "n" if states("sensor.input1")=="on" else "ff" }}.jpg', - } - ], - } + "data": { + CONF_SELECT: ".current-version h1", + CONF_INDEX: 0, + "advanced": { + CONF_VALUE_TEMPLATE: "{{ value.split(':')[1] }}", + CONF_AVAILABILITY: '{{ states("sensor.input1")=="on" }}', + CONF_ICON: 'mdi:o{{ "n" if states("sensor.input1")=="on" else "ff" }}', + 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(