config: Fix handling of None in Secret
This commit is contained in:
parent
f5cd806dc5
commit
51f89017fe
@ -80,23 +80,36 @@ class String(ConfigValue):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
def serialize(self, value):
|
def serialize(self, value):
|
||||||
|
if value is None:
|
||||||
|
return b''
|
||||||
return encode(value)
|
return encode(value)
|
||||||
|
|
||||||
|
|
||||||
class Secret(ConfigValue):
|
class Secret(ConfigValue):
|
||||||
"""String value.
|
"""Secret value.
|
||||||
|
|
||||||
Masked when being displayed, and is not decoded.
|
Should be used for passwords, auth tokens etc. Deserializing will not
|
||||||
|
convert to unicode. Will mask value when being displayed.
|
||||||
"""
|
"""
|
||||||
def __init__(self, optional=False, choices=None):
|
def __init__(self, optional=False, choices=None):
|
||||||
self._required = not optional
|
self._required = not optional
|
||||||
|
|
||||||
def deserialize(self, value):
|
def deserialize(self, value):
|
||||||
|
value = value.strip()
|
||||||
validators.validate_required(value, self._required)
|
validators.validate_required(value, self._required)
|
||||||
|
if not value:
|
||||||
|
return None
|
||||||
|
return value
|
||||||
|
|
||||||
|
def serialize(self, value):
|
||||||
|
if value is None:
|
||||||
|
return b''
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def format(self, value):
|
def format(self, value):
|
||||||
return '********'
|
if value is None:
|
||||||
|
return b''
|
||||||
|
return b'********'
|
||||||
|
|
||||||
|
|
||||||
class Integer(ConfigValue):
|
class Integer(ConfigValue):
|
||||||
|
|||||||
@ -88,6 +88,12 @@ class StringTest(unittest.TestCase):
|
|||||||
self.assertIsInstance(result, bytes)
|
self.assertIsInstance(result, bytes)
|
||||||
self.assertEqual(r'a\n\tb'.encode('utf-8'), result)
|
self.assertEqual(r'a\n\tb'.encode('utf-8'), result)
|
||||||
|
|
||||||
|
def test_serialize_none(self):
|
||||||
|
value = types.String()
|
||||||
|
result = value.serialize(None)
|
||||||
|
self.assertIsInstance(result, bytes)
|
||||||
|
self.assertEqual(b'', result)
|
||||||
|
|
||||||
|
|
||||||
class SecretTest(unittest.TestCase):
|
class SecretTest(unittest.TestCase):
|
||||||
def test_deserialize_passes_through(self):
|
def test_deserialize_passes_through(self):
|
||||||
@ -100,13 +106,28 @@ class SecretTest(unittest.TestCase):
|
|||||||
value = types.Secret()
|
value = types.Secret()
|
||||||
self.assertRaises(ValueError, value.deserialize, b'')
|
self.assertRaises(ValueError, value.deserialize, b'')
|
||||||
|
|
||||||
def test_serialize_conversion_to_string(self):
|
def test_deserialize_respects_optional(self):
|
||||||
|
value = types.Secret(optional=True)
|
||||||
|
self.assertIsNone(value.deserialize(b''))
|
||||||
|
self.assertIsNone(value.deserialize(b' '))
|
||||||
|
|
||||||
|
def test_serialize_none(self):
|
||||||
value = types.Secret()
|
value = types.Secret()
|
||||||
self.assertIsInstance(value.serialize(object()), bytes)
|
result = value.serialize(None)
|
||||||
|
self.assertIsInstance(result, bytes)
|
||||||
|
self.assertEqual(b'', result)
|
||||||
|
|
||||||
def test_format_masks_value(self):
|
def test_format_masks_value(self):
|
||||||
value = types.Secret()
|
value = types.Secret()
|
||||||
self.assertEqual('********', value.format('s3cret'))
|
result = value.format('s3cret')
|
||||||
|
self.assertIsInstance(result, bytes)
|
||||||
|
self.assertEqual(b'********', result)
|
||||||
|
|
||||||
|
def test_format_none(self):
|
||||||
|
value = types.Secret()
|
||||||
|
result = value.format(None)
|
||||||
|
self.assertIsInstance(result, bytes)
|
||||||
|
self.assertEqual(b'', result)
|
||||||
|
|
||||||
|
|
||||||
class IntegerTest(unittest.TestCase):
|
class IntegerTest(unittest.TestCase):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user