summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/parameters.py15
-rw-r--r--tests/test_ipalib/test_parameters.py25
2 files changed, 33 insertions, 7 deletions
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index 53756a80a..b3a75f288 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -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
diff --git a/tests/test_ipalib/test_parameters.py b/tests/test_ipalib/test_parameters.py
index 0b6fae375..e6ac91db7 100644
--- a/tests/test_ipalib/test_parameters.py
+++ b/tests/test_ipalib/test_parameters.py
@@ -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()