Refactor MQTT tests to use modern platform schema part 2 (#77525)
* Tests light json * Tests light template * Missed test light json * Tests light * Tests lock * Tests number * Tests scene * Tests select * Tests sensor * Tests siren * Tests state vacuuum * Tests switch * Derive DEFAULT_CONFIG_LEGACY from DEFAULT_CONFIG * Suggested comment changes
This commit is contained in:
parent
a4792998a2
commit
13188a5c63
11 changed files with 1782 additions and 1414 deletions
File diff suppressed because it is too large
Load diff
|
@ -2,58 +2,63 @@
|
||||||
|
|
||||||
Configuration with RGB, brightness, color temp, effect, and XY:
|
Configuration with RGB, brightness, color temp, effect, and XY:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_json
|
light:
|
||||||
name: mqtt_json_light_1
|
schema: json
|
||||||
state_topic: "home/rgb1"
|
name: mqtt_json_light_1
|
||||||
command_topic: "home/rgb1/set"
|
state_topic: "home/rgb1"
|
||||||
brightness: true
|
command_topic: "home/rgb1/set"
|
||||||
color_temp: true
|
brightness: true
|
||||||
effect: true
|
color_temp: true
|
||||||
rgb: true
|
effect: true
|
||||||
xy: true
|
rgb: true
|
||||||
|
xy: true
|
||||||
|
|
||||||
Configuration with RGB, brightness, color temp and effect:
|
Configuration with RGB, brightness, color temp and effect:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_json
|
light:
|
||||||
name: mqtt_json_light_1
|
schema: json
|
||||||
state_topic: "home/rgb1"
|
name: mqtt_json_light_1
|
||||||
command_topic: "home/rgb1/set"
|
state_topic: "home/rgb1"
|
||||||
brightness: true
|
command_topic: "home/rgb1/set"
|
||||||
color_temp: true
|
brightness: true
|
||||||
effect: true
|
color_temp: true
|
||||||
rgb: true
|
effect: true
|
||||||
|
rgb: true
|
||||||
|
|
||||||
Configuration with RGB, brightness and color temp:
|
Configuration with RGB, brightness and color temp:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_json
|
light:
|
||||||
name: mqtt_json_light_1
|
schema: json
|
||||||
state_topic: "home/rgb1"
|
name: mqtt_json_light_1
|
||||||
command_topic: "home/rgb1/set"
|
state_topic: "home/rgb1"
|
||||||
brightness: true
|
command_topic: "home/rgb1/set"
|
||||||
rgb: true
|
brightness: true
|
||||||
color_temp: true
|
rgb: true
|
||||||
|
color_temp: true
|
||||||
|
|
||||||
Configuration with RGB, brightness:
|
Configuration with RGB, brightness:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_json
|
light:
|
||||||
name: mqtt_json_light_1
|
schema: json
|
||||||
state_topic: "home/rgb1"
|
name: mqtt_json_light_1
|
||||||
command_topic: "home/rgb1/set"
|
state_topic: "home/rgb1"
|
||||||
brightness: true
|
command_topic: "home/rgb1/set"
|
||||||
rgb: true
|
brightness: true
|
||||||
|
rgb: true
|
||||||
|
|
||||||
Config without RGB:
|
Config without RGB:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_json
|
light:
|
||||||
name: mqtt_json_light_1
|
schema: json
|
||||||
state_topic: "home/rgb1"
|
name: mqtt_json_light_1
|
||||||
command_topic: "home/rgb1/set"
|
state_topic: "home/rgb1"
|
||||||
brightness: true
|
command_topic: "home/rgb1/set"
|
||||||
|
brightness: true
|
||||||
|
|
||||||
Config without RGB and brightness:
|
Config without RGB and brightness:
|
||||||
|
|
||||||
|
@ -79,7 +84,7 @@ from unittest.mock import call, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import light
|
from homeassistant.components import light, mqtt
|
||||||
from homeassistant.components.mqtt.light.schema_basic import (
|
from homeassistant.components.mqtt.light.schema_basic import (
|
||||||
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
@ -128,14 +133,20 @@ from tests.common import async_fire_mqtt_message, mock_restore_cache
|
||||||
from tests.components.light import common
|
from tests.components.light import common
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test-topic",
|
"command_topic": "test-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[light.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def light_platform_only():
|
def light_platform_only():
|
||||||
|
@ -156,22 +167,21 @@ class JsonValidator:
|
||||||
return json.loads(self.jsondata) == json.loads(other)
|
return json.loads(self.jsondata) == json.loads(other)
|
||||||
|
|
||||||
|
|
||||||
async def test_fail_setup_if_no_command_topic(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_fail_setup_if_no_command_topic(hass, caplog):
|
||||||
"""Test if setup fails with no command topic."""
|
"""Test if setup fails with no command topic."""
|
||||||
assert await async_setup_component(
|
assert not await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{light.DOMAIN: {"platform": "mqtt", "schema": "json", "name": "test"}},
|
{mqtt.DOMAIN: {light.DOMAIN: {"schema": "json", "name": "test"}}},
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"Invalid config for [mqtt]: required key not provided @ data['mqtt']['light'][0]['command_topic']. Got None."
|
||||||
|
in caplog.text
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
|
||||||
await mqtt_mock_entry_no_yaml_config()
|
|
||||||
assert hass.states.get("light.test") is None
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("deprecated", ("color_temp", "hs", "rgb", "xy"))
|
@pytest.mark.parametrize("deprecated", ("color_temp", "hs", "rgb", "xy"))
|
||||||
async def test_fail_setup_if_color_mode_deprecated(
|
async def test_fail_setup_if_color_mode_deprecated(hass, caplog, deprecated):
|
||||||
hass, mqtt_mock_entry_no_yaml_config, deprecated
|
|
||||||
):
|
|
||||||
"""Test if setup fails if color mode is combined with deprecated config keys."""
|
"""Test if setup fails if color mode is combined with deprecated config keys."""
|
||||||
supported_color_modes = ["color_temp", "hs", "rgb", "rgbw", "rgbww", "xy"]
|
supported_color_modes = ["color_temp", "hs", "rgb", "rgbw", "rgbww", "xy"]
|
||||||
|
|
||||||
|
@ -181,27 +191,32 @@ async def test_fail_setup_if_color_mode_deprecated(
|
||||||
"color_mode": True,
|
"color_mode": True,
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"supported_color_modes": supported_color_modes,
|
"supported_color_modes": supported_color_modes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
config[light.DOMAIN][deprecated] = True
|
config[light.DOMAIN][deprecated] = True
|
||||||
assert await async_setup_component(
|
assert not await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
config,
|
{mqtt.DOMAIN: config},
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
"Invalid config for [mqtt]: color_mode must not be combined with any of"
|
||||||
|
in caplog.text
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
|
||||||
await mqtt_mock_entry_no_yaml_config()
|
|
||||||
assert hass.states.get("light.test") is None
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"supported_color_modes", [["onoff", "rgb"], ["brightness", "rgb"], ["unknown"]]
|
"supported_color_modes,error",
|
||||||
|
[
|
||||||
|
(["onoff", "rgb"], "Unknown error calling mqtt CONFIG_SCHEMA"),
|
||||||
|
(["brightness", "rgb"], "Unknown error calling mqtt CONFIG_SCHEMA"),
|
||||||
|
(["unknown"], "Invalid config for [mqtt]: value must be one of [<ColorMode."),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
async def test_fail_setup_if_color_modes_invalid(
|
async def test_fail_setup_if_color_modes_invalid(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, supported_color_modes
|
hass, caplog, supported_color_modes, error
|
||||||
):
|
):
|
||||||
"""Test if setup fails if supported color modes is invalid."""
|
"""Test if setup fails if supported color modes is invalid."""
|
||||||
config = {
|
config = {
|
||||||
|
@ -210,33 +225,31 @@ async def test_fail_setup_if_color_modes_invalid(
|
||||||
"color_mode": True,
|
"color_mode": True,
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"supported_color_modes": supported_color_modes,
|
"supported_color_modes": supported_color_modes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert await async_setup_component(
|
assert not await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
config,
|
{mqtt.DOMAIN: config},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
assert error in caplog.text
|
||||||
await mqtt_mock_entry_no_yaml_config()
|
|
||||||
assert hass.states.get("light.test") is None
|
|
||||||
|
|
||||||
|
|
||||||
async def test_rgb_light(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_rgb_light(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test RGB light flags brightness support."""
|
"""Test RGB light flags brightness support."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -259,14 +272,15 @@ async def test_no_color_brightness_color_temp_if_no_topics(
|
||||||
"""Test for no RGB, brightness, color temp, effector XY."""
|
"""Test for no RGB, brightness, color temp, effector XY."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_rgb",
|
"state_topic": "test_light_rgb",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -310,21 +324,22 @@ async def test_controlling_state_via_topic(hass, mqtt_mock_entry_with_yaml_confi
|
||||||
"""Test the controlling of the state via topic."""
|
"""Test the controlling of the state via topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_rgb",
|
"state_topic": "test_light_rgb",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"color_temp": True,
|
"color_temp": True,
|
||||||
"effect": True,
|
"effect": True,
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
"xy": True,
|
"xy": True,
|
||||||
"hs": True,
|
"hs": True,
|
||||||
"qos": "0",
|
"qos": "0",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -434,19 +449,20 @@ async def test_controlling_state_via_topic2(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"brightness": True,
|
light.DOMAIN: {
|
||||||
"color_mode": True,
|
"brightness": True,
|
||||||
"command_topic": "test_light_rgb/set",
|
"color_mode": True,
|
||||||
"effect": True,
|
"command_topic": "test_light_rgb/set",
|
||||||
"name": "test",
|
"effect": True,
|
||||||
"platform": "mqtt",
|
"name": "test",
|
||||||
"qos": "0",
|
"qos": "0",
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"state_topic": "test_light_rgb",
|
"state_topic": "test_light_rgb",
|
||||||
"supported_color_modes": supported_color_modes,
|
"supported_color_modes": supported_color_modes,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -618,20 +634,21 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"color_temp": True,
|
"color_temp": True,
|
||||||
"effect": True,
|
"effect": True,
|
||||||
"hs": True,
|
"hs": True,
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
"xy": True,
|
"xy": True,
|
||||||
"qos": 2,
|
"qos": 2,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -755,18 +772,19 @@ async def test_sending_mqtt_commands_and_optimistic2(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"brightness": True,
|
light.DOMAIN: {
|
||||||
"color_mode": True,
|
"brightness": True,
|
||||||
"command_topic": "test_light_rgb/set",
|
"color_mode": True,
|
||||||
"effect": True,
|
"command_topic": "test_light_rgb/set",
|
||||||
"name": "test",
|
"effect": True,
|
||||||
"platform": "mqtt",
|
"name": "test",
|
||||||
"qos": 2,
|
"qos": 2,
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"supported_color_modes": supported_color_modes,
|
"supported_color_modes": supported_color_modes,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -975,15 +993,16 @@ async def test_sending_hs_color(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test light.turn_on with hs color sends hs color parameters."""
|
"""Test light.turn_on with hs color sends hs color parameters."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"hs": True,
|
"hs": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1035,14 +1054,15 @@ async def test_sending_rgb_color_no_brightness(hass, mqtt_mock_entry_with_yaml_c
|
||||||
"""Test light.turn_on with hs color sends rgb color parameters."""
|
"""Test light.turn_on with hs color sends rgb color parameters."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1090,15 +1110,16 @@ async def test_sending_rgb_color_no_brightness2(hass, mqtt_mock_entry_with_yaml_
|
||||||
supported_color_modes = ["rgb", "rgbw", "rgbww"]
|
supported_color_modes = ["rgb", "rgbw", "rgbww"]
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"color_mode": True,
|
light.DOMAIN: {
|
||||||
"command_topic": "test_light_rgb/set",
|
"color_mode": True,
|
||||||
"name": "test",
|
"command_topic": "test_light_rgb/set",
|
||||||
"platform": "mqtt",
|
"name": "test",
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"supported_color_modes": supported_color_modes,
|
"supported_color_modes": supported_color_modes,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1169,15 +1190,16 @@ async def test_sending_rgb_color_with_brightness(
|
||||||
"""Test light.turn_on with hs color sends rgb color parameters."""
|
"""Test light.turn_on with hs color sends rgb color parameters."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1236,16 +1258,17 @@ async def test_sending_rgb_color_with_scaled_brightness(
|
||||||
"""Test light.turn_on with hs color sends rgb color parameters."""
|
"""Test light.turn_on with hs color sends rgb color parameters."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"brightness_scale": 100,
|
"brightness_scale": 100,
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1302,18 +1325,19 @@ async def test_sending_scaled_white(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test light.turn_on with scaled white."""
|
"""Test light.turn_on with scaled white."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"brightness_scale": 100,
|
"brightness_scale": 100,
|
||||||
"color_mode": True,
|
"color_mode": True,
|
||||||
"supported_color_modes": ["hs", "white"],
|
"supported_color_modes": ["hs", "white"],
|
||||||
"white_scale": 50,
|
"white_scale": 50,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1346,15 +1370,16 @@ async def test_sending_xy_color(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test light.turn_on with hs color sends xy color parameters."""
|
"""Test light.turn_on with hs color sends xy color parameters."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"xy": True,
|
"xy": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1405,15 +1430,16 @@ async def test_effect(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for effect being sent when included."""
|
"""Test for effect being sent when included."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"effect": True,
|
"effect": True,
|
||||||
"qos": 0,
|
"qos": 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1468,16 +1494,17 @@ async def test_flash_short_and_long(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for flash length being sent when included."""
|
"""Test for flash length being sent when included."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"flash_time_short": 5,
|
"flash_time_short": 5,
|
||||||
"flash_time_long": 15,
|
"flash_time_long": 15,
|
||||||
"qos": 0,
|
"qos": 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1530,14 +1557,15 @@ async def test_transition(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for transition time being sent when included."""
|
"""Test for transition time being sent when included."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"qos": 0,
|
"qos": 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1577,16 +1605,17 @@ async def test_brightness_scale(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for brightness scaling."""
|
"""Test for brightness scaling."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_bright_scale",
|
"state_topic": "test_light_bright_scale",
|
||||||
"command_topic": "test_light_bright_scale/set",
|
"command_topic": "test_light_bright_scale/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"brightness_scale": 99,
|
"brightness_scale": 99,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1619,19 +1648,20 @@ async def test_white_scale(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for white scaling."""
|
"""Test for white scaling."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_bright_scale",
|
"state_topic": "test_light_bright_scale",
|
||||||
"command_topic": "test_light_bright_scale/set",
|
"command_topic": "test_light_bright_scale/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"brightness_scale": 99,
|
"brightness_scale": 99,
|
||||||
"color_mode": True,
|
"color_mode": True,
|
||||||
"supported_color_modes": ["hs", "white"],
|
"supported_color_modes": ["hs", "white"],
|
||||||
"white_scale": 50,
|
"white_scale": 50,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1675,18 +1705,19 @@ async def test_invalid_values(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test that invalid color/brightness/etc. values are ignored."""
|
"""Test that invalid color/brightness/etc. values are ignored."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_rgb",
|
"state_topic": "test_light_rgb",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"brightness": True,
|
"brightness": True,
|
||||||
"color_temp": True,
|
"color_temp": True,
|
||||||
"rgb": True,
|
"rgb": True,
|
||||||
"qos": "0",
|
"qos": "0",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1799,28 +1830,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1829,7 +1860,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1841,7 +1872,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1849,7 +1880,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1858,7 +1889,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, light.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
light.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1867,7 +1902,11 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, light.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
light.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1878,7 +1917,7 @@ async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplo
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1994,7 +2033,7 @@ async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2004,7 +2043,7 @@ async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2014,7 +2053,7 @@ async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2024,7 +2063,7 @@ async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2034,7 +2073,7 @@ async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_co
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2044,7 +2083,7 @@ async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_c
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2054,7 +2093,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
light.SERVICE_TURN_ON,
|
light.SERVICE_TURN_ON,
|
||||||
command_payload='{"state":"ON"}',
|
command_payload='{"state":"ON"}',
|
||||||
state_payload='{"state":"ON"}',
|
state_payload='{"state":"ON"}',
|
||||||
|
@ -2065,7 +2104,6 @@ async def test_max_mireds(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test setting min_mireds and max_mireds."""
|
"""Test setting min_mireds and max_mireds."""
|
||||||
config = {
|
config = {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "json",
|
"schema": "json",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_max_mireds/set",
|
"command_topic": "test_max_mireds/set",
|
||||||
|
@ -2074,7 +2112,7 @@ async def test_max_mireds(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert await async_setup_component(hass, light.DOMAIN, config)
|
assert await async_setup_component(hass, mqtt.DOMAIN, {mqtt.DOMAIN: config})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -2120,7 +2158,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
if topic == "effect_command_topic":
|
if topic == "effect_command_topic":
|
||||||
config["effect_list"] = ["random", "color_loop"]
|
config["effect_list"] = ["random", "color_loop"]
|
||||||
|
|
||||||
|
@ -2143,7 +2181,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -2152,7 +2190,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2179,7 +2217,7 @@ async def test_encoding_subscribable_topics(
|
||||||
init_payload,
|
init_payload,
|
||||||
):
|
):
|
||||||
"""Test handling of incoming encoded payload."""
|
"""Test handling of incoming encoded payload."""
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[light.DOMAIN])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[light.DOMAIN])
|
||||||
config["color_mode"] = True
|
config["color_mode"] = True
|
||||||
config["supported_color_modes"] = [
|
config["supported_color_modes"] = [
|
||||||
"color_temp",
|
"color_temp",
|
||||||
|
@ -2207,8 +2245,21 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = light.DOMAIN
|
platform = light.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
assert hass.states.get(f"{platform}.test") is not None
|
assert hass.states.get(f"{platform}.test") is not None
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = light.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -2,20 +2,21 @@
|
||||||
|
|
||||||
Configuration example with all features:
|
Configuration example with all features:
|
||||||
|
|
||||||
light:
|
mqtt:
|
||||||
platform: mqtt_template
|
light:
|
||||||
name: mqtt_template_light_1
|
schema: template
|
||||||
state_topic: 'home/rgb1'
|
name: mqtt_template_light_1
|
||||||
command_topic: 'home/rgb1/set'
|
state_topic: 'home/rgb1'
|
||||||
command_on_template: >
|
command_topic: 'home/rgb1/set'
|
||||||
on,{{ brightness|d }},{{ red|d }}-{{ green|d }}-{{ blue|d }}
|
command_on_template: >
|
||||||
command_off_template: 'off'
|
on,{{ brightness|d }},{{ red|d }}-{{ green|d }}-{{ blue|d }}
|
||||||
state_template: '{{ value.split(",")[0] }}'
|
command_off_template: 'off'
|
||||||
brightness_template: '{{ value.split(",")[1] }}'
|
state_template: '{{ value.split(",")[0] }}'
|
||||||
color_temp_template: '{{ value.split(",")[2] }}'
|
brightness_template: '{{ value.split(",")[1] }}'
|
||||||
red_template: '{{ value.split(",")[4].split("-")[0] }}'
|
color_temp_template: '{{ value.split(",")[2] }}'
|
||||||
green_template: '{{ value.split(",")[4].split("-")[1] }}'
|
red_template: '{{ value.split(",")[4].split("-")[0] }}'
|
||||||
blue_template: '{{ value.split(",")[4].split("-")[2] }}'
|
green_template: '{{ value.split(",")[4].split("-")[1] }}'
|
||||||
|
blue_template: '{{ value.split(",")[4].split("-")[2] }}'
|
||||||
|
|
||||||
If your light doesn't support brightness feature, omit `brightness_template`.
|
If your light doesn't support brightness feature, omit `brightness_template`.
|
||||||
|
|
||||||
|
@ -28,7 +29,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import light
|
from homeassistant.components import light, mqtt
|
||||||
from homeassistant.components.mqtt.light.schema_basic import (
|
from homeassistant.components.mqtt.light.schema_basic import (
|
||||||
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
@ -74,24 +75,26 @@ from .test_common import (
|
||||||
help_test_update_with_json_attrs_not_dict,
|
help_test_update_with_json_attrs_not_dict,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.common import (
|
from tests.common import async_fire_mqtt_message, mock_restore_cache
|
||||||
assert_setup_component,
|
|
||||||
async_fire_mqtt_message,
|
|
||||||
mock_restore_cache,
|
|
||||||
)
|
|
||||||
from tests.components.light import common
|
from tests.components.light import common
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test-topic",
|
"command_topic": "test-topic",
|
||||||
"command_on_template": "on,{{ transition }}",
|
"command_on_template": "on,{{ transition }}",
|
||||||
"command_off_template": "off,{{ transition|d }}",
|
"command_off_template": "off,{{ transition|d }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[light.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def light_platform_only():
|
def light_platform_only():
|
||||||
|
@ -103,10 +106,9 @@ def light_platform_only():
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"test_config",
|
"test_config",
|
||||||
[
|
[
|
||||||
({"platform": "mqtt", "schema": "template", "name": "test"},),
|
({"schema": "template", "name": "test"},),
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_topic",
|
"command_topic": "test_topic",
|
||||||
|
@ -114,7 +116,6 @@ def light_platform_only():
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_topic",
|
"command_topic": "test_topic",
|
||||||
|
@ -123,7 +124,6 @@ def light_platform_only():
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_topic",
|
"command_topic": "test_topic",
|
||||||
|
@ -132,36 +132,33 @@ def light_platform_only():
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
async def test_setup_fails(hass, mqtt_mock_entry_no_yaml_config, test_config):
|
async def test_setup_fails(hass, caplog, test_config):
|
||||||
"""Test that setup fails with missing required configuration items."""
|
"""Test that setup fails with missing required configuration items."""
|
||||||
with assert_setup_component(0, light.DOMAIN) as setup_config:
|
assert not await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{mqtt.DOMAIN: {light.DOMAIN: test_config}},
|
||||||
{light.DOMAIN: test_config},
|
)
|
||||||
)
|
assert "Invalid config for [mqtt]" in caplog.text
|
||||||
await hass.async_block_till_done()
|
|
||||||
await mqtt_mock_entry_no_yaml_config()
|
|
||||||
assert not setup_config[light.DOMAIN]
|
|
||||||
assert hass.states.get("light.test") is None
|
|
||||||
|
|
||||||
|
|
||||||
async def test_rgb_light(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_rgb_light(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test RGB light flags brightness support."""
|
"""Test RGB light flags brightness support."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
light.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
light.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
light.DOMAIN: {
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
"command_on_template": "on",
|
"command_on_template": "on",
|
||||||
"command_off_template": "off",
|
"command_off_template": "off",
|
||||||
"red_template": '{{ value.split(",")[4].' 'split("-")[0] }}',
|
"red_template": '{{ value.split(",")[4].' 'split("-")[0] }}',
|
||||||
"green_template": '{{ value.split(",")[4].' 'split("-")[1] }}',
|
"green_template": '{{ value.split(",")[4].' 'split("-")[1] }}',
|
||||||
"blue_template": '{{ value.split(",")[4].' 'split("-")[2] }}',
|
"blue_template": '{{ value.split(",")[4].' 'split("-")[2] }}',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -181,13 +178,12 @@ async def test_rgb_light(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_state_change_via_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_state_change_via_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test state change via topic."""
|
"""Test state change via topic."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test_light_rgb",
|
"state_topic": "test_light_rgb",
|
||||||
|
@ -201,10 +197,11 @@ async def test_state_change_via_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"command_off_template": "off",
|
"command_off_template": "off",
|
||||||
"state_template": '{{ value.split(",")[0] }}',
|
"state_template": '{{ value.split(",")[0] }}',
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -236,13 +233,12 @@ async def test_state_brightness_color_effect_temp_change_via_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config
|
hass, mqtt_mock_entry_with_yaml_config
|
||||||
):
|
):
|
||||||
"""Test state, bri, color, effect, color temp change."""
|
"""Test state, bri, color, effect, color temp change."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"effect_list": ["rainbow", "colorloop"],
|
"effect_list": ["rainbow", "colorloop"],
|
||||||
|
@ -264,10 +260,11 @@ async def test_state_brightness_color_effect_temp_change_via_topic(
|
||||||
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
||||||
"effect_template": '{{ value.split(",")[4] }}',
|
"effect_template": '{{ value.split(",")[4] }}',
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -340,13 +337,12 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
)
|
)
|
||||||
mock_restore_cache(hass, (fake_state,))
|
mock_restore_cache(hass, (fake_state,))
|
||||||
|
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
|
@ -369,10 +365,11 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
"effect_template": '{{ value.split(",")[4] }}',
|
"effect_template": '{{ value.split(",")[4] }}',
|
||||||
"qos": 2,
|
"qos": 2,
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_ON
|
assert state.state == STATE_ON
|
||||||
|
@ -470,13 +467,12 @@ async def test_sending_mqtt_commands_non_optimistic_brightness_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config
|
hass, mqtt_mock_entry_with_yaml_config
|
||||||
):
|
):
|
||||||
"""Test the sending of command in optimistic mode."""
|
"""Test the sending of command in optimistic mode."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"effect_list": ["rainbow", "colorloop"],
|
"effect_list": ["rainbow", "colorloop"],
|
||||||
|
@ -499,10 +495,11 @@ async def test_sending_mqtt_commands_non_optimistic_brightness_template(
|
||||||
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
||||||
"effect_template": '{{ value.split(",")[4] }}',
|
"effect_template": '{{ value.split(",")[4] }}',
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -591,13 +588,12 @@ async def test_sending_mqtt_commands_non_optimistic_brightness_template(
|
||||||
|
|
||||||
async def test_effect(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_effect(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test effect sent over MQTT in optimistic mode."""
|
"""Test effect sent over MQTT in optimistic mode."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"effect_list": ["rainbow", "colorloop"],
|
"effect_list": ["rainbow", "colorloop"],
|
||||||
"name": "test",
|
"name": "test",
|
||||||
|
@ -606,10 +602,11 @@ async def test_effect(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"command_off_template": "off",
|
"command_off_template": "off",
|
||||||
"qos": 0,
|
"qos": 0,
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -644,13 +641,12 @@ async def test_effect(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_flash(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_flash(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test flash sent over MQTT in optimistic mode."""
|
"""Test flash sent over MQTT in optimistic mode."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
|
@ -658,10 +654,11 @@ async def test_flash(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"command_off_template": "off",
|
"command_off_template": "off",
|
||||||
"qos": 0,
|
"qos": 0,
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -693,13 +690,12 @@ async def test_flash(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_transition(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_transition(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test for transition time being sent when included."""
|
"""Test for transition time being sent when included."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_light_rgb/set",
|
"command_topic": "test_light_rgb/set",
|
||||||
|
@ -707,10 +703,11 @@ async def test_transition(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"command_off_template": "off,{{ transition|int|d }}",
|
"command_off_template": "off,{{ transition|int|d }}",
|
||||||
"qos": 1,
|
"qos": 1,
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -735,13 +732,12 @@ async def test_transition(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_invalid_values(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_invalid_values(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test that invalid values are ignored."""
|
"""Test that invalid values are ignored."""
|
||||||
with assert_setup_component(1, light.DOMAIN):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(
|
hass,
|
||||||
hass,
|
mqtt.DOMAIN,
|
||||||
light.DOMAIN,
|
{
|
||||||
{
|
mqtt.DOMAIN: {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"effect_list": ["rainbow", "colorloop"],
|
"effect_list": ["rainbow", "colorloop"],
|
||||||
|
@ -763,10 +759,11 @@ async def test_invalid_values(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
"blue_template": '{{ value.split(",")[3].' 'split("-")[2] }}',
|
||||||
"effect_template": '{{ value.split(",")[4] }}',
|
"effect_template": '{{ value.split(",")[4] }}',
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
},
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
state = hass.states.get("light.test")
|
state = hass.states.get("light.test")
|
||||||
assert state.state == STATE_UNKNOWN
|
assert state.state == STATE_UNKNOWN
|
||||||
|
@ -827,28 +824,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -857,7 +854,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -869,7 +866,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
light.DOMAIN,
|
light.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
MQTT_LIGHT_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -877,7 +874,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -886,7 +883,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, light.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
light.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -895,14 +896,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, light.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
light.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, light.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
light.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1017,42 +1026,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT light device registry integration."""
|
"""Test MQTT light device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT light device registry integration."""
|
"""Test MQTT light device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, light.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1082,7 +1091,6 @@ async def test_max_mireds(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test setting min_mireds and max_mireds."""
|
"""Test setting min_mireds and max_mireds."""
|
||||||
config = {
|
config = {
|
||||||
light.DOMAIN: {
|
light.DOMAIN: {
|
||||||
"platform": "mqtt",
|
|
||||||
"schema": "template",
|
"schema": "template",
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test_max_mireds/set",
|
"command_topic": "test_max_mireds/set",
|
||||||
|
@ -1093,7 +1101,7 @@ async def test_max_mireds(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert await async_setup_component(hass, light.DOMAIN, config)
|
assert await async_setup_component(hass, mqtt.DOMAIN, {mqtt.DOMAIN: config})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -1139,7 +1147,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
if topic == "effect_command_topic":
|
if topic == "effect_command_topic":
|
||||||
config["effect_list"] = ["random", "color_loop"]
|
config["effect_list"] = ["random", "color_loop"]
|
||||||
|
|
||||||
|
@ -1162,7 +1170,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -1171,7 +1179,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1192,7 +1200,7 @@ async def test_encoding_subscribable_topics(
|
||||||
init_payload,
|
init_payload,
|
||||||
):
|
):
|
||||||
"""Test handling of incoming encoded payload."""
|
"""Test handling of incoming encoded payload."""
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[light.DOMAIN])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[light.DOMAIN])
|
||||||
config["state_template"] = "{{ value }}"
|
config["state_template"] = "{{ value }}"
|
||||||
await help_test_encoding_subscribable_topics(
|
await help_test_encoding_subscribable_topics(
|
||||||
hass,
|
hass,
|
||||||
|
@ -1211,7 +1219,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = light.DOMAIN
|
platform = light.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -1221,7 +1229,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = light.DOMAIN
|
domain = light.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = light.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -4,14 +4,14 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components import lock, mqtt
|
||||||
from homeassistant.components.lock import (
|
from homeassistant.components.lock import (
|
||||||
DOMAIN as LOCK_DOMAIN,
|
|
||||||
SERVICE_LOCK,
|
SERVICE_LOCK,
|
||||||
SERVICE_OPEN,
|
SERVICE_OPEN,
|
||||||
SERVICE_UNLOCK,
|
SERVICE_UNLOCK,
|
||||||
STATE_LOCKED,
|
STATE_LOCKED,
|
||||||
STATE_UNLOCKED,
|
STATE_UNLOCKED,
|
||||||
SUPPORT_OPEN,
|
LockEntityFeature,
|
||||||
)
|
)
|
||||||
from homeassistant.components.mqtt.lock import MQTT_LOCK_ATTRIBUTES_BLOCKED
|
from homeassistant.components.mqtt.lock import MQTT_LOCK_ATTRIBUTES_BLOCKED
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
@ -56,9 +56,14 @@ from .test_common import (
|
||||||
from tests.common import async_fire_mqtt_message
|
from tests.common import async_fire_mqtt_message
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
LOCK_DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"}
|
mqtt.DOMAIN: {lock.DOMAIN: {"name": "test", "command_topic": "test-topic"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[lock.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def lock_platform_only():
|
def lock_platform_only():
|
||||||
|
@ -71,17 +76,18 @@ async def test_controlling_state_via_topic(hass, mqtt_mock_entry_with_yaml_confi
|
||||||
"""Test the controlling state via topic."""
|
"""Test the controlling state via topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -110,17 +116,18 @@ async def test_controlling_non_default_state_via_topic(
|
||||||
"""Test the controlling state via topic."""
|
"""Test the controlling state via topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "closed",
|
"state_locked": "closed",
|
||||||
"state_unlocked": "open",
|
"state_unlocked": "open",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -148,18 +155,19 @@ async def test_controlling_state_via_topic_and_json_message(
|
||||||
"""Test the controlling state via topic and JSON message."""
|
"""Test the controlling state via topic and JSON message."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -186,18 +194,19 @@ async def test_controlling_non_default_state_via_topic_and_json_message(
|
||||||
"""Test the controlling state via topic and JSON message."""
|
"""Test the controlling state via topic and JSON message."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "closed",
|
"state_locked": "closed",
|
||||||
"state_unlocked": "open",
|
"state_unlocked": "open",
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -224,16 +233,17 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
"""Test optimistic mode without state topic."""
|
"""Test optimistic mode without state topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -245,7 +255,7 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
||||||
|
@ -255,7 +265,7 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
||||||
|
@ -271,18 +281,19 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(
|
||||||
"""Test optimistic mode without state topic."""
|
"""Test optimistic mode without state topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
"optimistic": True,
|
"optimistic": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -294,7 +305,7 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
||||||
|
@ -304,7 +315,7 @@ async def test_sending_mqtt_commands_and_explicit_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
||||||
|
@ -320,17 +331,18 @@ async def test_sending_mqtt_commands_support_open_and_optimistic(
|
||||||
"""Test open function of the lock without state topic."""
|
"""Test open function of the lock without state topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"payload_open": "OPEN",
|
"payload_open": "OPEN",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -340,10 +352,10 @@ async def test_sending_mqtt_commands_support_open_and_optimistic(
|
||||||
state = hass.states.get("lock.test")
|
state = hass.states.get("lock.test")
|
||||||
assert state.state is STATE_UNLOCKED
|
assert state.state is STATE_UNLOCKED
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == SUPPORT_OPEN
|
assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == LockEntityFeature.OPEN
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
||||||
|
@ -353,7 +365,7 @@ async def test_sending_mqtt_commands_support_open_and_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
||||||
|
@ -363,7 +375,7 @@ async def test_sending_mqtt_commands_support_open_and_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_OPEN, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_OPEN, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False)
|
||||||
|
@ -379,19 +391,20 @@ async def test_sending_mqtt_commands_support_open_and_explicit_optimistic(
|
||||||
"""Test open function of the lock without state topic."""
|
"""Test open function of the lock without state topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
LOCK_DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
LOCK_DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
lock.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_lock": "LOCK",
|
"payload_lock": "LOCK",
|
||||||
"payload_unlock": "UNLOCK",
|
"payload_unlock": "UNLOCK",
|
||||||
"payload_open": "OPEN",
|
"payload_open": "OPEN",
|
||||||
"state_locked": "LOCKED",
|
"state_locked": "LOCKED",
|
||||||
"state_unlocked": "UNLOCKED",
|
"state_unlocked": "UNLOCKED",
|
||||||
"optimistic": True,
|
"optimistic": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -401,10 +414,10 @@ async def test_sending_mqtt_commands_support_open_and_explicit_optimistic(
|
||||||
state = hass.states.get("lock.test")
|
state = hass.states.get("lock.test")
|
||||||
assert state.state is STATE_UNLOCKED
|
assert state.state is STATE_UNLOCKED
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == SUPPORT_OPEN
|
assert state.attributes.get(ATTR_SUPPORTED_FEATURES) == LockEntityFeature.OPEN
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_LOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "LOCK", 0, False)
|
||||||
|
@ -414,7 +427,7 @@ async def test_sending_mqtt_commands_support_open_and_explicit_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_UNLOCK, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "UNLOCK", 0, False)
|
||||||
|
@ -424,7 +437,7 @@ async def test_sending_mqtt_commands_support_open_and_explicit_optimistic(
|
||||||
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
assert state.attributes.get(ATTR_ASSUMED_STATE)
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LOCK_DOMAIN, SERVICE_OPEN, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
lock.DOMAIN, SERVICE_OPEN, {ATTR_ENTITY_ID: "lock.test"}, blocking=True
|
||||||
)
|
)
|
||||||
|
|
||||||
mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False)
|
mqtt_mock.async_publish.assert_called_once_with("command-topic", "OPEN", 0, False)
|
||||||
|
@ -439,28 +452,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -469,7 +482,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -480,8 +493,8 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
LOCK_DOMAIN,
|
lock.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_LOCK_ATTRIBUTES_BLOCKED,
|
MQTT_LOCK_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -489,7 +502,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -498,7 +511,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
lock.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -507,21 +524,25 @@ async def test_update_with_json_attrs_bad_json(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
lock.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, caplog, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_unique_id(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_unique_id(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test unique id option only creates one lock per unique_id."""
|
"""Test unique id option only creates one lock per unique_id."""
|
||||||
config = {
|
config = {
|
||||||
LOCK_DOMAIN: [
|
lock.DOMAIN: [
|
||||||
{
|
{
|
||||||
"platform": "mqtt",
|
"platform": "mqtt",
|
||||||
"name": "Test 1",
|
"name": "Test 1",
|
||||||
|
@ -539,7 +560,7 @@ async def test_unique_id(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
await help_test_unique_id(
|
await help_test_unique_id(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, config
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -547,7 +568,7 @@ async def test_discovery_removal_lock(hass, mqtt_mock_entry_no_yaml_config, capl
|
||||||
"""Test removal of discovered lock."""
|
"""Test removal of discovered lock."""
|
||||||
data = '{ "name": "test",' ' "command_topic": "test_topic" }'
|
data = '{ "name": "test",' ' "command_topic": "test_topic" }'
|
||||||
await help_test_discovery_removal(
|
await help_test_discovery_removal(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, LOCK_DOMAIN, data
|
hass, mqtt_mock_entry_no_yaml_config, caplog, lock.DOMAIN, data
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -566,7 +587,7 @@ async def test_discovery_update_lock(hass, mqtt_mock_entry_no_yaml_config, caplo
|
||||||
"availability_topic": "availability_topic2",
|
"availability_topic": "availability_topic2",
|
||||||
}
|
}
|
||||||
await help_test_discovery_update(
|
await help_test_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, LOCK_DOMAIN, config1, config2
|
hass, mqtt_mock_entry_no_yaml_config, caplog, lock.DOMAIN, config1, config2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -586,7 +607,7 @@ async def test_discovery_update_unchanged_lock(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
LOCK_DOMAIN,
|
lock.DOMAIN,
|
||||||
data1,
|
data1,
|
||||||
discovery_update,
|
discovery_update,
|
||||||
)
|
)
|
||||||
|
@ -598,49 +619,49 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
data1 = '{ "name": "Beer" }'
|
data1 = '{ "name": "Beer" }'
|
||||||
data2 = '{ "name": "Milk",' ' "command_topic": "test_topic" }'
|
data2 = '{ "name": "Milk",' ' "command_topic": "test_topic" }'
|
||||||
await help_test_discovery_broken(
|
await help_test_discovery_broken(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, LOCK_DOMAIN, data1, data2
|
hass, mqtt_mock_entry_no_yaml_config, caplog, lock.DOMAIN, data1, data2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT lock device registry integration."""
|
"""Test MQTT lock device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT lock device registry integration."""
|
"""Test MQTT lock device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, LOCK_DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, lock.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -649,8 +670,8 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
await help_test_entity_debug_info_message(
|
await help_test_entity_debug_info_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
LOCK_DOMAIN,
|
lock.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
SERVICE_LOCK,
|
SERVICE_LOCK,
|
||||||
command_payload="LOCK",
|
command_payload="LOCK",
|
||||||
)
|
)
|
||||||
|
@ -679,8 +700,8 @@ async def test_publishing_with_custom_encoding(
|
||||||
template,
|
template,
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = LOCK_DOMAIN
|
domain = lock.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
|
|
||||||
await help_test_publishing_with_custom_encoding(
|
await help_test_publishing_with_custom_encoding(
|
||||||
hass,
|
hass,
|
||||||
|
@ -698,8 +719,8 @@ async def test_publishing_with_custom_encoding(
|
||||||
|
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = LOCK_DOMAIN
|
domain = lock.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -707,8 +728,8 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
|
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = LOCK_DOMAIN
|
domain = lock.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -732,8 +753,8 @@ async def test_encoding_subscribable_topics(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
LOCK_DOMAIN,
|
lock.DOMAIN,
|
||||||
DEFAULT_CONFIG[LOCK_DOMAIN],
|
DEFAULT_CONFIG_LEGACY[lock.DOMAIN],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -743,8 +764,8 @@ async def test_encoding_subscribable_topics(
|
||||||
|
|
||||||
async def test_setup_manual_entity_from_yaml(hass, caplog, tmp_path):
|
async def test_setup_manual_entity_from_yaml(hass, caplog, tmp_path):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = LOCK_DOMAIN
|
platform = lock.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -753,8 +774,21 @@ async def test_setup_manual_entity_from_yaml(hass, caplog, tmp_path):
|
||||||
|
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = LOCK_DOMAIN
|
domain = lock.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = lock.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -66,9 +66,14 @@ from .test_common import (
|
||||||
from tests.common import async_fire_mqtt_message, mock_restore_cache_with_extra_data
|
from tests.common import async_fire_mqtt_message, mock_restore_cache_with_extra_data
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
number.DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"}
|
mqtt.DOMAIN: {number.DOMAIN: {"name": "test", "command_topic": "test-topic"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[number.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def number_platform_only():
|
def number_platform_only():
|
||||||
|
@ -82,16 +87,17 @@ async def test_run_number_setup(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"device_class": "temperature",
|
"device_class": "temperature",
|
||||||
"unit_of_measurement": TEMP_FAHRENHEIT,
|
"unit_of_measurement": TEMP_FAHRENHEIT,
|
||||||
"payload_reset": "reset!",
|
"payload_reset": "reset!",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -131,14 +137,15 @@ async def test_value_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -184,14 +191,15 @@ async def test_restore_native_value(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
)
|
)
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
number.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"device_class": "temperature",
|
"device_class": "temperature",
|
||||||
"unit_of_measurement": TEMP_FAHRENHEIT,
|
"unit_of_measurement": TEMP_FAHRENHEIT,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -220,12 +228,13 @@ async def test_run_number_service_optimistic(hass, mqtt_mock_entry_with_yaml_con
|
||||||
)
|
)
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
number.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -295,13 +304,14 @@ async def test_run_number_service_optimistic_with_command_template(
|
||||||
)
|
)
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
number.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"command_template": '{"number": {{ value }} }',
|
"command_template": '{"number": {{ value }} }',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -361,13 +371,14 @@ async def test_run_number_service(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
number.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"command_topic": cmd_topic,
|
"command_topic": cmd_topic,
|
||||||
"state_topic": state_topic,
|
"state_topic": state_topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -398,14 +409,15 @@ async def test_run_number_service_with_command_template(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
number.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"command_topic": cmd_topic,
|
"command_topic": cmd_topic,
|
||||||
"state_topic": state_topic,
|
"state_topic": state_topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"command_template": '{"number": {{ value }} }',
|
"command_template": '{"number": {{ value }} }',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -434,28 +446,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -464,7 +476,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -476,7 +488,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
number.DOMAIN,
|
number.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_NUMBER_ATTRIBUTES_BLOCKED,
|
MQTT_NUMBER_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -484,7 +496,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -493,7 +505,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, number.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
number.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -502,14 +518,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, number.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
number.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, number.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
number.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -540,7 +564,7 @@ async def test_unique_id(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_discovery_removal_number(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_removal_number(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test removal of discovered number."""
|
"""Test removal of discovered number."""
|
||||||
data = json.dumps(DEFAULT_CONFIG[number.DOMAIN])
|
data = json.dumps(DEFAULT_CONFIG_LEGACY[number.DOMAIN])
|
||||||
await help_test_discovery_removal(
|
await help_test_discovery_removal(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, number.DOMAIN, data
|
hass, mqtt_mock_entry_no_yaml_config, caplog, number.DOMAIN, data
|
||||||
)
|
)
|
||||||
|
@ -600,42 +624,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT number device registry integration."""
|
"""Test MQTT number device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT number device registry integration."""
|
"""Test MQTT number device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, number.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -645,7 +669,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
number.DOMAIN,
|
number.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
SERVICE_SET_VALUE,
|
SERVICE_SET_VALUE,
|
||||||
service_parameters={ATTR_VALUE: 45},
|
service_parameters={ATTR_VALUE: 45},
|
||||||
command_payload="45",
|
command_payload="45",
|
||||||
|
@ -658,16 +682,17 @@ async def test_min_max_step_attributes(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"min": 5,
|
"min": 5,
|
||||||
"max": 110,
|
"max": 110,
|
||||||
"step": 20,
|
"step": 20,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -680,25 +705,24 @@ async def test_min_max_step_attributes(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
assert state.attributes.get(ATTR_STEP) == 20
|
assert state.attributes.get(ATTR_STEP) == 20
|
||||||
|
|
||||||
|
|
||||||
async def test_invalid_min_max_attributes(hass, caplog, mqtt_mock_entry_no_yaml_config):
|
async def test_invalid_min_max_attributes(hass, caplog):
|
||||||
"""Test invalid min/max attributes."""
|
"""Test invalid min/max attributes."""
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
assert not await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"min": 35,
|
"min": 35,
|
||||||
"max": 10,
|
"max": 10,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
|
||||||
await mqtt_mock_entry_no_yaml_config()
|
|
||||||
|
|
||||||
assert f"'{CONF_MAX}' must be > '{CONF_MIN}'" in caplog.text
|
assert f"'{CONF_MAX}' must be > '{CONF_MIN}'" in caplog.text
|
||||||
|
|
||||||
|
@ -779,15 +803,16 @@ async def test_mqtt_payload_not_a_number_warning(
|
||||||
):
|
):
|
||||||
"""Test warning for MQTT payload which is not a number."""
|
"""Test warning for MQTT payload which is not a number."""
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -808,15 +833,16 @@ async def test_mqtt_payload_out_of_range_error(
|
||||||
topic = "test/number"
|
topic = "test/number"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"number",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"number": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
number.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Number",
|
"name": "Test Number",
|
||||||
"min": 5,
|
"min": 5,
|
||||||
"max": 110,
|
"max": 110,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -856,7 +882,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = NUMBER_DOMAIN
|
domain = NUMBER_DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
|
|
||||||
await help_test_publishing_with_custom_encoding(
|
await help_test_publishing_with_custom_encoding(
|
||||||
hass,
|
hass,
|
||||||
|
@ -875,7 +901,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = number.DOMAIN
|
domain = number.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -884,7 +910,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = number.DOMAIN
|
domain = number.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -910,7 +936,7 @@ async def test_encoding_subscribable_topics(
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
"number",
|
"number",
|
||||||
DEFAULT_CONFIG["number"],
|
DEFAULT_CONFIG_LEGACY["number"],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -921,7 +947,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = number.DOMAIN
|
platform = number.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -931,7 +957,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = number.DOMAIN
|
domain = number.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = number.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -4,7 +4,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import scene
|
from homeassistant.components import mqtt, scene
|
||||||
from homeassistant.const import ATTR_ENTITY_ID, SERVICE_TURN_ON, STATE_UNKNOWN, Platform
|
from homeassistant.const import ATTR_ENTITY_ID, SERVICE_TURN_ON, STATE_UNKNOWN, Platform
|
||||||
import homeassistant.core as ha
|
import homeassistant.core as ha
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
@ -28,14 +28,20 @@ from .test_common import (
|
||||||
from tests.common import mock_restore_cache
|
from tests.common import mock_restore_cache
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
scene.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
scene.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test-topic",
|
"command_topic": "test-topic",
|
||||||
"payload_on": "test-payload-on",
|
"payload_on": "test-payload-on",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[scene.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def scene_platform_only():
|
def scene_platform_only():
|
||||||
|
@ -51,14 +57,15 @@ async def test_sending_mqtt_commands(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
scene.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
scene.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
scene.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
},
|
},
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -80,14 +87,14 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, scene.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, scene.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, scene.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, scene.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -168,8 +175,8 @@ async def test_discovery_removal_scene(hass, mqtt_mock_entry_no_yaml_config, cap
|
||||||
|
|
||||||
async def test_discovery_update_payload(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_payload(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered scene."""
|
"""Test update of discovered scene."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[scene.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[scene.DOMAIN])
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[scene.DOMAIN])
|
config2 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[scene.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config2["name"] = "Milk"
|
config2["name"] = "Milk"
|
||||||
config1["payload_on"] = "ON"
|
config1["payload_on"] = "ON"
|
||||||
|
@ -216,7 +223,7 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = scene.DOMAIN
|
domain = scene.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -225,14 +232,14 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = scene.DOMAIN
|
domain = scene.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = scene.DOMAIN
|
platform = scene.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -242,7 +249,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = scene.DOMAIN
|
domain = scene.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = scene.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -5,7 +5,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import select
|
from homeassistant.components import mqtt, select
|
||||||
from homeassistant.components.mqtt.select import MQTT_SELECT_ATTRIBUTES_BLOCKED
|
from homeassistant.components.mqtt.select import MQTT_SELECT_ATTRIBUTES_BLOCKED
|
||||||
from homeassistant.components.select import (
|
from homeassistant.components.select import (
|
||||||
ATTR_OPTION,
|
ATTR_OPTION,
|
||||||
|
@ -56,14 +56,20 @@ from .test_common import (
|
||||||
from tests.common import async_fire_mqtt_message, mock_restore_cache
|
from tests.common import async_fire_mqtt_message, mock_restore_cache
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
select.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "test-topic",
|
"command_topic": "test-topic",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[select.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def select_platform_only():
|
def select_platform_only():
|
||||||
|
@ -77,14 +83,15 @@ async def test_run_select_setup(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
topic = "test/select"
|
topic = "test/select"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"select",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -111,15 +118,16 @@ async def test_value_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
topic = "test/select"
|
topic = "test/select"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"select",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -157,13 +165,14 @@ async def test_run_select_service_optimistic(hass, mqtt_mock_entry_with_yaml_con
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
select.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -198,14 +207,15 @@ async def test_run_select_service_optimistic_with_command_template(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
select.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
"command_template": '{"option": "{{ value }}"}',
|
"command_template": '{"option": "{{ value }}"}',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -238,14 +248,15 @@ async def test_run_select_service(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
select.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"command_topic": cmd_topic,
|
"command_topic": cmd_topic,
|
||||||
"state_topic": state_topic,
|
"state_topic": state_topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -276,15 +287,16 @@ async def test_run_select_service_with_command_template(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
select.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"command_topic": cmd_topic,
|
"command_topic": cmd_topic,
|
||||||
"state_topic": state_topic,
|
"state_topic": state_topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
"command_template": '{"option": "{{ value }}"}',
|
"command_template": '{"option": "{{ value }}"}',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -311,28 +323,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -341,7 +353,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -353,7 +365,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
select.DOMAIN,
|
select.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_SELECT_ATTRIBUTES_BLOCKED,
|
MQTT_SELECT_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -361,7 +373,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -370,7 +382,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, select.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
select.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -379,14 +395,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, select.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
select.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, select.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
select.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,7 +443,7 @@ async def test_unique_id(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_discovery_removal_select(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_removal_select(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test removal of discovered select."""
|
"""Test removal of discovered select."""
|
||||||
data = json.dumps(DEFAULT_CONFIG[select.DOMAIN])
|
data = json.dumps(DEFAULT_CONFIG_LEGACY[select.DOMAIN])
|
||||||
await help_test_discovery_removal(
|
await help_test_discovery_removal(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, select.DOMAIN, data
|
hass, mqtt_mock_entry_no_yaml_config, caplog, select.DOMAIN, data
|
||||||
)
|
)
|
||||||
|
@ -477,42 +501,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT select device registry integration."""
|
"""Test MQTT select device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT select device registry integration."""
|
"""Test MQTT select device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, select.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -522,7 +546,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
select.DOMAIN,
|
select.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
select.SERVICE_SELECT_OPTION,
|
select.SERVICE_SELECT_OPTION,
|
||||||
service_parameters={ATTR_OPTION: "beer"},
|
service_parameters={ATTR_OPTION: "beer"},
|
||||||
command_payload="beer",
|
command_payload="beer",
|
||||||
|
@ -536,14 +560,15 @@ async def test_options_attributes(hass, mqtt_mock_entry_with_yaml_config, option
|
||||||
topic = "test/select"
|
topic = "test/select"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"select",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test select",
|
"name": "Test select",
|
||||||
"options": options,
|
"options": options,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -561,14 +586,15 @@ async def test_mqtt_payload_not_an_option_warning(
|
||||||
topic = "test/select"
|
topic = "test/select"
|
||||||
await async_setup_component(
|
await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"select",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"select": {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
select.DOMAIN: {
|
||||||
"state_topic": topic,
|
"state_topic": topic,
|
||||||
"command_topic": topic,
|
"command_topic": topic,
|
||||||
"name": "Test Select",
|
"name": "Test Select",
|
||||||
"options": ["milk", "beer"],
|
"options": ["milk", "beer"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -609,7 +635,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = select.DOMAIN
|
domain = select.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
config["options"] = ["milk", "beer"]
|
config["options"] = ["milk", "beer"]
|
||||||
|
|
||||||
await help_test_publishing_with_custom_encoding(
|
await help_test_publishing_with_custom_encoding(
|
||||||
|
@ -629,7 +655,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = select.DOMAIN
|
domain = select.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -638,7 +664,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = select.DOMAIN
|
domain = select.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -659,7 +685,7 @@ async def test_encoding_subscribable_topics(
|
||||||
attribute_value,
|
attribute_value,
|
||||||
):
|
):
|
||||||
"""Test handling of incoming encoded payload."""
|
"""Test handling of incoming encoded payload."""
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG["select"])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY["select"])
|
||||||
config["options"] = ["milk", "beer"]
|
config["options"] = ["milk", "beer"]
|
||||||
await help_test_encoding_subscribable_topics(
|
await help_test_encoding_subscribable_topics(
|
||||||
hass,
|
hass,
|
||||||
|
@ -677,7 +703,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = select.DOMAIN
|
platform = select.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -687,7 +713,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = select.DOMAIN
|
domain = select.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = select.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -6,8 +6,8 @@ from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components import mqtt, sensor
|
||||||
from homeassistant.components.mqtt.sensor import MQTT_SENSOR_ATTRIBUTES_BLOCKED
|
from homeassistant.components.mqtt.sensor import MQTT_SENSOR_ATTRIBUTES_BLOCKED
|
||||||
import homeassistant.components.sensor as sensor
|
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
EVENT_STATE_CHANGED,
|
EVENT_STATE_CHANGED,
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
|
@ -64,16 +64,20 @@ from .test_common import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.common import (
|
from tests.common import (
|
||||||
assert_setup_component,
|
|
||||||
async_fire_mqtt_message,
|
async_fire_mqtt_message,
|
||||||
async_fire_time_changed,
|
async_fire_time_changed,
|
||||||
mock_restore_cache_with_extra_data,
|
mock_restore_cache_with_extra_data,
|
||||||
)
|
)
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
sensor.DOMAIN: {"platform": "mqtt", "name": "test", "state_topic": "test-topic"}
|
mqtt.DOMAIN: {sensor.DOMAIN: {"name": "test", "state_topic": "test-topic"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[sensor.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def sensor_platform_only():
|
def sensor_platform_only():
|
||||||
|
@ -88,13 +92,14 @@ async def test_setting_sensor_value_via_mqtt_message(
|
||||||
"""Test the setting of the value via MQTT."""
|
"""Test the setting of the value via MQTT."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -146,13 +151,14 @@ async def test_setting_sensor_native_value_handling_via_mqtt_message(
|
||||||
"""Test the setting of the value via MQTT."""
|
"""Test the setting of the value via MQTT."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"device_class": device_class,
|
"device_class": device_class,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -173,15 +179,16 @@ async def test_setting_sensor_value_expires_availability_topic(
|
||||||
"""Test the expiration of the value."""
|
"""Test the expiration of the value."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"expire_after": 4,
|
"expire_after": 4,
|
||||||
"force_update": True,
|
"force_update": True,
|
||||||
"availability_topic": "availability-topic",
|
"availability_topic": "availability-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -206,15 +213,16 @@ async def test_setting_sensor_value_expires(
|
||||||
"""Test the expiration of the value."""
|
"""Test the expiration of the value."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"expire_after": "4",
|
"expire_after": "4",
|
||||||
"force_update": True,
|
"force_update": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -285,14 +293,15 @@ async def test_setting_sensor_value_via_mqtt_json_message(
|
||||||
"""Test the setting of the value via MQTT with JSON payload."""
|
"""Test the setting of the value via MQTT with JSON payload."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -311,14 +320,15 @@ async def test_setting_sensor_value_via_mqtt_json_message_and_default_current_st
|
||||||
"""Test the setting of the value via MQTT with fall back to current state."""
|
"""Test the setting of the value via MQTT with fall back to current state."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"value_template": "{{ value_json.val | is_defined }}-{{ value_json.par }}",
|
"value_template": "{{ value_json.val | is_defined }}-{{ value_json.par }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -344,15 +354,16 @@ async def test_setting_sensor_last_reset_via_mqtt_message(
|
||||||
"""Test the setting of the last_reset property via MQTT."""
|
"""Test the setting of the last_reset property via MQTT."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_class": "total",
|
"state_class": "total",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"last_reset_topic": "last-reset-topic",
|
"last_reset_topic": "last-reset-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -376,15 +387,16 @@ async def test_setting_sensor_bad_last_reset_via_mqtt_message(
|
||||||
"""Test the setting of the last_reset property via MQTT."""
|
"""Test the setting of the last_reset property via MQTT."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_class": "total",
|
"state_class": "total",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"last_reset_topic": "last-reset-topic",
|
"last_reset_topic": "last-reset-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -403,15 +415,16 @@ async def test_setting_sensor_empty_last_reset_via_mqtt_message(
|
||||||
"""Test the setting of the last_reset property via MQTT."""
|
"""Test the setting of the last_reset property via MQTT."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_class": "total",
|
"state_class": "total",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"last_reset_topic": "last-reset-topic",
|
"last_reset_topic": "last-reset-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -430,16 +443,17 @@ async def test_setting_sensor_last_reset_via_mqtt_json_message(
|
||||||
"""Test the setting of the value via MQTT with JSON payload."""
|
"""Test the setting of the value via MQTT with JSON payload."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_class": "total",
|
"state_class": "total",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"last_reset_topic": "last-reset-topic",
|
"last_reset_topic": "last-reset-topic",
|
||||||
"last_reset_value_template": "{{ value_json.last_reset }}",
|
"last_reset_value_template": "{{ value_json.last_reset }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -460,19 +474,20 @@ async def test_setting_sensor_last_reset_via_mqtt_json_message_2(
|
||||||
"""Test the setting of the value via MQTT with JSON payload."""
|
"""Test the setting of the value via MQTT with JSON payload."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
**{
|
sensor.DOMAIN: {
|
||||||
"platform": "mqtt",
|
**{
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_class": "total",
|
"state_class": "total",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "kWh",
|
"unit_of_measurement": "kWh",
|
||||||
"value_template": "{{ value_json.value | float / 60000 }}",
|
"value_template": "{{ value_json.value | float / 60000 }}",
|
||||||
"last_reset_value_template": "{{ utcnow().fromtimestamp(value_json.time / 1000, tz=utcnow().tzinfo) }}",
|
"last_reset_value_template": "{{ utcnow().fromtimestamp(value_json.time / 1000, tz=utcnow().tzinfo) }}",
|
||||||
},
|
},
|
||||||
**extra,
|
**extra,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -498,13 +513,14 @@ async def test_force_update_disabled(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test force update option."""
|
"""Test force update option."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -532,14 +548,15 @@ async def test_force_update_enabled(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test force update option."""
|
"""Test force update option."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"force_update": True,
|
"force_update": True,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -568,21 +585,21 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -591,7 +608,7 @@ async def test_default_availability_list_payload(
|
||||||
):
|
):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_list_payload(
|
await help_test_default_availability_list_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -600,7 +617,7 @@ async def test_default_availability_list_payload_all(
|
||||||
):
|
):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_list_payload_all(
|
await help_test_default_availability_list_payload_all(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -609,7 +626,7 @@ async def test_default_availability_list_payload_any(
|
||||||
):
|
):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_list_payload_any(
|
await help_test_default_availability_list_payload_any(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -618,21 +635,25 @@ async def test_default_availability_list_single(
|
||||||
):
|
):
|
||||||
"""Test availability list and availability_topic are mutually exclusive."""
|
"""Test availability list and availability_topic are mutually exclusive."""
|
||||||
await help_test_default_availability_list_single(
|
await help_test_default_availability_list_single(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, sensor.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
sensor.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_availability(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_discovery_update_availability(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test availability discovery update."""
|
"""Test availability discovery update."""
|
||||||
await help_test_discovery_update_availability(
|
await help_test_discovery_update_availability(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -642,11 +663,12 @@ async def test_invalid_device_class(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
sensor.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"device_class": "foobarnotreal",
|
"device_class": "foobarnotreal",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -661,17 +683,18 @@ async def test_valid_device_class(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test device_class option with valid values."""
|
"""Test device_class option with valid values."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"sensor",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"sensor": [
|
mqtt.DOMAIN: {
|
||||||
{
|
sensor.DOMAIN: [
|
||||||
"platform": "mqtt",
|
{
|
||||||
"name": "Test 1",
|
"name": "Test 1",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"device_class": "temperature",
|
"device_class": "temperature",
|
||||||
},
|
},
|
||||||
{"platform": "mqtt", "name": "Test 2", "state_topic": "test-topic"},
|
{"name": "Test 2", "state_topic": "test-topic"},
|
||||||
]
|
]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -689,11 +712,12 @@ async def test_invalid_state_class(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
sensor.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"state_class": "foobarnotreal",
|
"state_class": "foobarnotreal",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -708,17 +732,18 @@ async def test_valid_state_class(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test state_class option with valid values."""
|
"""Test state_class option with valid values."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
"sensor",
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
"sensor": [
|
mqtt.DOMAIN: {
|
||||||
{
|
sensor.DOMAIN: [
|
||||||
"platform": "mqtt",
|
{
|
||||||
"name": "Test 1",
|
"name": "Test 1",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"state_class": "measurement",
|
"state_class": "measurement",
|
||||||
},
|
},
|
||||||
{"platform": "mqtt", "name": "Test 2", "state_topic": "test-topic"},
|
{"name": "Test 2", "state_topic": "test-topic"},
|
||||||
]
|
]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -735,7 +760,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -747,7 +772,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
sensor.DOMAIN,
|
sensor.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
MQTT_SENSOR_ATTRIBUTES_BLOCKED,
|
MQTT_SENSOR_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -755,7 +780,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -764,7 +789,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, sensor.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
sensor.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -773,14 +802,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, sensor.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
sensor.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, sensor.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
sensor.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -914,42 +951,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor device registry integration."""
|
"""Test MQTT sensor device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor device registry integration."""
|
"""Test MQTT sensor device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -967,7 +1004,6 @@ async def test_entity_device_info_with_hub(hass, mqtt_mock_entry_no_yaml_config)
|
||||||
|
|
||||||
data = json.dumps(
|
data = json.dumps(
|
||||||
{
|
{
|
||||||
"platform": "mqtt",
|
|
||||||
"name": "Test 1",
|
"name": "Test 1",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"device": {"identifiers": ["helloworld"], "via_device": "hub-id"},
|
"device": {"identifiers": ["helloworld"], "via_device": "hub-id"},
|
||||||
|
@ -985,42 +1021,42 @@ async def test_entity_device_info_with_hub(hass, mqtt_mock_entry_no_yaml_config)
|
||||||
async def test_entity_debug_info(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_debug_info(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor debug info."""
|
"""Test MQTT sensor debug info."""
|
||||||
await help_test_entity_debug_info(
|
await help_test_entity_debug_info(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_debug_info_max_messages(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_debug_info_max_messages(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor debug info."""
|
"""Test MQTT sensor debug info."""
|
||||||
await help_test_entity_debug_info_max_messages(
|
await help_test_entity_debug_info_max_messages(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT debug info."""
|
"""Test MQTT debug info."""
|
||||||
await help_test_entity_debug_info_message(
|
await help_test_entity_debug_info_message(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG, None
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY, None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_debug_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_debug_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor debug info."""
|
"""Test MQTT sensor debug info."""
|
||||||
await help_test_entity_debug_info_remove(
|
await help_test_entity_debug_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_debug_info_update_entity_id(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_debug_info_update_entity_id(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT sensor debug info."""
|
"""Test MQTT sensor debug info."""
|
||||||
await help_test_entity_debug_info_update_entity_id(
|
await help_test_entity_debug_info_update_entity_id(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_disabled_by_default(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_disabled_by_default(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test entity disabled by default."""
|
"""Test entity disabled by default."""
|
||||||
await help_test_entity_disabled_by_default(
|
await help_test_entity_disabled_by_default(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1028,7 +1064,7 @@ async def test_entity_disabled_by_default(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
async def test_entity_category(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_category(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test entity category."""
|
"""Test entity category."""
|
||||||
await help_test_entity_category(
|
await help_test_entity_category(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, sensor.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1036,19 +1072,20 @@ async def test_value_template_with_entity_id(hass, mqtt_mock_entry_with_yaml_con
|
||||||
"""Test the access to attributes in value_template via the entity_id."""
|
"""Test the access to attributes in value_template via the entity_id."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
sensor.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
sensor.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
sensor.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "test-topic",
|
"state_topic": "test-topic",
|
||||||
"unit_of_measurement": "fav unit",
|
"unit_of_measurement": "fav unit",
|
||||||
"value_template": '\
|
"value_template": '\
|
||||||
{% if state_attr(entity_id, "friendly_name") == "test" %} \
|
{% if state_attr(entity_id, "friendly_name") == "test" %} \
|
||||||
{{ value | int + 1 }} \
|
{{ value | int + 1 }} \
|
||||||
{% else %} \
|
{% else %} \
|
||||||
{{ value }} \
|
{{ value }} \
|
||||||
{% endif %}',
|
{% endif %}',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -1064,7 +1101,7 @@ async def test_value_template_with_entity_id(hass, mqtt_mock_entry_with_yaml_con
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = sensor.DOMAIN
|
domain = sensor.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -1073,7 +1110,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = sensor.DOMAIN
|
domain = sensor.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1082,14 +1119,14 @@ async def test_cleanup_triggers_and_restoring_state(
|
||||||
):
|
):
|
||||||
"""Test cleanup old triggers at reloading and restoring the state."""
|
"""Test cleanup old triggers at reloading and restoring the state."""
|
||||||
domain = sensor.DOMAIN
|
domain = sensor.DOMAIN
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config1 = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][domain])
|
||||||
config1["name"] = "test1"
|
config1["name"] = "test1"
|
||||||
config1["expire_after"] = 30
|
config1["expire_after"] = 30
|
||||||
config1["state_topic"] = "test-topic1"
|
config1["state_topic"] = "test-topic1"
|
||||||
config1["device_class"] = "temperature"
|
config1["device_class"] = "temperature"
|
||||||
config1["unit_of_measurement"] = TEMP_FAHRENHEIT
|
config1["unit_of_measurement"] = TEMP_FAHRENHEIT
|
||||||
|
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config2 = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][domain])
|
||||||
config2["name"] = "test2"
|
config2["name"] = "test2"
|
||||||
config2["expire_after"] = 5
|
config2["expire_after"] = 5
|
||||||
config2["state_topic"] = "test-topic2"
|
config2["state_topic"] = "test-topic2"
|
||||||
|
@ -1100,8 +1137,8 @@ async def test_cleanup_triggers_and_restoring_state(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
domain,
|
mqtt.DOMAIN,
|
||||||
{domain: [config1, config2]},
|
{mqtt.DOMAIN: {domain: [config1, config2]}},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
@ -1116,7 +1153,7 @@ async def test_cleanup_triggers_and_restoring_state(
|
||||||
freezer.move_to("2022-02-02 12:01:10+01:00")
|
freezer.move_to("2022-02-02 12:01:10+01:00")
|
||||||
|
|
||||||
await help_test_reload_with_config(
|
await help_test_reload_with_config(
|
||||||
hass, caplog, tmp_path, {domain: [config1, config2]}
|
hass, caplog, tmp_path, {mqtt.DOMAIN: {domain: [config1, config2]}}
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
@ -1150,7 +1187,7 @@ async def test_skip_restoring_state_with_over_due_expire_trigger(
|
||||||
|
|
||||||
freezer.move_to("2022-02-02 12:02:00+01:00")
|
freezer.move_to("2022-02-02 12:02:00+01:00")
|
||||||
domain = sensor.DOMAIN
|
domain = sensor.DOMAIN
|
||||||
config3 = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config3 = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][domain])
|
||||||
config3["name"] = "test3"
|
config3["name"] = "test3"
|
||||||
config3["expire_after"] = 10
|
config3["expire_after"] = 10
|
||||||
config3["state_topic"] = "test-topic3"
|
config3["state_topic"] = "test-topic3"
|
||||||
|
@ -1163,10 +1200,11 @@ async def test_skip_restoring_state_with_over_due_expire_trigger(
|
||||||
fake_extra_data = MagicMock()
|
fake_extra_data = MagicMock()
|
||||||
mock_restore_cache_with_extra_data(hass, ((fake_state, fake_extra_data),))
|
mock_restore_cache_with_extra_data(hass, ((fake_state, fake_extra_data),))
|
||||||
|
|
||||||
with assert_setup_component(1, domain):
|
assert await async_setup_component(
|
||||||
assert await async_setup_component(hass, domain, {domain: config3})
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {domain: config3}}
|
||||||
await hass.async_block_till_done()
|
)
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
assert "Skip state recovery after reload for sensor.test3" in caplog.text
|
assert "Skip state recovery after reload for sensor.test3" in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
@ -1192,7 +1230,7 @@ async def test_encoding_subscribable_topics(
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
sensor.DOMAIN,
|
sensor.DOMAIN,
|
||||||
DEFAULT_CONFIG[sensor.DOMAIN],
|
DEFAULT_CONFIG_LEGACY[sensor.DOMAIN],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -1204,7 +1242,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = sensor.DOMAIN
|
platform = sensor.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -1214,7 +1252,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = sensor.DOMAIN
|
domain = sensor.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = sensor.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -4,7 +4,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import siren
|
from homeassistant.components import mqtt, siren
|
||||||
from homeassistant.components.siren.const import ATTR_VOLUME_LEVEL
|
from homeassistant.components.siren.const import ATTR_VOLUME_LEVEL
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ASSUMED_STATE,
|
ATTR_ASSUMED_STATE,
|
||||||
|
@ -53,9 +53,14 @@ from .test_common import (
|
||||||
from tests.common import async_fire_mqtt_message
|
from tests.common import async_fire_mqtt_message
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
siren.DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"}
|
mqtt.DOMAIN: {siren.DOMAIN: {"name": "test", "command_topic": "test-topic"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[siren.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def siren_platform_only():
|
def siren_platform_only():
|
||||||
|
@ -83,15 +88,16 @@ async def test_controlling_state_via_topic(hass, mqtt_mock_entry_with_yaml_confi
|
||||||
"""Test the controlling state via topic."""
|
"""Test the controlling state via topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
siren.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
siren.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": 1,
|
"payload_on": 1,
|
||||||
"payload_off": 0,
|
"payload_off": 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -119,15 +125,16 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
"""Test the sending MQTT commands in optimistic mode."""
|
"""Test the sending MQTT commands in optimistic mode."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
siren.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
siren.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
"payload_off": "beer off",
|
"payload_off": "beer off",
|
||||||
"qos": "2",
|
"qos": "2",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -162,16 +169,17 @@ async def test_controlling_state_via_topic_and_json_message(
|
||||||
"""Test the controlling state via topic and JSON message."""
|
"""Test the controlling state via topic and JSON message."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
siren.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
siren.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
"payload_off": "beer off",
|
"payload_off": "beer off",
|
||||||
"state_value_template": "{{ value_json.val }}",
|
"state_value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -202,16 +210,17 @@ async def test_controlling_state_and_attributes_with_json_message_without_templa
|
||||||
"""Test the controlling state via topic and JSON message without a value template."""
|
"""Test the controlling state via topic and JSON message without a value template."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
siren.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
siren.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
"payload_off": "beer off",
|
"payload_off": "beer off",
|
||||||
"available_tones": ["ping", "siren", "bell"],
|
"available_tones": ["ping", "siren", "bell"],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -284,7 +293,6 @@ async def test_filtering_not_supported_attributes_optimistic(
|
||||||
):
|
):
|
||||||
"""Test setting attributes with support flags optimistic."""
|
"""Test setting attributes with support flags optimistic."""
|
||||||
config = {
|
config = {
|
||||||
"platform": "mqtt",
|
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"available_tones": ["ping", "siren", "bell"],
|
"available_tones": ["ping", "siren", "bell"],
|
||||||
}
|
}
|
||||||
|
@ -300,8 +308,8 @@ async def test_filtering_not_supported_attributes_optimistic(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{siren.DOMAIN: [config1, config2, config3]},
|
{mqtt.DOMAIN: {siren.DOMAIN: [config1, config2, config3]}},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
@ -370,7 +378,6 @@ async def test_filtering_not_supported_attributes_via_state(
|
||||||
):
|
):
|
||||||
"""Test setting attributes with support flags via state."""
|
"""Test setting attributes with support flags via state."""
|
||||||
config = {
|
config = {
|
||||||
"platform": "mqtt",
|
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"available_tones": ["ping", "siren", "bell"],
|
"available_tones": ["ping", "siren", "bell"],
|
||||||
}
|
}
|
||||||
|
@ -389,8 +396,8 @@ async def test_filtering_not_supported_attributes_via_state(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{siren.DOMAIN: [config1, config2, config3]},
|
{mqtt.DOMAIN: {siren.DOMAIN: [config1, config2, config3]}},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
@ -450,14 +457,14 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -513,17 +520,18 @@ async def test_custom_state_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the state payload."""
|
"""Test the state payload."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
siren.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
siren.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": 1,
|
"payload_on": 1,
|
||||||
"payload_off": 0,
|
"payload_off": 0,
|
||||||
"state_on": "HIGH",
|
"state_on": "HIGH",
|
||||||
"state_off": "LOW",
|
"state_off": "LOW",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -550,7 +558,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -559,14 +567,14 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG, {}
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY, {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -575,7 +583,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, siren.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
siren.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -584,14 +596,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, siren.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
siren.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, siren.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
siren.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -636,8 +656,8 @@ async def test_discovery_update_siren_topic_template(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog
|
hass, mqtt_mock_entry_no_yaml_config, caplog
|
||||||
):
|
):
|
||||||
"""Test update of discovered siren."""
|
"""Test update of discovered siren."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[siren.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[siren.DOMAIN])
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[siren.DOMAIN])
|
config2 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[siren.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config2["name"] = "Milk"
|
config2["name"] = "Milk"
|
||||||
config1["state_topic"] = "siren/state1"
|
config1["state_topic"] = "siren/state1"
|
||||||
|
@ -673,8 +693,8 @@ async def test_discovery_update_siren_template(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog
|
hass, mqtt_mock_entry_no_yaml_config, caplog
|
||||||
):
|
):
|
||||||
"""Test update of discovered siren."""
|
"""Test update of discovered siren."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[siren.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[siren.DOMAIN])
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[siren.DOMAIN])
|
config2 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[siren.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config2["name"] = "Milk"
|
config2["name"] = "Milk"
|
||||||
config1["state_topic"] = "siren/state1"
|
config1["state_topic"] = "siren/state1"
|
||||||
|
@ -706,7 +726,7 @@ async def test_discovery_update_siren_template(
|
||||||
|
|
||||||
async def test_command_templates(hass, mqtt_mock_entry_with_yaml_config, caplog):
|
async def test_command_templates(hass, mqtt_mock_entry_with_yaml_config, caplog):
|
||||||
"""Test siren with command templates optimistic."""
|
"""Test siren with command templates optimistic."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[siren.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][siren.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config1["available_tones"] = ["ping", "chimes"]
|
config1["available_tones"] = ["ping", "chimes"]
|
||||||
config1[
|
config1[
|
||||||
|
@ -719,8 +739,8 @@ async def test_command_templates(hass, mqtt_mock_entry_with_yaml_config, caplog)
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
siren.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{siren.DOMAIN: [config1, config2]},
|
{mqtt.DOMAIN: {siren.DOMAIN: [config1, config2]}},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
@ -824,42 +844,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT siren device registry integration."""
|
"""Test MQTT siren device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT siren device registry integration."""
|
"""Test MQTT siren device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, siren.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -869,7 +889,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
siren.DOMAIN,
|
siren.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
siren.SERVICE_TURN_ON,
|
siren.SERVICE_TURN_ON,
|
||||||
command_payload='{"state":"ON"}',
|
command_payload='{"state":"ON"}',
|
||||||
)
|
)
|
||||||
|
@ -906,7 +926,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with command templates and different encoding."""
|
"""Test publishing MQTT payload with command templates and different encoding."""
|
||||||
domain = siren.DOMAIN
|
domain = siren.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[domain])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
config[siren.ATTR_AVAILABLE_TONES] = ["siren", "xylophone"]
|
config[siren.ATTR_AVAILABLE_TONES] = ["siren", "xylophone"]
|
||||||
|
|
||||||
await help_test_publishing_with_custom_encoding(
|
await help_test_publishing_with_custom_encoding(
|
||||||
|
@ -926,7 +946,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = siren.DOMAIN
|
domain = siren.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -935,7 +955,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = siren.DOMAIN
|
domain = siren.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -960,7 +980,7 @@ async def test_encoding_subscribable_topics(
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
siren.DOMAIN,
|
siren.DOMAIN,
|
||||||
DEFAULT_CONFIG[siren.DOMAIN],
|
DEFAULT_CONFIG_LEGACY[siren.DOMAIN],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -971,7 +991,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = siren.DOMAIN
|
platform = siren.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -981,7 +1001,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = siren.DOMAIN
|
domain = siren.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = siren.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -5,7 +5,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import vacuum
|
from homeassistant.components import mqtt, vacuum
|
||||||
from homeassistant.components.mqtt.const import CONF_COMMAND_TOPIC, CONF_STATE_TOPIC
|
from homeassistant.components.mqtt.const import CONF_COMMAND_TOPIC, CONF_STATE_TOPIC
|
||||||
from homeassistant.components.mqtt.vacuum import CONF_SCHEMA, schema_state as mqttvacuum
|
from homeassistant.components.mqtt.vacuum import CONF_SCHEMA, schema_state as mqttvacuum
|
||||||
from homeassistant.components.mqtt.vacuum.const import MQTT_VACUUM_ATTRIBUTES_BLOCKED
|
from homeassistant.components.mqtt.vacuum.const import MQTT_VACUUM_ATTRIBUTES_BLOCKED
|
||||||
|
@ -73,19 +73,27 @@ SEND_COMMAND_TOPIC = "vacuum/send_command"
|
||||||
STATE_TOPIC = "vacuum/state"
|
STATE_TOPIC = "vacuum/state"
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
CONF_PLATFORM: "mqtt",
|
mqtt.DOMAIN: {
|
||||||
CONF_SCHEMA: "state",
|
vacuum.DOMAIN: {
|
||||||
CONF_NAME: "mqtttest",
|
CONF_SCHEMA: "state",
|
||||||
CONF_COMMAND_TOPIC: COMMAND_TOPIC,
|
CONF_NAME: "mqtttest",
|
||||||
mqttvacuum.CONF_SEND_COMMAND_TOPIC: SEND_COMMAND_TOPIC,
|
CONF_COMMAND_TOPIC: COMMAND_TOPIC,
|
||||||
CONF_STATE_TOPIC: STATE_TOPIC,
|
mqttvacuum.CONF_SEND_COMMAND_TOPIC: SEND_COMMAND_TOPIC,
|
||||||
mqttvacuum.CONF_SET_FAN_SPEED_TOPIC: "vacuum/set_fan_speed",
|
CONF_STATE_TOPIC: STATE_TOPIC,
|
||||||
mqttvacuum.CONF_FAN_SPEED_LIST: ["min", "medium", "high", "max"],
|
mqttvacuum.CONF_SET_FAN_SPEED_TOPIC: "vacuum/set_fan_speed",
|
||||||
|
mqttvacuum.CONF_FAN_SPEED_LIST: ["min", "medium", "high", "max"],
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFAULT_CONFIG_2 = {
|
DEFAULT_CONFIG_2 = {mqtt.DOMAIN: {vacuum.DOMAIN: {"schema": "state", "name": "test"}}}
|
||||||
vacuum.DOMAIN: {"platform": "mqtt", "schema": "state", "name": "test"}
|
|
||||||
}
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[vacuum.DOMAIN][CONF_PLATFORM] = mqtt.DOMAIN
|
||||||
|
DEFAULT_CONFIG_2_LEGACY = deepcopy(DEFAULT_CONFIG_2[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_2_LEGACY[vacuum.DOMAIN][CONF_PLATFORM] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
|
@ -97,9 +105,7 @@ def vacuum_platform_only():
|
||||||
|
|
||||||
async def test_default_supported_features(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_supported_features(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test that the correct supported features."""
|
"""Test that the correct supported features."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(hass, mqtt.DOMAIN, DEFAULT_CONFIG)
|
||||||
hass, vacuum.DOMAIN, {vacuum.DOMAIN: DEFAULT_CONFIG}
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
entity = hass.states.get("vacuum.mqtttest")
|
entity = hass.states.get("vacuum.mqtttest")
|
||||||
|
@ -111,12 +117,14 @@ async def test_default_supported_features(hass, mqtt_mock_entry_with_yaml_config
|
||||||
|
|
||||||
async def test_all_commands(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_all_commands(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test simple commands send to the vacuum."""
|
"""Test simple commands send to the vacuum."""
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][vacuum.DOMAIN])
|
||||||
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
||||||
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config})
|
assert await async_setup_component(
|
||||||
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {vacuum.DOMAIN: config}}
|
||||||
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -185,13 +193,15 @@ async def test_commands_without_supported_features(
|
||||||
hass, mqtt_mock_entry_with_yaml_config
|
hass, mqtt_mock_entry_with_yaml_config
|
||||||
):
|
):
|
||||||
"""Test commands which are not supported by the vacuum."""
|
"""Test commands which are not supported by the vacuum."""
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][vacuum.DOMAIN])
|
||||||
services = mqttvacuum.STRING_TO_SERVICE["status"]
|
services = mqttvacuum.STRING_TO_SERVICE["status"]
|
||||||
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
||||||
services, SERVICE_TO_STRING
|
services, SERVICE_TO_STRING
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config})
|
assert await async_setup_component(
|
||||||
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {vacuum.DOMAIN: config}}
|
||||||
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
mqtt_mock = await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -243,12 +253,14 @@ async def test_commands_without_supported_features(
|
||||||
|
|
||||||
async def test_status(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_status(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test status updates from the vacuum."""
|
"""Test status updates from the vacuum."""
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][vacuum.DOMAIN])
|
||||||
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
||||||
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config})
|
assert await async_setup_component(
|
||||||
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {vacuum.DOMAIN: config}}
|
||||||
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
state = hass.states.get("vacuum.mqtttest")
|
state = hass.states.get("vacuum.mqtttest")
|
||||||
|
@ -288,13 +300,15 @@ async def test_status(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
|
||||||
async def test_no_fan_vacuum(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_no_fan_vacuum(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test status updates from the vacuum when fan is not supported."""
|
"""Test status updates from the vacuum when fan is not supported."""
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][vacuum.DOMAIN])
|
||||||
del config[mqttvacuum.CONF_FAN_SPEED_LIST]
|
del config[mqttvacuum.CONF_FAN_SPEED_LIST]
|
||||||
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
||||||
mqttvacuum.DEFAULT_SERVICES, SERVICE_TO_STRING
|
mqttvacuum.DEFAULT_SERVICES, SERVICE_TO_STRING
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config})
|
assert await async_setup_component(
|
||||||
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {vacuum.DOMAIN: config}}
|
||||||
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -340,12 +354,14 @@ async def test_no_fan_vacuum(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
@pytest.mark.no_fail_on_log_exception
|
@pytest.mark.no_fail_on_log_exception
|
||||||
async def test_status_invalid_json(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_status_invalid_json(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test to make sure nothing breaks if the vacuum sends bad JSON."""
|
"""Test to make sure nothing breaks if the vacuum sends bad JSON."""
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN][vacuum.DOMAIN])
|
||||||
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
config[mqttvacuum.CONF_SUPPORTED_FEATURES] = services_to_strings(
|
||||||
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
mqttvacuum.ALL_SERVICES, SERVICE_TO_STRING
|
||||||
)
|
)
|
||||||
|
|
||||||
assert await async_setup_component(hass, vacuum.DOMAIN, {vacuum.DOMAIN: config})
|
assert await async_setup_component(
|
||||||
|
hass, mqtt.DOMAIN, {mqtt.DOMAIN: {vacuum.DOMAIN: config}}
|
||||||
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
await mqtt_mock_entry_with_yaml_config()
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
@ -359,28 +375,28 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_default_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by default payload with defined topic."""
|
"""Test availability by default payload with defined topic."""
|
||||||
await help_test_default_availability_payload(
|
await help_test_default_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_custom_availability_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability by custom payload with defined topic."""
|
"""Test availability by custom payload with defined topic."""
|
||||||
await help_test_custom_availability_payload(
|
await help_test_custom_availability_payload(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -389,7 +405,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -401,7 +417,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
vacuum.DOMAIN,
|
vacuum.DOMAIN,
|
||||||
DEFAULT_CONFIG_2,
|
DEFAULT_CONFIG_2_LEGACY,
|
||||||
MQTT_VACUUM_ATTRIBUTES_BLOCKED,
|
MQTT_VACUUM_ATTRIBUTES_BLOCKED,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -409,7 +425,7 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -418,7 +434,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
vacuum.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_2_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -427,14 +447,22 @@ async def test_update_with_json_attrs_bad_json(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
vacuum.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_2_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
vacuum.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_2_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -511,42 +539,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT vacuum device registry integration."""
|
"""Test MQTT vacuum device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT vacuum device registry integration."""
|
"""Test MQTT vacuum device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_with_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2
|
hass, mqtt_mock_entry_no_yaml_config, vacuum.DOMAIN, DEFAULT_CONFIG_2_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -556,7 +584,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
vacuum.DOMAIN,
|
vacuum.DOMAIN,
|
||||||
DEFAULT_CONFIG_2,
|
DEFAULT_CONFIG_2_LEGACY,
|
||||||
vacuum.SERVICE_START,
|
vacuum.SERVICE_START,
|
||||||
command_payload="start",
|
command_payload="start",
|
||||||
state_payload="{}",
|
state_payload="{}",
|
||||||
|
@ -615,7 +643,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = vacuum.DOMAIN
|
domain = vacuum.DOMAIN
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
config["supported_features"] = [
|
config["supported_features"] = [
|
||||||
"battery",
|
"battery",
|
||||||
"clean_spot",
|
"clean_spot",
|
||||||
|
@ -646,7 +674,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = vacuum.DOMAIN
|
domain = vacuum.DOMAIN
|
||||||
config = DEFAULT_CONFIG
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -655,7 +683,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = vacuum.DOMAIN
|
domain = vacuum.DOMAIN
|
||||||
config = DEFAULT_CONFIG
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -691,7 +719,7 @@ async def test_encoding_subscribable_topics(
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
vacuum.DOMAIN,
|
vacuum.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY[vacuum.DOMAIN],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -703,8 +731,21 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = vacuum.DOMAIN
|
platform = vacuum.DOMAIN
|
||||||
config = deepcopy(DEFAULT_CONFIG)
|
config = deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
assert hass.states.get(f"{platform}.test") is not None
|
assert hass.states.get(f"{platform}.test") is not None
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = vacuum.DOMAIN
|
||||||
|
config = deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
|
@ -4,7 +4,7 @@ from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components import switch
|
from homeassistant.components import mqtt, switch
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_ASSUMED_STATE,
|
ATTR_ASSUMED_STATE,
|
||||||
ATTR_DEVICE_CLASS,
|
ATTR_DEVICE_CLASS,
|
||||||
|
@ -51,9 +51,14 @@ from tests.common import async_fire_mqtt_message, mock_restore_cache
|
||||||
from tests.components.switch import common
|
from tests.components.switch import common
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
DEFAULT_CONFIG = {
|
||||||
switch.DOMAIN: {"platform": "mqtt", "name": "test", "command_topic": "test-topic"}
|
mqtt.DOMAIN: {switch.DOMAIN: {"name": "test", "command_topic": "test-topic"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
DEFAULT_CONFIG_LEGACY = copy.deepcopy(DEFAULT_CONFIG[mqtt.DOMAIN])
|
||||||
|
DEFAULT_CONFIG_LEGACY[switch.DOMAIN]["platform"] = mqtt.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def switch_platform_only():
|
def switch_platform_only():
|
||||||
|
@ -66,16 +71,17 @@ async def test_controlling_state_via_topic(hass, mqtt_mock_entry_with_yaml_confi
|
||||||
"""Test the controlling state via topic."""
|
"""Test the controlling state via topic."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
switch.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
switch.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
switch.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": 1,
|
"payload_on": 1,
|
||||||
"payload_off": 0,
|
"payload_off": 0,
|
||||||
"device_class": "switch",
|
"device_class": "switch",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -112,15 +118,16 @@ async def test_sending_mqtt_commands_and_optimistic(
|
||||||
|
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
switch.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
switch.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
switch.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
"payload_off": "beer off",
|
"payload_off": "beer off",
|
||||||
"qos": "2",
|
"qos": "2",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -155,12 +162,13 @@ async def test_sending_inital_state_and_optimistic(
|
||||||
"""Test the initial state in optimistic mode."""
|
"""Test the initial state in optimistic mode."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
switch.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
switch.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
switch.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -178,16 +186,17 @@ async def test_controlling_state_via_topic_and_json_message(
|
||||||
"""Test the controlling state via topic and JSON message."""
|
"""Test the controlling state via topic and JSON message."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
switch.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
switch.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
switch.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": "beer on",
|
"payload_on": "beer on",
|
||||||
"payload_off": "beer off",
|
"payload_off": "beer off",
|
||||||
"value_template": "{{ value_json.val }}",
|
"value_template": "{{ value_json.val }}",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -218,14 +227,14 @@ async def test_availability_when_connection_lost(
|
||||||
):
|
):
|
||||||
"""Test availability after MQTT disconnection."""
|
"""Test availability after MQTT disconnection."""
|
||||||
await help_test_availability_when_connection_lost(
|
await help_test_availability_when_connection_lost(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_availability_without_topic(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test availability without defined availability topic."""
|
"""Test availability without defined availability topic."""
|
||||||
await help_test_availability_without_topic(
|
await help_test_availability_without_topic(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -281,17 +290,18 @@ async def test_custom_state_payload(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the state payload."""
|
"""Test the state payload."""
|
||||||
assert await async_setup_component(
|
assert await async_setup_component(
|
||||||
hass,
|
hass,
|
||||||
switch.DOMAIN,
|
mqtt.DOMAIN,
|
||||||
{
|
{
|
||||||
switch.DOMAIN: {
|
mqtt.DOMAIN: {
|
||||||
"platform": "mqtt",
|
switch.DOMAIN: {
|
||||||
"name": "test",
|
"name": "test",
|
||||||
"state_topic": "state-topic",
|
"state_topic": "state-topic",
|
||||||
"command_topic": "command-topic",
|
"command_topic": "command-topic",
|
||||||
"payload_on": 1,
|
"payload_on": 1,
|
||||||
"payload_off": 0,
|
"payload_off": 0,
|
||||||
"state_on": "HIGH",
|
"state_on": "HIGH",
|
||||||
"state_off": "LOW",
|
"state_off": "LOW",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -318,7 +328,7 @@ async def test_setting_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_via_mqtt_json_message(
|
await help_test_setting_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -327,14 +337,14 @@ async def test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
):
|
):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
await help_test_setting_blocked_attribute_via_mqtt_json_message(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG, {}
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY, {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_setting_attribute_with_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||||
await help_test_setting_attribute_with_template(
|
await help_test_setting_attribute_with_template(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -343,7 +353,11 @@ async def test_update_with_json_attrs_not_dict(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_not_dict(
|
await help_test_update_with_json_attrs_not_dict(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, switch.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
switch.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -352,14 +366,22 @@ async def test_update_with_json_attrs_bad_JSON(
|
||||||
):
|
):
|
||||||
"""Test attributes get extracted from a JSON result."""
|
"""Test attributes get extracted from a JSON result."""
|
||||||
await help_test_update_with_json_attrs_bad_JSON(
|
await help_test_update_with_json_attrs_bad_JSON(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, switch.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_with_yaml_config,
|
||||||
|
caplog,
|
||||||
|
switch.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
async def test_discovery_update_attr(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
"""Test update of discovered MQTTAttributes."""
|
"""Test update of discovered MQTTAttributes."""
|
||||||
await help_test_discovery_update_attr(
|
await help_test_discovery_update_attr(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog, switch.DOMAIN, DEFAULT_CONFIG
|
hass,
|
||||||
|
mqtt_mock_entry_no_yaml_config,
|
||||||
|
caplog,
|
||||||
|
switch.DOMAIN,
|
||||||
|
DEFAULT_CONFIG_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -404,8 +426,8 @@ async def test_discovery_update_switch_topic_template(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog
|
hass, mqtt_mock_entry_no_yaml_config, caplog
|
||||||
):
|
):
|
||||||
"""Test update of discovered switch."""
|
"""Test update of discovered switch."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[switch.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[switch.DOMAIN])
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[switch.DOMAIN])
|
config2 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[switch.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config2["name"] = "Milk"
|
config2["name"] = "Milk"
|
||||||
config1["state_topic"] = "switch/state1"
|
config1["state_topic"] = "switch/state1"
|
||||||
|
@ -441,8 +463,8 @@ async def test_discovery_update_switch_template(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, caplog
|
hass, mqtt_mock_entry_no_yaml_config, caplog
|
||||||
):
|
):
|
||||||
"""Test update of discovered switch."""
|
"""Test update of discovered switch."""
|
||||||
config1 = copy.deepcopy(DEFAULT_CONFIG[switch.DOMAIN])
|
config1 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[switch.DOMAIN])
|
||||||
config2 = copy.deepcopy(DEFAULT_CONFIG[switch.DOMAIN])
|
config2 = copy.deepcopy(DEFAULT_CONFIG_LEGACY[switch.DOMAIN])
|
||||||
config1["name"] = "Beer"
|
config1["name"] = "Beer"
|
||||||
config2["name"] = "Milk"
|
config2["name"] = "Milk"
|
||||||
config1["state_topic"] = "switch/state1"
|
config1["state_topic"] = "switch/state1"
|
||||||
|
@ -512,42 +534,42 @@ async def test_discovery_broken(hass, mqtt_mock_entry_no_yaml_config, caplog):
|
||||||
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_connection(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT switch device registry integration."""
|
"""Test MQTT switch device registry integration."""
|
||||||
await help_test_entity_device_info_with_connection(
|
await help_test_entity_device_info_with_connection(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_with_identifier(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT switch device registry integration."""
|
"""Test MQTT switch device registry integration."""
|
||||||
await help_test_entity_device_info_with_identifier(
|
await help_test_entity_device_info_with_identifier(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry update."""
|
"""Test device registry update."""
|
||||||
await help_test_entity_device_info_update(
|
await help_test_entity_device_info_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_device_info_remove(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test device registry remove."""
|
"""Test device registry remove."""
|
||||||
await help_test_entity_device_info_remove(
|
await help_test_entity_device_info_remove(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_entity_id_update_subscriptions(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
"""Test MQTT subscriptions are managed when entity_id is updated."""
|
||||||
await help_test_entity_id_update_subscriptions(
|
await help_test_entity_id_update_subscriptions(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_with_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
async def test_entity_id_update_discovery_update(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
"""Test MQTT discovery update when entity_id is updated."""
|
"""Test MQTT discovery update when entity_id is updated."""
|
||||||
await help_test_entity_id_update_discovery_update(
|
await help_test_entity_id_update_discovery_update(
|
||||||
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG
|
hass, mqtt_mock_entry_no_yaml_config, switch.DOMAIN, DEFAULT_CONFIG_LEGACY
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -557,7 +579,7 @@ async def test_entity_debug_info_message(hass, mqtt_mock_entry_no_yaml_config):
|
||||||
hass,
|
hass,
|
||||||
mqtt_mock_entry_no_yaml_config,
|
mqtt_mock_entry_no_yaml_config,
|
||||||
switch.DOMAIN,
|
switch.DOMAIN,
|
||||||
DEFAULT_CONFIG,
|
DEFAULT_CONFIG_LEGACY,
|
||||||
switch.SERVICE_TURN_ON,
|
switch.SERVICE_TURN_ON,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -593,7 +615,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
):
|
):
|
||||||
"""Test publishing MQTT payload with different encoding."""
|
"""Test publishing MQTT payload with different encoding."""
|
||||||
domain = switch.DOMAIN
|
domain = switch.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
|
|
||||||
await help_test_publishing_with_custom_encoding(
|
await help_test_publishing_with_custom_encoding(
|
||||||
hass,
|
hass,
|
||||||
|
@ -612,7 +634,7 @@ async def test_publishing_with_custom_encoding(
|
||||||
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform."""
|
"""Test reloading the MQTT platform."""
|
||||||
domain = switch.DOMAIN
|
domain = switch.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable(
|
await help_test_reloadable(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
@ -621,7 +643,7 @@ async def test_reloadable(hass, mqtt_mock_entry_with_yaml_config, caplog, tmp_pa
|
||||||
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
async def test_reloadable_late(hass, mqtt_client_mock, caplog, tmp_path):
|
||||||
"""Test reloading the MQTT platform with late entry setup."""
|
"""Test reloading the MQTT platform with late entry setup."""
|
||||||
domain = switch.DOMAIN
|
domain = switch.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
await help_test_reloadable_late(hass, caplog, tmp_path, domain, config)
|
||||||
|
|
||||||
|
|
||||||
|
@ -646,7 +668,7 @@ async def test_encoding_subscribable_topics(
|
||||||
mqtt_mock_entry_with_yaml_config,
|
mqtt_mock_entry_with_yaml_config,
|
||||||
caplog,
|
caplog,
|
||||||
switch.DOMAIN,
|
switch.DOMAIN,
|
||||||
DEFAULT_CONFIG[switch.DOMAIN],
|
DEFAULT_CONFIG_LEGACY[switch.DOMAIN],
|
||||||
topic,
|
topic,
|
||||||
value,
|
value,
|
||||||
attribute,
|
attribute,
|
||||||
|
@ -657,7 +679,7 @@ async def test_encoding_subscribable_topics(
|
||||||
async def test_setup_manual_entity_from_yaml(hass):
|
async def test_setup_manual_entity_from_yaml(hass):
|
||||||
"""Test setup manual configured MQTT entity."""
|
"""Test setup manual configured MQTT entity."""
|
||||||
platform = switch.DOMAIN
|
platform = switch.DOMAIN
|
||||||
config = copy.deepcopy(DEFAULT_CONFIG[platform])
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[platform])
|
||||||
config["name"] = "test"
|
config["name"] = "test"
|
||||||
del config["platform"]
|
del config["platform"]
|
||||||
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
await help_test_setup_manual_entity_from_yaml(hass, platform, config)
|
||||||
|
@ -667,7 +689,20 @@ async def test_setup_manual_entity_from_yaml(hass):
|
||||||
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
async def test_unload_entry(hass, mqtt_mock_entry_with_yaml_config, tmp_path):
|
||||||
"""Test unloading the config entry."""
|
"""Test unloading the config entry."""
|
||||||
domain = switch.DOMAIN
|
domain = switch.DOMAIN
|
||||||
config = DEFAULT_CONFIG[domain]
|
config = DEFAULT_CONFIG_LEGACY[domain]
|
||||||
await help_test_unload_config_entry_with_platform(
|
await help_test_unload_config_entry_with_platform(
|
||||||
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
hass, mqtt_mock_entry_with_yaml_config, tmp_path, domain, config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test deprecated YAML configuration under the platform key
|
||||||
|
# Scheduled to be removed in HA core 2022.12
|
||||||
|
async def test_setup_with_legacy_schema(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test a setup with deprecated yaml platform schema."""
|
||||||
|
domain = switch.DOMAIN
|
||||||
|
config = copy.deepcopy(DEFAULT_CONFIG_LEGACY[domain])
|
||||||
|
config["name"] = "test"
|
||||||
|
assert await async_setup_component(hass, domain, {domain: config})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
assert hass.states.get(f"{domain}.test") is not None
|
||||||
|
|
Loading…
Add table
Reference in a new issue