Fix issue in mqtt fixture calling disconnect handler (#120246)

This commit is contained in:
Jan Bouwhuis 2024-06-23 17:37:08 +02:00 committed by GitHub
parent 2cc34fd7e7
commit f1fd52bc30
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 53 deletions

View File

@ -1111,9 +1111,7 @@ async def test_subscribe_and_resubscribe(
record_calls: MessageCallbackType, record_calls: MessageCallbackType,
) -> None: ) -> None:
"""Test resubscribing within the debounce time.""" """Test resubscribing within the debounce time."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
unsub = await mqtt.async_subscribe(hass, "test-topic", record_calls) unsub = await mqtt.async_subscribe(hass, "test-topic", record_calls)
# This unsub will be un-done with the following subscribe # This unsub will be un-done with the following subscribe
@ -1452,10 +1450,7 @@ async def test_subscribe_same_topic(
When subscribing to the same topic again, SUBSCRIBE must be sent to the broker again When subscribing to the same topic again, SUBSCRIBE must be sent to the broker again
for it to resend any retained messages. for it to resend any retained messages.
""" """
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
calls_a: list[ReceiveMessage] = [] calls_a: list[ReceiveMessage] = []
calls_b: list[ReceiveMessage] = [] calls_b: list[ReceiveMessage] = []
@ -1506,10 +1501,7 @@ async def test_replaying_payload_same_topic(
Retained messages must only be replayed for new subscriptions, except Retained messages must only be replayed for new subscriptions, except
when the MQTT client is reconnecting. when the MQTT client is reconnecting.
""" """
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
calls_a: list[ReceiveMessage] = [] calls_a: list[ReceiveMessage] = []
calls_b: list[ReceiveMessage] = [] calls_b: list[ReceiveMessage] = []
@ -1613,10 +1605,7 @@ async def test_replaying_payload_after_resubscribing(
Retained messages must only be replayed for new subscriptions, except Retained messages must only be replayed for new subscriptions, except
when the MQTT client is reconnection. when the MQTT client is reconnection.
""" """
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
calls_a: list[ReceiveMessage] = [] calls_a: list[ReceiveMessage] = []
@ -1677,10 +1666,7 @@ async def test_replaying_payload_wildcard_topic(
Retained messages should only be replayed for new subscriptions, except Retained messages should only be replayed for new subscriptions, except
when the MQTT client is reconnection. when the MQTT client is reconnection.
""" """
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
calls_a: list[ReceiveMessage] = [] calls_a: list[ReceiveMessage] = []
calls_b: list[ReceiveMessage] = [] calls_b: list[ReceiveMessage] = []
@ -1759,10 +1745,7 @@ async def test_not_calling_unsubscribe_with_active_subscribers(
record_calls: MessageCallbackType, record_calls: MessageCallbackType,
) -> None: ) -> None:
"""Test not calling unsubscribe() when other subscribers are active.""" """Test not calling unsubscribe() when other subscribers are active."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
unsub = await mqtt.async_subscribe(hass, "test/state", record_calls, 2) unsub = await mqtt.async_subscribe(hass, "test/state", record_calls, 2)
await mqtt.async_subscribe(hass, "test/state", record_calls, 1) await mqtt.async_subscribe(hass, "test/state", record_calls, 1)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -1787,10 +1770,8 @@ async def test_not_calling_subscribe_when_unsubscribed_within_cooldown(
Make sure subscriptions are cleared if unsubscribed before Make sure subscriptions are cleared if unsubscribed before
the subscribe cool down period has ended. the subscribe cool down period has ended.
""" """
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
mqtt_client_mock.subscribe.reset_mock() mqtt_client_mock.subscribe.reset_mock()
# Fake that the client is connected
mqtt_mock().connected = True
unsub = await mqtt.async_subscribe(hass, "test/state", record_calls) unsub = await mqtt.async_subscribe(hass, "test/state", record_calls)
unsub() unsub()
@ -1808,9 +1789,7 @@ async def test_unsubscribe_race(
mqtt_mock_entry: MqttMockHAClientGenerator, mqtt_mock_entry: MqttMockHAClientGenerator,
) -> None: ) -> None:
"""Test not calling unsubscribe() when other subscribers are active.""" """Test not calling unsubscribe() when other subscribers are active."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
await hass.async_block_till_done() await hass.async_block_till_done()
async_fire_time_changed(hass, utcnow() + timedelta(seconds=3)) # cooldown async_fire_time_changed(hass, utcnow() + timedelta(seconds=3)) # cooldown
await hass.async_block_till_done() await hass.async_block_till_done()
@ -1871,9 +1850,7 @@ async def test_restore_subscriptions_on_reconnect(
record_calls: MessageCallbackType, record_calls: MessageCallbackType,
) -> None: ) -> None:
"""Test subscriptions are restored on reconnect.""" """Test subscriptions are restored on reconnect."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
await hass.async_block_till_done() await hass.async_block_till_done()
async_fire_time_changed(hass, utcnow() + timedelta(seconds=3)) # cooldown async_fire_time_changed(hass, utcnow() + timedelta(seconds=3)) # cooldown
await hass.async_block_till_done() await hass.async_block_till_done()
@ -1909,9 +1886,7 @@ async def test_restore_all_active_subscriptions_on_reconnect(
freezer: FrozenDateTimeFactory, freezer: FrozenDateTimeFactory,
) -> None: ) -> None:
"""Test active subscriptions are restored correctly on reconnect.""" """Test active subscriptions are restored correctly on reconnect."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
unsub = await mqtt.async_subscribe(hass, "test/state", record_calls, qos=2) unsub = await mqtt.async_subscribe(hass, "test/state", record_calls, qos=2)
await mqtt.async_subscribe(hass, "test/state", record_calls, qos=1) await mqtt.async_subscribe(hass, "test/state", record_calls, qos=1)
@ -1964,9 +1939,7 @@ async def test_subscribed_at_highest_qos(
freezer: FrozenDateTimeFactory, freezer: FrozenDateTimeFactory,
) -> None: ) -> None:
"""Test the highest qos as assigned when subscribing to the same topic.""" """Test the highest qos as assigned when subscribing to the same topic."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
await mqtt.async_subscribe(hass, "test/state", record_calls, qos=0) await mqtt.async_subscribe(hass, "test/state", record_calls, qos=0)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -2064,12 +2037,9 @@ async def test_canceling_debouncer_on_shutdown(
) -> None: ) -> None:
"""Test canceling the debouncer when HA shuts down.""" """Test canceling the debouncer when HA shuts down."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
mqtt_client_mock.subscribe.reset_mock() mqtt_client_mock.subscribe.reset_mock()
# Fake that the client is connected
mqtt_mock().connected = True
await mqtt.async_subscribe(hass, "test/state1", record_calls) await mqtt.async_subscribe(hass, "test/state1", record_calls)
async_fire_time_changed(hass, utcnow() + timedelta(seconds=0.2)) async_fire_time_changed(hass, utcnow() + timedelta(seconds=0.2))
await hass.async_block_till_done() await hass.async_block_till_done()
@ -2879,9 +2849,7 @@ async def test_mqtt_subscribes_in_single_call(
record_calls: MessageCallbackType, record_calls: MessageCallbackType,
) -> None: ) -> None:
"""Test bundled client subscription to topic.""" """Test bundled client subscription to topic."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
mqtt_client_mock.subscribe.reset_mock() mqtt_client_mock.subscribe.reset_mock()
await mqtt.async_subscribe(hass, "topic/test", record_calls) await mqtt.async_subscribe(hass, "topic/test", record_calls)
@ -2919,9 +2887,7 @@ async def test_mqtt_subscribes_and_unsubscribes_in_chunks(
record_calls: MessageCallbackType, record_calls: MessageCallbackType,
) -> None: ) -> None:
"""Test chunked client subscriptions.""" """Test chunked client subscriptions."""
mqtt_mock = await mqtt_mock_entry() await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
mqtt_client_mock.subscribe.reset_mock() mqtt_client_mock.subscribe.reset_mock()
unsub_tasks: list[CALLBACK_TYPE] = [] unsub_tasks: list[CALLBACK_TYPE] = []
@ -4177,9 +4143,6 @@ async def test_reload_config_entry(
assert await hass.config_entries.async_reload(entry.entry_id) assert await hass.config_entries.async_reload(entry.entry_id)
assert entry.state is ConfigEntryState.LOADED assert entry.state is ConfigEntryState.LOADED
await hass.async_block_till_done() await hass.async_block_till_done()
# Assert the MQTT client was connected gracefully
with caplog.at_level(logging.INFO):
assert "Disconnected from MQTT server mock-broker:1883" in caplog.text
assert (state := hass.states.get("sensor.test_manual1")) is not None assert (state := hass.states.get("sensor.test_manual1")) is not None
assert state.attributes["friendly_name"] == "test_manual1_updated" assert state.attributes["friendly_name"] == "test_manual1_updated"
@ -4609,8 +4572,6 @@ async def test_client_sock_failure_after_connect(
) -> None: ) -> None:
"""Test handling the socket connected and disconnected.""" """Test handling the socket connected and disconnected."""
mqtt_mock = await mqtt_mock_entry() mqtt_mock = await mqtt_mock_entry()
# Fake that the client is connected
mqtt_mock().connected = True
await hass.async_block_till_done() await hass.async_block_till_done()
assert mqtt_mock.connected is True assert mqtt_mock.connected is True

View File

@ -960,6 +960,7 @@ def mqtt_client_mock(hass: HomeAssistant) -> Generator[MqttMockPahoClient]:
mock_client.subscribe.side_effect = _subscribe mock_client.subscribe.side_effect = _subscribe
mock_client.unsubscribe.side_effect = _unsubscribe mock_client.unsubscribe.side_effect = _unsubscribe
mock_client.publish.side_effect = _async_fire_mqtt_message mock_client.publish.side_effect = _async_fire_mqtt_message
mock_client.loop_read.return_value = 0
yield mock_client yield mock_client