2015-07-01 17:18:31 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# pylint: disable=function-redefined
|
2015-07-02 09:10:25 +00:00
|
|
|
# TODO: Remove the following PyLint disable as soon as we support YAML and RST rendering
|
|
|
|
# pylint: disable=abstract-method
|
2015-07-01 17:18:31 +00:00
|
|
|
|
|
|
|
# Import python libs
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
|
|
|
# Import Salt Testing Libs
|
|
|
|
from salttesting import TestCase, skipIf
|
|
|
|
from salttesting.helpers import ensure_in_syspath
|
|
|
|
|
|
|
|
ensure_in_syspath('../../')
|
|
|
|
|
|
|
|
# Import Salt Libs
|
|
|
|
from salt.utils import config
|
|
|
|
|
|
|
|
# Import 3rd-party libs
|
|
|
|
try:
|
|
|
|
import jsonschema
|
|
|
|
import jsonschema.exceptions
|
|
|
|
HAS_JSONSCHEMA = True
|
|
|
|
except ImportError:
|
|
|
|
HAS_JSONSCHEMA = False
|
|
|
|
|
|
|
|
|
|
|
|
# pylint: disable=unused-import
|
|
|
|
try:
|
|
|
|
import rfc3987
|
|
|
|
HAS_RFC3987 = True
|
|
|
|
except ImportError:
|
|
|
|
HAS_RFC3987 = False
|
|
|
|
|
|
|
|
try:
|
|
|
|
import strict_rfc3339
|
|
|
|
HAS_STRICT_RFC3339 = True
|
|
|
|
except ImportError:
|
|
|
|
HAS_STRICT_RFC3339 = False
|
|
|
|
|
|
|
|
try:
|
|
|
|
import isodate
|
|
|
|
HAS_ISODATE = True
|
|
|
|
except ImportError:
|
|
|
|
HAS_ISODATE = False
|
|
|
|
# pylint: enable=unused-import
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigTestCase(TestCase):
|
|
|
|
'''
|
|
|
|
TestCase for salt.utils.config module
|
|
|
|
'''
|
|
|
|
|
|
|
|
def test_boolean_config(self):
|
|
|
|
item = config.BooleanConfig(title='Hungry', description='Are you hungry?')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'boolean',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.BooleanConfig(title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
default=False)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'boolean',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'default': item.default
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-02 13:44:17 +00:00
|
|
|
item = config.BooleanConfig(title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
default=config.Null)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'boolean',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'default': None
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-01 17:18:31 +00:00
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_boolean_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.BooleanConfig(title='Hungry', description='Are you hungry?')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': False}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 1}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_string_config(self):
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item', min_length=1, max_length=3)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minLength': item.min_length,
|
|
|
|
'maxLength': item.max_length
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
min_length=1,
|
|
|
|
max_length=3,
|
|
|
|
default='foo')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minLength': item.min_length,
|
|
|
|
'maxLength': item.max_length,
|
|
|
|
'default': 'foo'
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
min_length=1,
|
|
|
|
max_length=3,
|
|
|
|
enum=('foo', 'bar'))
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minLength': item.min_length,
|
|
|
|
'maxLength': item.max_length,
|
|
|
|
'enum': ['foo', 'bar']
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-03 15:40:48 +00:00
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
min_length=1,
|
|
|
|
max_length=3,
|
|
|
|
enum=('foo', 'bar'),
|
|
|
|
enumNames=('Foo', 'Bar'))
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minLength': item.min_length,
|
|
|
|
'maxLength': item.max_length,
|
|
|
|
'enum': ['foo', 'bar'],
|
|
|
|
'enumNames': ['Foo', 'Bar']
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-02 09:08:08 +00:00
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
pattern=r'^([\w_-]+)$')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'pattern': item.pattern
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-01 17:18:31 +00:00
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_string_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'the item'}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item',
|
|
|
|
min_length=1, max_length=10)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'the item'}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 'the item the item'}, TestConf.serialize())
|
|
|
|
self.assertIn('is too long', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item',
|
|
|
|
min_length=10, max_length=100)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 'the item'}, TestConf.serialize())
|
|
|
|
self.assertIn('is too short', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=('foo', 'bar'))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'foo'}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=('foo', 'bar'))
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 'bin'}, TestConf.serialize())
|
|
|
|
self.assertIn('is not one of', excinfo.exception.message)
|
|
|
|
|
2015-07-02 09:08:08 +00:00
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.StringConfig(title='Foo', description='Foo Item',
|
|
|
|
pattern=r'^([\w_-]+)$')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'the-item'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 'the item'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('does not match', excinfo.exception.message)
|
|
|
|
|
2015-07-01 17:18:31 +00:00
|
|
|
def test_email_config(self):
|
|
|
|
item = config.EMailConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_email_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.EMailConfig(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'nobody@nowhere.com'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_ipv4_config(self):
|
|
|
|
item = config.IPv4Config(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_ipv4_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IPv4Config(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': '127.0.0.1'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_ipv6_config(self):
|
|
|
|
item = config.IPv6Config(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_ipv6_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IPv6Config(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': '::1'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_hostname_config(self):
|
|
|
|
item = config.HostnameConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_hostname_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.HostnameConfig(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'localhost'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_datetime_config(self):
|
|
|
|
item = config.DateTimeConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
@skipIf(any([HAS_ISODATE, HAS_STRICT_RFC3339]) is False, 'The \'strict_rfc3339\' or \'isodate\' library is missing')
|
|
|
|
def test_datetime_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.DateTimeConfig(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': '2015-07-01T18:05:27+01:00'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_secret_config(self):
|
|
|
|
item = config.SecretConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_uri_config(self):
|
|
|
|
item = config.UriConfig(title='Foo', description='Foo Item')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'string',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'format': item.format
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
@skipIf(HAS_RFC3987 is False, 'The \'rfc3987\' library is missing')
|
|
|
|
def test_uri_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.UriConfig(title='Item', description='Item description')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 'ssh://localhost'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not a', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_number_config(self):
|
|
|
|
item = config.NumberConfig(title='How many dogs', description='Question')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
multiple_of=2)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'multipleOf': item.multiple_of
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
exclusive_minimum=True,
|
|
|
|
maximum=10,
|
|
|
|
exclusive_maximum=True)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'exclusiveMinimum': True,
|
|
|
|
'exclusiveMaximum': True
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10,
|
|
|
|
default=0)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'default': 0
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10,
|
|
|
|
default=0,
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'number',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'default': 0,
|
|
|
|
'enum': [0, 2, 4, 6]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_number_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='How many dogs', description='Question')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 2}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': '3'}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
multiple_of=2.2)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 4.4}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 4}, TestConf.serialize())
|
|
|
|
self.assertIn('is not a multiple of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='Foo', description='Foo Item',
|
|
|
|
minimum=1, maximum=10)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 11}, TestConf.serialize())
|
|
|
|
self.assertIn('is greater than the maximum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='Foo', description='Foo Item',
|
|
|
|
minimum=10, maximum=100)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is less than the minimum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
exclusive_minimum=True,
|
|
|
|
maximum=10,
|
|
|
|
exclusive_maximum=True)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 0}, TestConf.serialize())
|
|
|
|
self.assertIn('is less than or equal to the minimum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 10}, TestConf.serialize())
|
|
|
|
self.assertIn('is greater than or equal to the maximum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 4}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.NumberConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is not one of', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_integer_config(self):
|
|
|
|
item = config.IntegerConfig(title='How many dogs', description='Question')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
multiple_of=2)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'multipleOf': item.multiple_of
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
exclusive_minimum=True,
|
|
|
|
maximum=10,
|
|
|
|
exclusive_maximum=True)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'exclusiveMinimum': True,
|
|
|
|
'exclusiveMaximum': True
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10,
|
|
|
|
default=0)
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'default': 0
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
maximum=10,
|
|
|
|
default=0,
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'integer',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minimum': item.minimum,
|
|
|
|
'maximum': item.maximum,
|
|
|
|
'default': 0,
|
|
|
|
'enum': [0, 2, 4, 6]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_integer_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='How many dogs', description='Question')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 2}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3.1}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
multiple_of=2)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 4}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is not a multiple of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='Foo', description='Foo Item',
|
|
|
|
minimum=1, maximum=10)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 11}, TestConf.serialize())
|
|
|
|
self.assertIn('is greater than the maximum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='Foo', description='Foo Item',
|
|
|
|
minimum=10, maximum=100)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is less than the minimum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='How many dogs',
|
|
|
|
description='Question',
|
|
|
|
minimum=0,
|
|
|
|
exclusive_minimum=True,
|
|
|
|
maximum=10,
|
|
|
|
exclusive_maximum=True)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 0}, TestConf.serialize())
|
|
|
|
self.assertIn('is less than or equal to the minimum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 10}, TestConf.serialize())
|
|
|
|
self.assertIn('is greater than or equal to the maximum of', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': 4}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='Foo',
|
|
|
|
description='Foo Item',
|
|
|
|
enum=(0, 2, 4, 6))
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 3}, TestConf.serialize())
|
|
|
|
self.assertIn('is not one of', excinfo.exception.message)
|
|
|
|
|
2015-07-02 13:37:25 +00:00
|
|
|
def test_array_config(self):
|
|
|
|
item = config.ArrayConfig(title='Dog Names', description='Name your dogs')
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
string_item = config.StringConfig(title='Dog Name',
|
|
|
|
description='The dog name')
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=string_item)
|
|
|
|
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'items': {
|
|
|
|
'type': 'string',
|
|
|
|
'title': string_item.title,
|
|
|
|
'description': string_item.description
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
integer_item = config.IntegerConfig(title='Dog Age',
|
|
|
|
description='The dog age')
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=(string_item, integer_item))
|
|
|
|
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'items': [
|
|
|
|
{
|
|
|
|
'type': 'string',
|
|
|
|
'title': string_item.title,
|
|
|
|
'description': string_item.description
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'type': 'integer',
|
|
|
|
'title': integer_item.title,
|
|
|
|
'description': integer_item.description
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=(config.StringConfig(),
|
|
|
|
config.IntegerConfig()),
|
|
|
|
min_items=1,
|
|
|
|
max_items=3,
|
|
|
|
additional_items=False,
|
|
|
|
unique_items=True)
|
|
|
|
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'minItems': item.min_items,
|
|
|
|
'maxItems': item.max_items,
|
|
|
|
'uniqueItems': item.unique_items,
|
|
|
|
'additionalItems': item.additional_items,
|
|
|
|
'items': [
|
|
|
|
{
|
|
|
|
'type': 'string',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'type': 'integer',
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-02 14:04:15 +00:00
|
|
|
class HowManyConfig(config.Configuration):
|
|
|
|
item = config.IntegerConfig(title='How many dogs', description='Question')
|
|
|
|
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=HowManyConfig())
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'items': HowManyConfig.serialize()
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
class AgesConfig(config.Configuration):
|
|
|
|
item = config.IntegerConfig()
|
|
|
|
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=(HowManyConfig(), AgesConfig()))
|
|
|
|
self.assertDictEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'type': 'array',
|
|
|
|
'title': item.title,
|
|
|
|
'description': item.description,
|
|
|
|
'items': [
|
|
|
|
HowManyConfig.serialize(),
|
|
|
|
AgesConfig.serialize()
|
|
|
|
]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2015-07-02 13:37:25 +00:00
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_array_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(title='Dog Names', description='Name your dogs')
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 1}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=config.StringConfig())
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar', 3]}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
min_items=1,
|
|
|
|
max_items=2)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar', 'Pepe']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is too long', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': []}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is too short', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(title='Dog Names',
|
|
|
|
description='Name your dogs',
|
|
|
|
items=config.StringConfig(),
|
|
|
|
uniqueItems=True)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Tobias']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('has non-unique elements', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(items=(config.StringConfig(),
|
|
|
|
config.IntegerConfig()))
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Óscar', 4]}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['Tobias', 'Óscar']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(
|
|
|
|
items=config.ArrayConfig(
|
|
|
|
items=(config.StringConfig(),
|
|
|
|
config.IntegerConfig())
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': [['Tobias', 8], ['Óscar', 4]]}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': [['Tobias', 8], ['Óscar', '4']]}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(items=config.StringConfig(enum=['Tobias', 'Óscar']))
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Óscar']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['Tobias']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['Pepe']}, TestConf.serialize(),
|
|
|
|
format_checker=jsonschema.FormatChecker())
|
|
|
|
self.assertIn('is not one of', excinfo.exception.message)
|
|
|
|
|
2015-07-03 15:24:46 +00:00
|
|
|
def test_oneof_config(self):
|
|
|
|
item = config.OneOfConfig(
|
|
|
|
items=(config.StringConfig(title='Yes', enum=['yes']),
|
|
|
|
config.StringConfig(title='No', enum=['no']))
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'oneOf': [i.serialize() for i in item.items]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_oneof_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(
|
|
|
|
title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
items=config.OneOfConfig(
|
|
|
|
items=(config.StringConfig(title='Yes', enum=['yes']),
|
|
|
|
config.StringConfig(title='No', enum=['no']))
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['no']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['maybe']}, TestConf.serialize())
|
|
|
|
self.assertIn('is not valid under any of the given schemas', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 2}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_anyof_config(self):
|
|
|
|
item = config.AnyOfConfig(
|
|
|
|
items=(config.StringConfig(title='Yes', enum=['yes']),
|
|
|
|
config.StringConfig(title='No', enum=['no']))
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'anyOf': [i.serialize() for i in item.items]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_anyof_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(
|
|
|
|
title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
items=config.AnyOfConfig(
|
|
|
|
items=(config.StringConfig(title='Yes', enum=['yes']),
|
|
|
|
config.StringConfig(title='No', enum=['no']),
|
|
|
|
config.BooleanConfig())
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['no']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['yes']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': [True]}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': [False]}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['maybe']}, TestConf.serialize())
|
|
|
|
self.assertIn('is not valid under any of the given schemas', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 2}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_allof_config(self):
|
|
|
|
item = config.AllOfConfig(
|
|
|
|
items=(config.StringConfig(min_length=2),
|
|
|
|
config.StringConfig(max_length=3))
|
|
|
|
)
|
|
|
|
self.assertEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'allOf': [i.serialize() for i in item.items]
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_allof_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(
|
|
|
|
title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
items=config.AllOfConfig(
|
|
|
|
items=(config.StringConfig(min_length=2),
|
|
|
|
config.StringConfig(max_length=3))
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['no']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['yes']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['maybe']}, TestConf.serialize())
|
|
|
|
self.assertIn('is too long', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': ['hmmmm']}, TestConf.serialize())
|
|
|
|
self.assertIn('is too long', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': 2}, TestConf.serialize())
|
|
|
|
self.assertIn('is not of type', excinfo.exception.message)
|
|
|
|
|
|
|
|
def test_not_config(self):
|
|
|
|
item = config.NotConfig(item=config.BooleanConfig())
|
|
|
|
self.assertEqual(
|
|
|
|
item.serialize(), {
|
|
|
|
'not': item.item.serialize()
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
@skipIf(HAS_JSONSCHEMA is False, 'The \'jsonschema\' library is missing')
|
|
|
|
def test_not_config_validation(self):
|
|
|
|
class TestConf(config.Configuration):
|
|
|
|
item = config.ArrayConfig(
|
|
|
|
title='Hungry',
|
|
|
|
description='Are you hungry?',
|
|
|
|
items=config.NotConfig(item=config.BooleanConfig())
|
|
|
|
)
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['no']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
try:
|
|
|
|
jsonschema.validate({'item': ['yes']}, TestConf.serialize())
|
|
|
|
except jsonschema.exceptions.ValidationError as exc:
|
|
|
|
self.fail('ValidationError raised: {0}'.format(exc))
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': [True]}, TestConf.serialize())
|
|
|
|
self.assertIn('is not allowed for', excinfo.exception.message)
|
|
|
|
|
|
|
|
with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
|
|
|
|
jsonschema.validate({'item': [False]}, TestConf.serialize())
|
|
|
|
self.assertIn('is not allowed for', excinfo.exception.message)
|
|
|
|
|
2015-07-01 17:18:31 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from integration import run_tests
|
|
|
|
run_tests(ConfigTestCase, needs_daemon=False)
|