diff --git a/homeassistant/components/tankerkoenig/__init__.py b/homeassistant/components/tankerkoenig/__init__.py index fde2f1c57cd..aa8c6f87dc8 100755 --- a/homeassistant/components/tankerkoenig/__init__.py +++ b/homeassistant/components/tankerkoenig/__init__.py @@ -1,6 +1,7 @@ """Ask tankerkoenig.de for petrol price information.""" from datetime import timedelta import logging +from uuid import UUID import pytankerkoenig import voluptuous as vol @@ -24,11 +25,26 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_RADIUS = 2 DEFAULT_SCAN_INTERVAL = timedelta(minutes=30) + +def uuid4_string(value): + """Validate a v4 UUID in string format.""" + try: + result = UUID(value, version=4) + except (ValueError, AttributeError, TypeError) as error: + raise vol.Invalid("Invalid Version4 UUID", error_message=str(error)) + + if str(result) != value.lower(): + # UUID() will create a uuid4 if input is invalid + raise vol.Invalid("Invalid Version4 UUID") + + return str(result) + + CONFIG_SCHEMA = vol.Schema( { DOMAIN: vol.Schema( { - vol.Required(CONF_API_KEY): cv.string, + vol.Required(CONF_API_KEY): uuid4_string, vol.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, @@ -49,7 +65,7 @@ CONFIG_SCHEMA = vol.Schema( cv.positive_int, vol.Range(min=1) ), vol.Optional(CONF_STATIONS, default=[]): vol.All( - cv.ensure_list, [cv.string] + cv.ensure_list, [uuid4_string] ), } ) diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 840905e85a0..4ecf3dc9d22 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -588,6 +588,9 @@ pysonos==0.0.24 # homeassistant.components.spc pyspcwebgw==0.4.0 +# homeassistant.components.tankerkoenig +pytankerkoenig==0.0.6 + # homeassistant.components.ecobee python-ecobee-api==0.2.2 diff --git a/tests/components/tankerkoenig/__init__.py b/tests/components/tankerkoenig/__init__.py new file mode 100755 index 00000000000..c420d23e157 --- /dev/null +++ b/tests/components/tankerkoenig/__init__.py @@ -0,0 +1 @@ +"""Tests for the tankerkoenig integration.""" diff --git a/tests/components/tankerkoenig/test_tankerkoenig_validators.py b/tests/components/tankerkoenig/test_tankerkoenig_validators.py new file mode 100755 index 00000000000..7dba88b24fb --- /dev/null +++ b/tests/components/tankerkoenig/test_tankerkoenig_validators.py @@ -0,0 +1,32 @@ +"""The tests for the custom tankerkoenig validators.""" +import unittest +import uuid + +import pytest +import voluptuous as vol + +from homeassistant.components.tankerkoenig import uuid4_string + + +class TestUUID4StringValidator(unittest.TestCase): + """Test the UUID4 string custom validator.""" + + def test_uuid4_string(caplog): + """Test string uuid validation.""" + schema = vol.Schema(uuid4_string) + + for value in ["Not a hex string", "0", 0]: + with pytest.raises(vol.Invalid): + schema(value) + + with pytest.raises(vol.Invalid): + # the third block should start with 4 + schema("a03d31b2-2eee-2acc-bb90-eec40be6ed23") + + with pytest.raises(vol.Invalid): + # the fourth block should start with 8-a + schema("a03d31b2-2eee-4acc-1b90-eec40be6ed23") + + _str = str(uuid.uuid4()) + assert schema(_str) == _str + assert schema(_str.upper()) == _str