Convert base_config_test in modbus to existing Pytest.fixture (#53836)

* Convert base_config_test to pytest.fixture.
This commit is contained in:
jan iversen 2021-08-09 12:11:54 +02:00 committed by GitHub
parent d97f93933f
commit e7f0768ae6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 93 deletions

View File

@ -39,9 +39,15 @@ def mock_pymodbus():
yield mock_pb yield mock_pb
@pytest.fixture @pytest.fixture(
async def mock_modbus(hass, do_config): params=[
{"testLoad": True},
],
)
async def mock_modbus(hass, caplog, request, do_config):
"""Load integration modbus using mocked pymodbus.""" """Load integration modbus using mocked pymodbus."""
caplog.set_level(logging.WARNING)
config = { config = {
DOMAIN: [ DOMAIN: [
{ {
@ -56,7 +62,10 @@ async def mock_modbus(hass, do_config):
with mock.patch( with mock.patch(
"homeassistant.components.modbus.modbus.ModbusTcpClient", autospec=True "homeassistant.components.modbus.modbus.ModbusTcpClient", autospec=True
) as mock_pb: ) as mock_pb:
if request.param["testLoad"]:
assert await async_setup_component(hass, DOMAIN, config) is True assert await async_setup_component(hass, DOMAIN, config) is True
else:
await async_setup_component(hass, DOMAIN, config)
await hass.async_block_till_done() await hass.async_block_till_done()
yield mock_pb yield mock_pb
@ -88,7 +97,6 @@ async def base_test(
register_words, register_words,
expected, expected,
method_discovery=False, method_discovery=False,
check_config_only=False,
config_modbus=None, config_modbus=None,
scan_interval=None, scan_interval=None,
expect_init_to_fail=False, expect_init_to_fail=False,
@ -173,8 +181,6 @@ async def base_test(
assert device is None assert device is None
elif device is None: elif device is None:
pytest.fail("CONFIG failed, see output") pytest.fail("CONFIG failed, see output")
if check_config_only:
return
# Trigger update call with time_changed event # Trigger update call with time_changed event
now = now + timedelta(seconds=scan_interval + 60) now = now + timedelta(seconds=scan_interval + 60)
@ -187,37 +193,6 @@ async def base_test(
return hass.states.get(entity_id).state return hass.states.get(entity_id).state
async def base_config_test(
hass,
config_device,
device_name,
entity_domain,
array_name_discovery,
array_name_old_config,
method_discovery=False,
config_modbus=None,
expect_init_to_fail=False,
expect_setup_to_fail=False,
):
"""Check config of device for given config."""
await base_test(
hass,
config_device,
device_name,
entity_domain,
array_name_discovery,
array_name_old_config,
None,
None,
method_discovery=method_discovery,
check_config_only=True,
config_modbus=config_modbus,
expect_init_to_fail=expect_init_to_fail,
expect_setup_to_fail=expect_setup_to_fail,
)
async def prepare_service_update(hass, config): async def prepare_service_update(hass, config):
"""Run test for service write_coil.""" """Run test for service write_coil."""

View File

@ -1,6 +1,4 @@
"""The tests for the Modbus sensor component.""" """The tests for the Modbus sensor component."""
import logging
import pytest import pytest
from homeassistant.components.modbus.const import ( from homeassistant.components.modbus.const import (
@ -37,7 +35,7 @@ from homeassistant.const import (
) )
from homeassistant.core import State from homeassistant.core import State
from .conftest import ReadResult, base_config_test, base_test, prepare_service_update from .conftest import ReadResult, base_test, prepare_service_update
SENSOR_NAME = "test_sensor" SENSOR_NAME = "test_sensor"
ENTITY_ID = f"{SENSOR_DOMAIN}.{SENSOR_NAME}" ENTITY_ID = f"{SENSOR_DOMAIN}.{SENSOR_NAME}"
@ -133,95 +131,106 @@ async def test_config_sensor(hass, mock_modbus):
assert SENSOR_DOMAIN in hass.config.components assert SENSOR_DOMAIN in hass.config.components
@pytest.mark.parametrize("mock_modbus", [{"testLoad": False}], indirect=True)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"do_config,error_message", "do_config,error_message",
[ [
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_COUNT: 8, CONF_COUNT: 8,
CONF_PRECISION: 2, CONF_PRECISION: 2,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_STRUCTURE: ">no struct", CONF_STRUCTURE: ">no struct",
}, },
]
},
"bad char in struct format", "bad char in struct format",
), ),
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_COUNT: 2, CONF_COUNT: 2,
CONF_PRECISION: 2, CONF_PRECISION: 2,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_STRUCTURE: ">4f", CONF_STRUCTURE: ">4f",
}, },
]
},
"Structure request 16 bytes, but 2 registers have a size of 4 bytes", "Structure request 16 bytes, but 2 registers have a size of 4 bytes",
), ),
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_COUNT: 4, CONF_COUNT: 4,
CONF_SWAP: CONF_SWAP_NONE, CONF_SWAP: CONF_SWAP_NONE,
CONF_STRUCTURE: "invalid", CONF_STRUCTURE: "invalid",
}, },
]
},
"bad char in struct format", "bad char in struct format",
), ),
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_COUNT: 4, CONF_COUNT: 4,
CONF_SWAP: CONF_SWAP_NONE, CONF_SWAP: CONF_SWAP_NONE,
CONF_STRUCTURE: "", CONF_STRUCTURE: "",
}, },
]
},
"Error in sensor test_sensor. The `structure` field can not be empty", "Error in sensor test_sensor. The `structure` field can not be empty",
), ),
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_COUNT: 4, CONF_COUNT: 4,
CONF_SWAP: CONF_SWAP_NONE, CONF_SWAP: CONF_SWAP_NONE,
CONF_STRUCTURE: "1s", CONF_STRUCTURE: "1s",
}, },
]
},
"Structure request 1 bytes, but 4 registers have a size of 8 bytes", "Structure request 1 bytes, but 4 registers have a size of 8 bytes",
), ),
( (
{ {
CONF_SENSORS: [
{
CONF_NAME: SENSOR_NAME,
CONF_ADDRESS: 1234, CONF_ADDRESS: 1234,
CONF_DATA_TYPE: DATA_TYPE_CUSTOM, CONF_DATA_TYPE: DATA_TYPE_CUSTOM,
CONF_COUNT: 1, CONF_COUNT: 1,
CONF_STRUCTURE: "2s", CONF_STRUCTURE: "2s",
CONF_SWAP: CONF_SWAP_WORD, CONF_SWAP: CONF_SWAP_WORD,
}, },
]
},
"Error in sensor test_sensor swap(word) not possible due to the registers count: 1, needed: 2", "Error in sensor test_sensor swap(word) not possible due to the registers count: 1, needed: 2",
), ),
], ],
) )
async def test_config_wrong_struct_sensor( async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, caplog):
hass, caplog, do_config, error_message, mock_pymodbus
):
"""Run test for sensor with wrong struct.""" """Run test for sensor with wrong struct."""
messages = str([x.message for x in caplog.get_records("setup")])
config_sensor = { assert error_message in messages
CONF_NAME: SENSOR_NAME,
**do_config,
}
caplog.set_level(logging.WARNING)
caplog.clear()
await base_config_test(
hass,
config_sensor,
SENSOR_NAME,
SENSOR_DOMAIN,
CONF_SENSORS,
None,
method_discovery=True,
expect_setup_to_fail=True,
)
assert caplog.text.count(error_message)
@pytest.mark.parametrize( @pytest.mark.parametrize(