Validate UUID for tankerkoenig (#32805)

* Validate UUIDs against custom validator

Instead of just validating against strings, use a custom validator,
so that the format can be checked.

* Add tests for custom UUID4 validator
This commit is contained in:
guillempages 2020-03-21 15:43:12 +01:00 committed by GitHub
parent ebc4804e04
commit 49c2a4a4e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 2 deletions

View File

@ -1,6 +1,7 @@
"""Ask tankerkoenig.de for petrol price information.""" """Ask tankerkoenig.de for petrol price information."""
from datetime import timedelta from datetime import timedelta
import logging import logging
from uuid import UUID
import pytankerkoenig import pytankerkoenig
import voluptuous as vol import voluptuous as vol
@ -24,11 +25,26 @@ _LOGGER = logging.getLogger(__name__)
DEFAULT_RADIUS = 2 DEFAULT_RADIUS = 2
DEFAULT_SCAN_INTERVAL = timedelta(minutes=30) 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( CONFIG_SCHEMA = vol.Schema(
{ {
DOMAIN: vol.Schema( DOMAIN: vol.Schema(
{ {
vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_API_KEY): uuid4_string,
vol.Optional( vol.Optional(
CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL
): cv.time_period, ): cv.time_period,
@ -49,7 +65,7 @@ CONFIG_SCHEMA = vol.Schema(
cv.positive_int, vol.Range(min=1) cv.positive_int, vol.Range(min=1)
), ),
vol.Optional(CONF_STATIONS, default=[]): vol.All( vol.Optional(CONF_STATIONS, default=[]): vol.All(
cv.ensure_list, [cv.string] cv.ensure_list, [uuid4_string]
), ),
} }
) )

View File

@ -588,6 +588,9 @@ pysonos==0.0.24
# homeassistant.components.spc # homeassistant.components.spc
pyspcwebgw==0.4.0 pyspcwebgw==0.4.0
# homeassistant.components.tankerkoenig
pytankerkoenig==0.0.6
# homeassistant.components.ecobee # homeassistant.components.ecobee
python-ecobee-api==0.2.2 python-ecobee-api==0.2.2

View File

@ -0,0 +1 @@
"""Tests for the tankerkoenig integration."""

View File

@ -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