2022-02-12 14:28:54 +00:00
|
|
|
"""The tests for the Scrape sensor platform."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
2022-10-24 12:55:57 +00:00
|
|
|
from datetime import datetime
|
2022-02-12 14:28:54 +00:00
|
|
|
from unittest.mock import patch
|
|
|
|
|
2022-10-24 12:55:57 +00:00
|
|
|
from homeassistant.components.scrape.sensor import SCAN_INTERVAL
|
2022-09-19 13:22:23 +00:00
|
|
|
from homeassistant.components.sensor import (
|
|
|
|
CONF_STATE_CLASS,
|
|
|
|
SensorDeviceClass,
|
|
|
|
SensorStateClass,
|
|
|
|
)
|
2022-02-12 14:28:54 +00:00
|
|
|
from homeassistant.const import (
|
|
|
|
CONF_DEVICE_CLASS,
|
|
|
|
CONF_UNIT_OF_MEASUREMENT,
|
2022-10-24 12:55:57 +00:00
|
|
|
STATE_UNAVAILABLE,
|
2022-02-12 14:28:54 +00:00
|
|
|
STATE_UNKNOWN,
|
|
|
|
TEMP_CELSIUS,
|
|
|
|
)
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
|
2022-07-01 17:10:40 +00:00
|
|
|
from . import MockRestData, return_config
|
2022-02-12 14:28:54 +00:00
|
|
|
|
2022-10-24 12:55:57 +00:00
|
|
|
from tests.common import async_fire_time_changed
|
|
|
|
|
2022-02-12 14:28:54 +00:00
|
|
|
DOMAIN = "scrape"
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor minimal."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {"sensor": return_config(select=".current-version h1", name="HA version")}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.ha_version")
|
|
|
|
assert state.state == "Current Version: 2021.12.10"
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_value_template(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor with value template."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {
|
|
|
|
"sensor": return_config(
|
2022-02-12 14:28:54 +00:00
|
|
|
select=".current-version h1",
|
|
|
|
name="HA version",
|
|
|
|
template="{{ value.split(':')[1] }}",
|
2022-07-01 17:10:40 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.ha_version")
|
|
|
|
assert state.state == "2021.12.10"
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_uom_and_classes(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor for unit of measurement, device class and state class."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {
|
|
|
|
"sensor": return_config(
|
2022-02-12 14:28:54 +00:00
|
|
|
select=".current-temp h3",
|
|
|
|
name="Current Temp",
|
|
|
|
template="{{ value.split(':')[1] }}",
|
|
|
|
uom="°C",
|
|
|
|
device_class="temperature",
|
|
|
|
state_class="measurement",
|
2022-07-01 17:10:40 +00:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_uom_and_classes")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.current_temp")
|
|
|
|
assert state.state == "22.1"
|
|
|
|
assert state.attributes[CONF_UNIT_OF_MEASUREMENT] == TEMP_CELSIUS
|
|
|
|
assert state.attributes[CONF_DEVICE_CLASS] == SensorDeviceClass.TEMPERATURE
|
|
|
|
assert state.attributes[CONF_STATE_CLASS] == SensorStateClass.MEASUREMENT
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_authentication(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor with authentication."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {
|
|
|
|
"sensor": [
|
|
|
|
return_config(
|
|
|
|
select=".return",
|
|
|
|
name="Auth page",
|
|
|
|
username="user@secret.com",
|
|
|
|
password="12345678",
|
|
|
|
authentication="digest",
|
|
|
|
),
|
|
|
|
return_config(
|
|
|
|
select=".return",
|
|
|
|
name="Auth page2",
|
|
|
|
username="user@secret.com",
|
|
|
|
password="12345678",
|
|
|
|
),
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor_authentication")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.auth_page")
|
|
|
|
assert state.state == "secret text"
|
|
|
|
state2 = hass.states.get("sensor.auth_page2")
|
|
|
|
assert state2.state == "secret text"
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_no_data(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor fails on no data."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {"sensor": return_config(select=".current-version h1", name="HA version")}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor_no_data")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.ha_version")
|
|
|
|
assert state is None
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_no_data_refresh(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor no data on refresh."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {"sensor": return_config(select=".current-version h1", name="HA version")}
|
|
|
|
|
2022-02-12 14:28:54 +00:00
|
|
|
mocker = MockRestData("test_scrape_sensor")
|
|
|
|
with patch(
|
2022-07-01 17:10:40 +00:00
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
2022-02-12 14:28:54 +00:00
|
|
|
return_value=mocker,
|
|
|
|
):
|
2022-07-01 17:10:40 +00:00
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
2022-02-12 14:28:54 +00:00
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
|
|
|
state = hass.states.get("sensor.ha_version")
|
|
|
|
assert state
|
|
|
|
assert state.state == "Current Version: 2021.12.10"
|
|
|
|
|
2022-10-24 12:55:57 +00:00
|
|
|
mocker.payload = "test_scrape_sensor_no_data"
|
|
|
|
async_fire_time_changed(hass, datetime.utcnow() + SCAN_INTERVAL)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
2022-10-24 12:55:57 +00:00
|
|
|
state = hass.states.get("sensor.ha_version")
|
2022-02-12 14:28:54 +00:00
|
|
|
assert state is not None
|
2022-10-24 12:55:57 +00:00
|
|
|
assert state.state == STATE_UNAVAILABLE
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_attribute_and_tag(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor with attribute and tag."""
|
2022-07-01 17:10:40 +00:00
|
|
|
config = {
|
|
|
|
"sensor": [
|
|
|
|
return_config(select="div", name="HA class", index=1, attribute="class"),
|
|
|
|
return_config(select="template", name="HA template"),
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor")
|
|
|
|
with patch(
|
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
2022-02-12 14:28:54 +00:00
|
|
|
|
|
|
|
state = hass.states.get("sensor.ha_class")
|
|
|
|
assert state.state == "['links']"
|
|
|
|
state2 = hass.states.get("sensor.ha_template")
|
|
|
|
assert state2.state == "Trying to get"
|
|
|
|
|
|
|
|
|
|
|
|
async def test_scrape_sensor_errors(hass: HomeAssistant) -> None:
|
|
|
|
"""Test Scrape sensor handle errors."""
|
|
|
|
config = {
|
2022-07-01 17:10:40 +00:00
|
|
|
"sensor": [
|
|
|
|
return_config(select="div", name="HA class", index=5, attribute="class"),
|
|
|
|
return_config(select="div", name="HA class2", attribute="classes"),
|
|
|
|
]
|
2022-02-12 14:28:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mocker = MockRestData("test_scrape_sensor")
|
|
|
|
with patch(
|
2022-07-01 17:10:40 +00:00
|
|
|
"homeassistant.components.scrape.sensor.RestData",
|
2022-02-12 14:28:54 +00:00
|
|
|
return_value=mocker,
|
|
|
|
):
|
|
|
|
assert await async_setup_component(hass, "sensor", config)
|
|
|
|
await hass.async_block_till_done()
|
|
|
|
|
2022-07-01 17:10:40 +00:00
|
|
|
state = hass.states.get("sensor.ha_class")
|
|
|
|
assert state.state == STATE_UNKNOWN
|
|
|
|
state2 = hass.states.get("sensor.ha_class2")
|
|
|
|
assert state2.state == STATE_UNKNOWN
|