config: Add basic validate tests
This commit is contained in:
parent
c5f8e1da19
commit
067cc4c112
@ -103,23 +103,8 @@ def validate(raw_config, schemas, extensions=None):
|
||||
for extension in extensions or []:
|
||||
sections_and_schemas.append(
|
||||
(extension.ext_name, extension.get_config_schema()))
|
||||
return _validate(raw_config, sections_and_schemas)
|
||||
|
||||
|
||||
# TODO: replace validate() with this version of API.
|
||||
def _validate(raw_config, schemas):
|
||||
# Get validated config
|
||||
config = {}
|
||||
errors = {}
|
||||
for name, schema in schemas:
|
||||
if name not in raw_config:
|
||||
errors[name] = {name: 'section not found'}
|
||||
try:
|
||||
items = raw_config[name].items()
|
||||
config[name] = schema.convert(items)
|
||||
# TODO: convert to ConfigSchemaError
|
||||
except exceptions.ConfigError as error:
|
||||
errors[name] = error
|
||||
config, errors = _validate(raw_config, sections_and_schemas)
|
||||
|
||||
if errors:
|
||||
# TODO: raise error instead.
|
||||
@ -133,6 +118,24 @@ def _validate(raw_config, schemas):
|
||||
return config
|
||||
|
||||
|
||||
# TODO: replace validate() with this version of API.
|
||||
def _validate(raw_config, schemas):
|
||||
# Get validated config
|
||||
config = {}
|
||||
errors = []
|
||||
for name, schema in schemas:
|
||||
try:
|
||||
items = raw_config[name].items()
|
||||
config[name] = schema.convert(items)
|
||||
except KeyError:
|
||||
errors.append('%s: section not found.' % name)
|
||||
except exceptions.ConfigError as error:
|
||||
for key in error:
|
||||
errors.append('%s/%s: %s' % (name, key, error[key]))
|
||||
# TODO: raise errors instead of return
|
||||
return config, errors
|
||||
|
||||
|
||||
def parse_override(override):
|
||||
"""Parse section/key=value override."""
|
||||
section, remainder = override.split('/', 1)
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from mopidy import config
|
||||
import mock
|
||||
|
||||
from mopidy import config, exceptions
|
||||
|
||||
from tests import unittest, path_to_data_dir
|
||||
|
||||
@ -49,6 +51,42 @@ class LoadConfigTest(unittest.TestCase):
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
|
||||
class ValidateTest(unittest.TestCase):
|
||||
def test_empty_config_no_schemas(self):
|
||||
conf, errors = config._validate({}, [])
|
||||
self.assertEqual({}, conf)
|
||||
self.assertEqual([], errors)
|
||||
|
||||
def test_config_no_schemas(self):
|
||||
raw_config = {'foo': {'bar': 'baz'}}
|
||||
conf, errors = config._validate(raw_config, [])
|
||||
self.assertEqual({}, conf)
|
||||
self.assertEqual([], errors)
|
||||
|
||||
def test_empty_config_single_schema(self):
|
||||
conf, errors = config._validate({}, [('foo', mock.Mock())])
|
||||
self.assertEqual({}, conf)
|
||||
self.assertEqual(['foo: section not found.'], errors)
|
||||
|
||||
def test_config_single_schema(self):
|
||||
raw_config = {'foo': {'bar': 'baz'}}
|
||||
schema = mock.Mock()
|
||||
schema.convert.return_value = {'baz': 'bar'}
|
||||
conf, errors = config._validate(raw_config, [('foo', schema)])
|
||||
self.assertEqual({'foo': {'baz': 'bar'}}, conf)
|
||||
self.assertEqual([], errors)
|
||||
|
||||
def test_config_single_schema_config_error(self):
|
||||
raw_config = {'foo': {'bar': 'baz'}}
|
||||
schema = mock.Mock()
|
||||
schema.convert.side_effect = exceptions.ConfigError({'bar': 'bad'})
|
||||
conf, errors = config._validate(raw_config, [('foo', schema)])
|
||||
self.assertEqual(['foo/bar: bad'], errors)
|
||||
self.assertEqual({}, conf)
|
||||
|
||||
# TODO: add more tests
|
||||
|
||||
|
||||
class ParseOverrideTest(unittest.TestCase):
|
||||
def test_valid_override(self):
|
||||
expected = ('section', 'key', 'value')
|
||||
|
||||
Loading…
Reference in New Issue
Block a user