From 41931c454e3d8e4b062d4a6151b59bc8a1961305 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Sun, 28 Nov 2021 21:03:23 -0500 Subject: [PATCH] Fully test the config schema changes --- tests/test_config.py | 71 ++++++++++++++++++++++++++++++++++++++------ zigpy_znp/config.py | 50 ++++++++++++++++--------------- 2 files changed, 88 insertions(+), 33 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index ef046842..13cec41b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,6 +1,9 @@ import enum -from zigpy_znp.config import EnumValue +import pytest +from voluptuous import Invalid + +import zigpy_znp.config as conf def test_EnumValue(): @@ -8,15 +11,65 @@ class TestEnum(enum.Enum): foo = 123 BAR = 456 - assert EnumValue(TestEnum)("foo") == TestEnum.foo - assert EnumValue(TestEnum)("BAR") == TestEnum.BAR + assert conf.EnumValue(TestEnum)("foo") == TestEnum.foo + assert conf.EnumValue(TestEnum)("BAR") == TestEnum.BAR + + assert conf.EnumValue(TestEnum, transformer=str.lower)("FOO") == TestEnum.foo + assert conf.EnumValue(TestEnum, transformer=str.upper)("bar") == TestEnum.BAR + + assert conf.EnumValue(TestEnum)(TestEnum.foo) == TestEnum.foo + assert conf.EnumValue(TestEnum)(TestEnum.BAR) == TestEnum.BAR + - assert ( - EnumValue(TestEnum, transformer=lambda s: str(s).lower())("FOO") == TestEnum.foo +def test_pin_states_same_lengths(): + # Bare schema works + conf.CONFIG_SCHEMA( + { + conf.CONF_DEVICE: {conf.CONF_DEVICE_PATH: "/dev/null"}, + conf.CONF_ZNP_CONFIG: {}, + } ) - assert ( - EnumValue(TestEnum, transformer=lambda s: str(s).upper())("bar") == TestEnum.BAR + + # So does one with explicitly specified pin states + config = conf.CONFIG_SCHEMA( + { + conf.CONF_DEVICE: {conf.CONF_DEVICE_PATH: "/dev/null"}, + conf.CONF_ZNP_CONFIG: { + conf.CONF_CONNECT_RTS_STATES: ["on", True, 0, 0, 0, 1, 1], + conf.CONF_CONNECT_DTR_STATES: ["off", False, 1, 0, 0, 1, 1], + }, + } ) - assert EnumValue(TestEnum)(TestEnum.foo) == TestEnum.foo - assert EnumValue(TestEnum)(TestEnum.BAR) == TestEnum.BAR + assert config[conf.CONF_ZNP_CONFIG][conf.CONF_CONNECT_RTS_STATES] == [ + True, + True, + False, + False, + False, + True, + True, + ] + assert config[conf.CONF_ZNP_CONFIG][conf.CONF_CONNECT_DTR_STATES] == [ + False, + False, + True, + False, + False, + True, + True, + ] + + +def test_pin_states_different_lengths(): + # They must be the same length + with pytest.raises(Invalid): + conf.CONFIG_SCHEMA( + { + conf.CONF_DEVICE: {conf.CONF_DEVICE_PATH: "/dev/null"}, + conf.CONF_ZNP_CONFIG: { + conf.CONF_CONNECT_RTS_STATES: [1, 1, 0], + conf.CONF_CONNECT_DTR_STATES: [1, 1], + }, + } + ) diff --git a/zigpy_znp/config.py b/zigpy_znp/config.py index cb197902..3d432195 100644 --- a/zigpy_znp/config.py +++ b/zigpy_znp/config.py @@ -77,30 +77,32 @@ def validator(config): { vol.Required(CONF_DEVICE): SCHEMA_DEVICE, vol.Optional(CONF_ZNP_CONFIG, default={}): vol.Schema( - { - vol.Optional(CONF_TX_POWER, default=None): vol.Any( - None, vol.All(int, vol.Range(min=-22, max=22)) - ), - vol.Optional(CONF_SREQ_TIMEOUT, default=15): VolPositiveNumber, - vol.Optional(CONF_ARSP_TIMEOUT, default=30): VolPositiveNumber, - vol.Optional( - CONF_AUTO_RECONNECT_RETRY_DELAY, default=5 - ): VolPositiveNumber, - vol.Optional(CONF_SKIP_BOOTLOADER, default=True): cv_boolean, - vol.Optional(CONF_LED_MODE, default=LEDMode.OFF): vol.Any( - None, EnumValue(LEDMode, lambda v: str(v).upper()) - ), - vol.Optional(CONF_MAX_CONCURRENT_REQUESTS, default="auto"): vol.Any( - "auto", VolPositiveNumber - ), - vol.Optional( - CONF_CONNECT_RTS_STATES, default=[False, True, False] - ): vol.Schema([cv_boolean]), - vol.Optional( - CONF_CONNECT_DTR_STATES, default=[False, False, False] - ): vol.Schema([cv_boolean]), - }, - keys_have_same_length(CONF_CONNECT_RTS_STATES, CONF_CONNECT_DTR_STATES), + vol.All( + { + vol.Optional(CONF_TX_POWER, default=None): vol.Any( + None, vol.All(int, vol.Range(min=-22, max=22)) + ), + vol.Optional(CONF_SREQ_TIMEOUT, default=15): VolPositiveNumber, + vol.Optional(CONF_ARSP_TIMEOUT, default=30): VolPositiveNumber, + vol.Optional( + CONF_AUTO_RECONNECT_RETRY_DELAY, default=5 + ): VolPositiveNumber, + vol.Optional(CONF_SKIP_BOOTLOADER, default=True): cv_boolean, + vol.Optional(CONF_LED_MODE, default=LEDMode.OFF): vol.Any( + None, EnumValue(LEDMode, lambda v: str(v).upper()) + ), + vol.Optional(CONF_MAX_CONCURRENT_REQUESTS, default="auto"): vol.Any( + "auto", VolPositiveNumber + ), + vol.Optional( + CONF_CONNECT_RTS_STATES, default=[False, True, False] + ): vol.Schema([cv_boolean]), + vol.Optional( + CONF_CONNECT_DTR_STATES, default=[False, False, False] + ): vol.Schema([cv_boolean]), + }, + keys_have_same_length(CONF_CONNECT_RTS_STATES, CONF_CONNECT_DTR_STATES), + ) ), } )