diff --git a/mopidy/config/schemas.py b/mopidy/config/schemas.py index ba1d5dad..66da481b 100644 --- a/mopidy/config/schemas.py +++ b/mopidy/config/schemas.py @@ -75,10 +75,12 @@ class ConfigSchema(object): if suggestion: errors[key] += ' Did you mean %s?' % suggestion except ValueError as e: # deserialization failed + result[key] = None errors[key] = str(e) for key in self._schema: if key not in result and key not in errors: + result[key] = None errors[key] = 'config key not found.' return result, errors @@ -131,6 +133,7 @@ class LogLevelConfigSchema(object): try: result[key] = self._config_value.deserialize(value) except ValueError as e: # deserialization failed + result[key] = None errors[key] = str(e) return result, errors diff --git a/tests/config/config_test.py b/tests/config/config_test.py index 05b573ec..cd708d85 100644 --- a/tests/config/config_test.py +++ b/tests/config/config_test.py @@ -69,7 +69,7 @@ class ValidateTest(unittest.TestCase): def test_empty_config_single_schema(self): conf, errors = config._validate({}, [self.schema]) - self.assertEqual({}, conf) + self.assertEqual({'foo': {'bar': None}}, conf) self.assertEqual({'foo': {'bar': 'config key not found.'}}, errors) def test_config_single_schema(self): @@ -83,7 +83,7 @@ class ValidateTest(unittest.TestCase): self.schema['bar'] = mock.Mock() self.schema['bar'].deserialize.side_effect = ValueError('bad') conf, errors = config._validate(raw_config, [self.schema]) - self.assertEqual({}, conf) + self.assertEqual({'foo': {'bar': None}}, conf) self.assertEqual({'foo': {'bar': 'bad'}}, errors) # TODO: add more tests diff --git a/tests/config/schemas_test.py b/tests/config/schemas_test.py index 8ee9ac50..c3ce2f4d 100644 --- a/tests/config/schemas_test.py +++ b/tests/config/schemas_test.py @@ -5,7 +5,7 @@ import mock from mopidy.config import schemas, types -from tests import unittest +from tests import unittest, any_unicode class ConfigSchemaTest(unittest.TestCase): @@ -41,30 +41,42 @@ class ConfigSchemaTest(unittest.TestCase): del self.values['foo'] result, errors = self.schema.deserialize(self.values) - self.assertIn('not found', errors['foo']) - self.assertItemsEqual(['bar', 'baz'], result.keys()) + self.assertEqual({'foo': any_unicode}, errors) + self.assertIsNone(result.pop('foo')) + self.assertIsNotNone(result.pop('bar')) + self.assertIsNotNone(result.pop('baz')) + self.assertEqual({}, result) def test_deserialize_with_extra_value(self): self.values['extra'] = '123' result, errors = self.schema.deserialize(self.values) - self.assertIn('unknown', errors['extra']) - self.assertItemsEqual(['foo', 'bar', 'baz'], result.keys()) + self.assertEqual({'extra': any_unicode}, errors) + self.assertIsNotNone(result.pop('foo')) + self.assertIsNotNone(result.pop('bar')) + self.assertIsNotNone(result.pop('baz')) + self.assertEqual({}, result) def test_deserialize_with_deserialization_error(self): self.schema['foo'].deserialize.side_effect = ValueError('failure') + result, errors = self.schema.deserialize(self.values) - self.assertIn('failure', errors['foo']) - self.assertItemsEqual(['bar', 'baz'], result.keys()) + self.assertEqual({'foo': 'failure'}, errors) + self.assertIsNone(result.pop('foo')) + self.assertIsNotNone(result.pop('bar')) + self.assertIsNotNone(result.pop('baz')) + self.assertEqual({}, result) def test_deserialize_with_multiple_deserialization_errors(self): self.schema['foo'].deserialize.side_effect = ValueError('failure') self.schema['bar'].deserialize.side_effect = ValueError('other') result, errors = self.schema.deserialize(self.values) - self.assertIn('failure', errors['foo']) - self.assertIn('other', errors['bar']) - self.assertItemsEqual(['baz'], result.keys()) + self.assertEqual({'foo': 'failure', 'bar': 'other'}, errors) + self.assertIsNone(result.pop('foo')) + self.assertIsNone(result.pop('bar')) + self.assertIsNotNone(result.pop('baz')) + self.assertEqual({}, result) def test_deserialize_deserialization_unknown_and_missing_errors(self): self.values['extra'] = '123' @@ -76,7 +88,11 @@ class ConfigSchemaTest(unittest.TestCase): self.assertNotIn('foo', errors) self.assertIn('failure', errors['bar']) self.assertIn('not found', errors['baz']) - self.assertItemsEqual(['foo'], result.keys()) + + self.assertNotIn('unknown', result) + self.assertIn('foo', result) + self.assertIsNone(result['bar']) + self.assertIsNone(result['baz']) class ExtensionConfigSchemaTest(unittest.TestCase):