config: Add basic validate tests

This commit is contained in:
Thomas Adamcik 2013-04-13 01:18:26 +02:00
parent c5f8e1da19
commit 067cc4c112
2 changed files with 58 additions and 17 deletions

View File

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

View File

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