diff --git a/tests/components/modbus/conftest.py b/tests/components/modbus/conftest.py index db960f448ff..86eff5e44ad 100644 --- a/tests/components/modbus/conftest.py +++ b/tests/components/modbus/conftest.py @@ -39,9 +39,15 @@ def mock_pymodbus(): yield mock_pb -@pytest.fixture -async def mock_modbus(hass, do_config): +@pytest.fixture( + params=[ + {"testLoad": True}, + ], +) +async def mock_modbus(hass, caplog, request, do_config): """Load integration modbus using mocked pymodbus.""" + + caplog.set_level(logging.WARNING) config = { DOMAIN: [ { @@ -56,7 +62,10 @@ async def mock_modbus(hass, do_config): with mock.patch( "homeassistant.components.modbus.modbus.ModbusTcpClient", autospec=True ) as mock_pb: - assert await async_setup_component(hass, DOMAIN, config) is True + if request.param["testLoad"]: + assert await async_setup_component(hass, DOMAIN, config) is True + else: + await async_setup_component(hass, DOMAIN, config) await hass.async_block_till_done() yield mock_pb @@ -88,7 +97,6 @@ async def base_test( register_words, expected, method_discovery=False, - check_config_only=False, config_modbus=None, scan_interval=None, expect_init_to_fail=False, @@ -173,8 +181,6 @@ async def base_test( assert device is None elif device is None: pytest.fail("CONFIG failed, see output") - if check_config_only: - return # Trigger update call with time_changed event now = now + timedelta(seconds=scan_interval + 60) @@ -187,37 +193,6 @@ async def base_test( 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): """Run test for service write_coil.""" diff --git a/tests/components/modbus/test_sensor.py b/tests/components/modbus/test_sensor.py index f01a3ef9da5..a5ec79d62e4 100644 --- a/tests/components/modbus/test_sensor.py +++ b/tests/components/modbus/test_sensor.py @@ -1,6 +1,4 @@ """The tests for the Modbus sensor component.""" -import logging - import pytest from homeassistant.components.modbus.const import ( @@ -37,7 +35,7 @@ from homeassistant.const import ( ) 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" 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 +@pytest.mark.parametrize("mock_modbus", [{"testLoad": False}], indirect=True) @pytest.mark.parametrize( "do_config,error_message", [ ( { - CONF_ADDRESS: 1234, - CONF_COUNT: 8, - CONF_PRECISION: 2, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_STRUCTURE: ">no struct", + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_COUNT: 8, + CONF_PRECISION: 2, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_STRUCTURE: ">no struct", + }, + ] }, "bad char in struct format", ), ( { - CONF_ADDRESS: 1234, - CONF_COUNT: 2, - CONF_PRECISION: 2, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_STRUCTURE: ">4f", + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_COUNT: 2, + CONF_PRECISION: 2, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_STRUCTURE: ">4f", + }, + ] }, "Structure request 16 bytes, but 2 registers have a size of 4 bytes", ), ( { - CONF_ADDRESS: 1234, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_COUNT: 4, - CONF_SWAP: CONF_SWAP_NONE, - CONF_STRUCTURE: "invalid", + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_COUNT: 4, + CONF_SWAP: CONF_SWAP_NONE, + CONF_STRUCTURE: "invalid", + }, + ] }, "bad char in struct format", ), ( { - CONF_ADDRESS: 1234, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_COUNT: 4, - CONF_SWAP: CONF_SWAP_NONE, - CONF_STRUCTURE: "", + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_COUNT: 4, + CONF_SWAP: CONF_SWAP_NONE, + CONF_STRUCTURE: "", + }, + ] }, "Error in sensor test_sensor. The `structure` field can not be empty", ), ( { - CONF_ADDRESS: 1234, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_COUNT: 4, - CONF_SWAP: CONF_SWAP_NONE, - CONF_STRUCTURE: "1s", + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_COUNT: 4, + CONF_SWAP: CONF_SWAP_NONE, + CONF_STRUCTURE: "1s", + }, + ] }, "Structure request 1 bytes, but 4 registers have a size of 8 bytes", ), ( { - CONF_ADDRESS: 1234, - CONF_DATA_TYPE: DATA_TYPE_CUSTOM, - CONF_COUNT: 1, - CONF_STRUCTURE: "2s", - CONF_SWAP: CONF_SWAP_WORD, + CONF_SENSORS: [ + { + CONF_NAME: SENSOR_NAME, + CONF_ADDRESS: 1234, + CONF_DATA_TYPE: DATA_TYPE_CUSTOM, + CONF_COUNT: 1, + CONF_STRUCTURE: "2s", + CONF_SWAP: CONF_SWAP_WORD, + }, + ] }, "Error in sensor test_sensor swap(word) not possible due to the registers count: 1, needed: 2", ), ], ) -async def test_config_wrong_struct_sensor( - hass, caplog, do_config, error_message, mock_pymodbus -): +async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, caplog): """Run test for sensor with wrong struct.""" - - config_sensor = { - 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) + messages = str([x.message for x in caplog.get_records("setup")]) + assert error_message in messages @pytest.mark.parametrize(