mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Improve StrEnum validation error message
Do not print list of possible values as "%r" but simply as a list of quoted values which should make it easier to read for users. Also add a special case when there is just one allowed value. https://fedorahosted.org/freeipa/ticket/2869
This commit is contained in:
@@ -1595,12 +1595,17 @@ class Enum(Param):
|
||||
TYPE_ERROR % (n, self.type, v, type(v))
|
||||
)
|
||||
|
||||
if len(self.values) < 1:
|
||||
raise ValueError(
|
||||
'%s: list of values must not be empty' % self.nice)
|
||||
|
||||
def _rule_values(self, _, value, **kw):
|
||||
if value not in self.values:
|
||||
return _('must be one of %(values)r') % dict(
|
||||
values=self.values,
|
||||
)
|
||||
|
||||
if len(self.values) == 1:
|
||||
return _("must be '%(value)s'") % dict(value=self.values[0])
|
||||
else:
|
||||
values = u', '.join("'%s'" % value for value in self.values)
|
||||
return _('must be one of %(values)s') % dict(values=values)
|
||||
|
||||
class BytesEnum(Enum):
|
||||
"""
|
||||
@@ -1622,7 +1627,7 @@ class StrEnum(Enum):
|
||||
>>> enum.validate(u'Four', 'cli')
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValidationError: invalid 'my_enum': must be one of (u'One', u'Two', u'Three')
|
||||
ValidationError: invalid 'my_enum': must be one of 'One', 'Two', 'Three'
|
||||
"""
|
||||
|
||||
type = unicode
|
||||
|
||||
@@ -1140,6 +1140,12 @@ class test_StrEnum(ClassChecker):
|
||||
"StrEnum('my_enum') values[1]", unicode, 'naughty', str
|
||||
)
|
||||
|
||||
# Test that ValueError is raised when list of values is empty
|
||||
badvalues = tuple()
|
||||
e = raises(ValueError, self.cls, 'empty_enum', values=badvalues)
|
||||
assert_equal(str(e), "StrEnum('empty_enum'): list of values must not "
|
||||
"be empty")
|
||||
|
||||
def test_rules_values(self):
|
||||
"""
|
||||
Test the `ipalib.parameters.StrEnum._rule_values` method.
|
||||
@@ -1147,7 +1153,7 @@ class test_StrEnum(ClassChecker):
|
||||
values = (u'Hello', u'naughty', u'nurse!')
|
||||
o = self.cls('my_enum', values=values)
|
||||
rule = o._rule_values
|
||||
translation = u'values=%(values)s'
|
||||
translation = u"values='Hello', 'naughty', 'nurse!'"
|
||||
dummy = dummy_ugettext(translation)
|
||||
|
||||
# Test with passing values:
|
||||
@@ -1161,7 +1167,22 @@ class test_StrEnum(ClassChecker):
|
||||
rule(dummy, val),
|
||||
translation % dict(values=values),
|
||||
)
|
||||
assert_equal(dummy.message, 'must be one of %(values)r')
|
||||
assert_equal(dummy.message, "must be one of %(values)s")
|
||||
dummy.reset()
|
||||
|
||||
# test a special case when we have just one allowed value
|
||||
values = (u'Hello', )
|
||||
o = self.cls('my_enum', values=values)
|
||||
rule = o._rule_values
|
||||
translation = u"value='Hello'"
|
||||
dummy = dummy_ugettext(translation)
|
||||
|
||||
for val in (u'Howdy', u'quiet', u'library!'):
|
||||
assert_equal(
|
||||
rule(dummy, val),
|
||||
translation % dict(values=values),
|
||||
)
|
||||
assert_equal(dummy.message, "must be '%(value)s'")
|
||||
dummy.reset()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user