74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
"""The tests for shared code of the MQTT platform."""
|
|
|
|
from unittest.mock import patch
|
|
|
|
from homeassistant.components import mqtt, sensor
|
|
from homeassistant.const import EVENT_STATE_CHANGED, Platform
|
|
import homeassistant.core as ha
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from tests.common import async_fire_mqtt_message
|
|
|
|
|
|
@patch("homeassistant.components.mqtt.PLATFORMS", [Platform.SENSOR])
|
|
async def test_availability_with_shared_state_topic(
|
|
hass,
|
|
mqtt_mock_entry_with_yaml_config,
|
|
):
|
|
"""Test the state is not changed twice.
|
|
|
|
When an entity with a shared state_topic and availability_topic becomes available
|
|
The state should only change once.
|
|
"""
|
|
assert await async_setup_component(
|
|
hass,
|
|
mqtt.DOMAIN,
|
|
{
|
|
mqtt.DOMAIN: {
|
|
sensor.DOMAIN: {
|
|
"name": "test",
|
|
"state_topic": "test-topic",
|
|
"availability_topic": "test-topic",
|
|
"payload_available": True,
|
|
"payload_not_available": False,
|
|
"value_template": "{{ int(value) or '' }}",
|
|
"availability_template": "{{ value != '0' }}",
|
|
}
|
|
}
|
|
},
|
|
)
|
|
await hass.async_block_till_done()
|
|
await mqtt_mock_entry_with_yaml_config()
|
|
|
|
events = []
|
|
|
|
@ha.callback
|
|
def callback(event):
|
|
events.append(event)
|
|
|
|
hass.bus.async_listen(EVENT_STATE_CHANGED, callback)
|
|
|
|
async_fire_mqtt_message(hass, "test-topic", "100")
|
|
await hass.async_block_till_done()
|
|
# Initially the state and the availability change
|
|
assert len(events) == 1
|
|
|
|
events.clear()
|
|
async_fire_mqtt_message(hass, "test-topic", "50")
|
|
await hass.async_block_till_done()
|
|
assert len(events) == 1
|
|
|
|
events.clear()
|
|
async_fire_mqtt_message(hass, "test-topic", "0")
|
|
await hass.async_block_till_done()
|
|
# Only the availability is changed since the template resukts in an empty payload
|
|
# This does not change the state
|
|
assert len(events) == 1
|
|
|
|
events.clear()
|
|
async_fire_mqtt_message(hass, "test-topic", "10")
|
|
await hass.async_block_till_done()
|
|
# The availability is changed but the topic is shared,
|
|
# hence there the state will be written when the value is updated
|
|
assert len(events) == 1
|