From 067cc4c112d02dd3085aa2ae99406adca9b803ce Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sat, 13 Apr 2013 01:18:26 +0200 Subject: [PATCH] config: Add basic validate tests --- mopidy/config/__init__.py | 35 +++++++++++++++++--------------- tests/config/config_test.py | 40 ++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/mopidy/config/__init__.py b/mopidy/config/__init__.py index 935f8743..38db4c42 100644 --- a/mopidy/config/__init__.py +++ b/mopidy/config/__init__.py @@ -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) diff --git a/tests/config/config_test.py b/tests/config/config_test.py index bb24e3a2..00cb4e83 100644 --- a/tests/config/config_test.py +++ b/tests/config/config_test.py @@ -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')