Break out mock of pymodbus return from mock_modbus to new fixture (#55063)
* Remove unused mock_modbus. * Break out mock pymodbus return values. * Review comments.pull/55115/head
parent
7314b1c8e1
commit
f91d214ba4
|
@ -67,6 +67,12 @@ def config_addon():
|
|||
return None
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def do_exception():
|
||||
"""Remove side_effect to pymodbus calls."""
|
||||
return False
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def mock_modbus(
|
||||
hass, caplog, register_words, check_config_loaded, config_addon, do_config
|
||||
|
@ -92,18 +98,6 @@ async def mock_modbus(
|
|||
with mock.patch(
|
||||
"homeassistant.components.modbus.modbus.ModbusTcpClient", return_value=mock_pb
|
||||
):
|
||||
if register_words is None:
|
||||
exc = ModbusException("fail read_coils")
|
||||
mock_pb.read_coils.side_effect = exc
|
||||
mock_pb.read_discrete_inputs.side_effect = exc
|
||||
mock_pb.read_input_registers.side_effect = exc
|
||||
mock_pb.read_holding_registers.side_effect = exc
|
||||
else:
|
||||
read_result = ReadResult(register_words)
|
||||
mock_pb.read_coils.return_value = read_result
|
||||
mock_pb.read_discrete_inputs.return_value = read_result
|
||||
mock_pb.read_input_registers.return_value = read_result
|
||||
mock_pb.read_holding_registers.return_value = read_result
|
||||
now = dt_util.utcnow()
|
||||
with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now):
|
||||
result = await async_setup_component(hass, DOMAIN, config)
|
||||
|
@ -113,7 +107,28 @@ async def mock_modbus(
|
|||
|
||||
|
||||
@pytest.fixture
|
||||
async def mock_do_cycle(hass):
|
||||
async def mock_pymodbus_exception(hass, do_exception, mock_modbus):
|
||||
"""Trigger update call with time_changed event."""
|
||||
if do_exception:
|
||||
exc = ModbusException("fail read_coils")
|
||||
mock_modbus.read_coils.side_effect = exc
|
||||
mock_modbus.read_discrete_inputs.side_effect = exc
|
||||
mock_modbus.read_input_registers.side_effect = exc
|
||||
mock_modbus.read_holding_registers.side_effect = exc
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def mock_pymodbus_return(hass, register_words, mock_modbus):
|
||||
"""Trigger update call with time_changed event."""
|
||||
read_result = ReadResult(register_words)
|
||||
mock_modbus.read_coils.return_value = read_result
|
||||
mock_modbus.read_discrete_inputs.return_value = read_result
|
||||
mock_modbus.read_input_registers.return_value = read_result
|
||||
mock_modbus.read_holding_registers.return_value = read_result
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def mock_do_cycle(hass, mock_pymodbus_exception, mock_pymodbus_return):
|
||||
"""Trigger update call with time_changed event."""
|
||||
now = dt_util.utcnow() + timedelta(seconds=90)
|
||||
with mock.patch("homeassistant.helpers.event.dt_util.utcnow", return_value=now):
|
||||
|
@ -129,7 +144,7 @@ async def mock_test_state(hass, request):
|
|||
|
||||
|
||||
@pytest.fixture
|
||||
async def mock_ha(hass):
|
||||
async def mock_ha(hass, mock_pymodbus_return):
|
||||
"""Load homeassistant to allow service calls."""
|
||||
assert await async_setup_component(hass, "homeassistant", {})
|
||||
await hass.async_block_till_done()
|
||||
|
|
|
@ -80,35 +80,41 @@ async def test_config_binary_sensor(hass, mock_modbus):
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"register_words,expected",
|
||||
"register_words,do_exception,expected",
|
||||
[
|
||||
(
|
||||
[0xFF],
|
||||
False,
|
||||
STATE_ON,
|
||||
),
|
||||
(
|
||||
[0x01],
|
||||
False,
|
||||
STATE_ON,
|
||||
),
|
||||
(
|
||||
[0x00],
|
||||
False,
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
[0x80],
|
||||
False,
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
[0xFE],
|
||||
False,
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_all_binary_sensor(hass, expected, mock_modbus, mock_do_cycle):
|
||||
async def test_all_binary_sensor(hass, expected, mock_do_cycle):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ async def test_config_climate(hass, mock_modbus):
|
|||
),
|
||||
],
|
||||
)
|
||||
async def test_temperature_climate(hass, expected, mock_modbus, mock_do_cycle):
|
||||
async def test_temperature_climate(hass, expected, mock_do_cycle):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ async def test_config_cover(hass, mock_modbus):
|
|||
),
|
||||
],
|
||||
)
|
||||
async def test_coil_cover(hass, expected, mock_modbus, mock_do_cycle):
|
||||
async def test_coil_cover(hass, expected, mock_do_cycle):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
@ -150,7 +150,7 @@ async def test_coil_cover(hass, expected, mock_modbus, mock_do_cycle):
|
|||
),
|
||||
],
|
||||
)
|
||||
async def test_register_cover(hass, expected, mock_modbus, mock_do_cycle):
|
||||
async def test_register_cover(hass, expected, mock_do_cycle):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -157,36 +157,41 @@ async def test_config_fan(hass, mock_modbus):
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"register_words,config_addon,expected",
|
||||
"register_words,do_exception,config_addon,expected",
|
||||
[
|
||||
(
|
||||
[0x00],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
[0x01],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_ON,
|
||||
),
|
||||
(
|
||||
[0xFE],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
None,
|
||||
STATE_OFF,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_all_fan(hass, mock_modbus, mock_do_cycle, expected):
|
||||
async def test_all_fan(hass, mock_do_cycle, expected):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -157,36 +157,41 @@ async def test_config_light(hass, mock_modbus):
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"register_words,config_addon,expected",
|
||||
"register_words,do_exception,config_addon,expected",
|
||||
[
|
||||
(
|
||||
[0x00],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
[0x01],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_ON,
|
||||
),
|
||||
(
|
||||
[0xFE],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
None,
|
||||
STATE_OFF,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_all_light(hass, mock_modbus, mock_do_cycle, expected):
|
||||
async def test_all_light(hass, mock_do_cycle, expected):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -247,7 +247,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"config_addon,register_words,expected",
|
||||
"config_addon,register_words,do_exception,expected",
|
||||
[
|
||||
(
|
||||
{
|
||||
|
@ -258,11 +258,13 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0],
|
||||
False,
|
||||
"0",
|
||||
),
|
||||
(
|
||||
{},
|
||||
[0x8000],
|
||||
False,
|
||||
"-32768",
|
||||
),
|
||||
(
|
||||
|
@ -274,6 +276,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[7],
|
||||
False,
|
||||
"20",
|
||||
),
|
||||
(
|
||||
|
@ -285,6 +288,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[7],
|
||||
False,
|
||||
"34",
|
||||
),
|
||||
(
|
||||
|
@ -296,6 +300,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 4,
|
||||
},
|
||||
[7],
|
||||
False,
|
||||
"34.0000",
|
||||
),
|
||||
(
|
||||
|
@ -307,6 +312,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[1],
|
||||
False,
|
||||
"2",
|
||||
),
|
||||
(
|
||||
|
@ -318,6 +324,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: "1",
|
||||
},
|
||||
[9],
|
||||
False,
|
||||
"18.5",
|
||||
),
|
||||
(
|
||||
|
@ -329,6 +336,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 2,
|
||||
},
|
||||
[1],
|
||||
False,
|
||||
"2.40",
|
||||
),
|
||||
(
|
||||
|
@ -340,6 +348,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 1,
|
||||
},
|
||||
[2],
|
||||
False,
|
||||
"-8.3",
|
||||
),
|
||||
(
|
||||
|
@ -351,6 +360,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x89AB, 0xCDEF],
|
||||
False,
|
||||
"-1985229329",
|
||||
),
|
||||
(
|
||||
|
@ -362,6 +372,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x89AB, 0xCDEF],
|
||||
False,
|
||||
str(0x89ABCDEF),
|
||||
),
|
||||
(
|
||||
|
@ -373,6 +384,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x89AB, 0xCDEF, 0x0123, 0x4567],
|
||||
False,
|
||||
"9920249030613615975",
|
||||
),
|
||||
(
|
||||
|
@ -384,6 +396,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x0123, 0x4567, 0x89AB, 0xCDEF],
|
||||
False,
|
||||
"163971058432973793",
|
||||
),
|
||||
(
|
||||
|
@ -395,6 +408,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x0123, 0x4567, 0x89AB, 0xCDEF],
|
||||
False,
|
||||
"163971058432973792",
|
||||
),
|
||||
(
|
||||
|
@ -407,6 +421,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x89AB, 0xCDEF],
|
||||
False,
|
||||
str(0x89ABCDEF),
|
||||
),
|
||||
(
|
||||
|
@ -419,6 +434,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x89AB, 0xCDEF],
|
||||
False,
|
||||
str(0x89ABCDEF),
|
||||
),
|
||||
(
|
||||
|
@ -431,6 +447,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 5,
|
||||
},
|
||||
[16286, 1617],
|
||||
False,
|
||||
"1.23457",
|
||||
),
|
||||
(
|
||||
|
@ -443,6 +460,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_PRECISION: 0,
|
||||
},
|
||||
[0x3037, 0x2D30, 0x352D, 0x3230, 0x3230, 0x2031, 0x343A, 0x3335],
|
||||
False,
|
||||
"07-05-2020 14:35",
|
||||
),
|
||||
(
|
||||
|
@ -454,7 +472,8 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_OFFSET: 0,
|
||||
CONF_PRECISION: 0,
|
||||
},
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
(
|
||||
|
@ -466,7 +485,8 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_OFFSET: 0,
|
||||
CONF_PRECISION: 0,
|
||||
},
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
(
|
||||
|
@ -476,6 +496,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_SWAP: CONF_SWAP_NONE,
|
||||
},
|
||||
[0x0102],
|
||||
False,
|
||||
str(int(0x0102)),
|
||||
),
|
||||
(
|
||||
|
@ -485,6 +506,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_SWAP: CONF_SWAP_BYTE,
|
||||
},
|
||||
[0x0201],
|
||||
False,
|
||||
str(int(0x0102)),
|
||||
),
|
||||
(
|
||||
|
@ -494,6 +516,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_SWAP: CONF_SWAP_BYTE,
|
||||
},
|
||||
[0x0102, 0x0304],
|
||||
False,
|
||||
str(int(0x02010403)),
|
||||
),
|
||||
(
|
||||
|
@ -503,6 +526,7 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_SWAP: CONF_SWAP_WORD,
|
||||
},
|
||||
[0x0102, 0x0304],
|
||||
False,
|
||||
str(int(0x03040102)),
|
||||
),
|
||||
(
|
||||
|
@ -512,11 +536,12 @@ async def test_config_wrong_struct_sensor(hass, error_message, mock_modbus, capl
|
|||
CONF_SWAP: CONF_SWAP_WORD_BYTE,
|
||||
},
|
||||
[0x0102, 0x0304],
|
||||
False,
|
||||
str(int(0x04030201)),
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_all_sensor(hass, mock_modbus, mock_do_cycle, expected):
|
||||
async def test_all_sensor(hass, mock_do_cycle, expected):
|
||||
"""Run test for sensor."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
@ -570,7 +595,7 @@ async def test_all_sensor(hass, mock_modbus, mock_do_cycle, expected):
|
|||
),
|
||||
],
|
||||
)
|
||||
async def test_struct_sensor(hass, mock_modbus, mock_do_cycle, expected):
|
||||
async def test_struct_sensor(hass, mock_do_cycle, expected):
|
||||
"""Run test for sensor struct."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
|
@ -171,36 +171,41 @@ async def test_config_switch(hass, mock_modbus):
|
|||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"register_words,config_addon,expected",
|
||||
"register_words,do_exception,config_addon,expected",
|
||||
[
|
||||
(
|
||||
[0x00],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
[0x01],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_ON,
|
||||
),
|
||||
(
|
||||
[0xFE],
|
||||
False,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_OFF,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
{CONF_VERIFY: {}},
|
||||
STATE_UNAVAILABLE,
|
||||
),
|
||||
(
|
||||
None,
|
||||
[0x00],
|
||||
True,
|
||||
None,
|
||||
STATE_OFF,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_all_switch(hass, mock_modbus, mock_do_cycle, expected):
|
||||
async def test_all_switch(hass, mock_do_cycle, expected):
|
||||
"""Run test for given config."""
|
||||
assert hass.states.get(ENTITY_ID).state == expected
|
||||
|
||||
|
|
Loading…
Reference in New Issue