diff --git a/lib/galaxy/tools/wrappers.py b/lib/galaxy/tools/wrappers.py
index 3f1b3eabf85..2d02f791347 100644
--- a/lib/galaxy/tools/wrappers.py
+++ b/lib/galaxy/tools/wrappers.py
@@ -77,8 +77,11 @@ class InputValueWrapper(ToolParameterValueWrapper):
if self.input.type == 'boolean' and isinstance(other, string_types):
return str(self)
# For backward compatibility, allow `$wrapper != ""` for optional non-text param
- if self.input.optional and self.value is None and isinstance(other, string_types):
- return str(self)
+ if self.input.optional and self.value is None:
+ if isinstance(other, string_types):
+ return str(self)
+ else:
+ return None
cast = {
'text': str,
'integer': int,
diff --git a/test/unit/tools/test_wrappers.py b/test/unit/tools/test_wrappers.py
index 105f31e0e8e..b57030b805b 100644
--- a/test/unit/tools/test_wrappers.py
+++ b/test/unit/tools/test_wrappers.py
@@ -109,15 +109,19 @@ def test_raw_object_wrapper():
assert not false_wrapper
-def valuewrapper(tool, value, paramtype):
+def valuewrapper(tool, value, paramtype, optional=False):
if paramtype == "integer":
- parameter = IntegerToolParameter(tool, XML(''))
+ optional = 'optional="true"' if optional else 'value="10"'
+ parameter = IntegerToolParameter(tool, XML('' % optional))
elif paramtype == "text":
- parameter = TextToolParameter(tool, XML(''))
+ optional = 'optional="true"' if optional else 'value="foo"'
+ parameter = TextToolParameter(tool, XML('' % optional))
elif paramtype == "float":
- parameter = FloatToolParameter(tool, XML(''))
+ optional = 'optional="true"' if optional else 'value="10.0"'
+ parameter = FloatToolParameter(tool, XML('' % optional))
elif paramtype == "boolean":
- parameter = BooleanToolParameter(tool, XML(''))
+ optional = 'optional="true"' if optional else 'value=""'
+ parameter = BooleanToolParameter(tool, XML('' % optional))
return InputValueWrapper(parameter, value)
@@ -144,19 +148,24 @@ def test_input_value_wrapper_comparison(tool):
@with_mock_tool
def test_input_value_wrapper_comparison_optional(tool):
- parameter = IntegerToolParameter(tool, XML(''))
- wrapper = InputValueWrapper(parameter, None)
+ wrapper = valuewrapper(tool, None, 'integer', optional=True)
assert not wrapper
with pytest.raises(ValueError):
int(wrapper)
assert str(wrapper) == ""
assert wrapper == "" # for backward-compatibility
- parameter = IntegerToolParameter(tool, XML(''))
- wrapper = InputValueWrapper(parameter, 0)
+ wrapper = valuewrapper(tool, 0, 'integer', optional=True)
assert wrapper == 0
assert int(wrapper) == 0
assert str(wrapper)
assert wrapper != "" # for backward-compatibility, the correct way to check if an optional integer param is not empty is to use str(wrapper)
+ wrapper = valuewrapper(tool, None, 'integer', optional=True)
+ assert wrapper != 1
+ assert str(wrapper) == ""
+ assert wrapper == None # noqa: E711
+ wrapper = valuewrapper(tool, None, "boolean")
+ assert bool(wrapper) is False, wrapper
+ assert str(wrapper) == 'falsevalue'
@with_mock_tool