from unittest.mock import Mock
import pytest
from galaxy import model
from galaxy.tools.parameters.options import ParameterOption
from galaxy.tools.parameters.workflow_utils import RuntimeValue
from .util import BaseParameterTestCase
class TestSelectToolParameter(BaseParameterTestCase):
def new_hda(self):
hda = model.HistoryDatasetAssociation()
hda._state = model.Dataset.states.OK
return hda
def test_validated_values(self):
self.options_xml = """"""
with pytest.raises(ValueError) as exc_info:
self.param.from_json("42", self.trans, {"input_bam": self.new_hda()})
assert str(exc_info.value) == "Parameter 'my_name': requires a value, but no legal values defined"
def test_validated_values_missing_dependency(self):
self.options_xml = """"""
with pytest.raises(ValueError) as exc_info:
self.param.from_json("42", self.trans)
assert str(exc_info.value) == "Parameter 'my_name': requires a value, but no legal values defined"
def test_unvalidated_values(self):
self.options_xml = """"""
self.trans.workflow_building_mode = True
assert self.param.from_json("42", self.trans) == "42"
def test_validated_datasets(self):
self.options_xml = """"""
with pytest.raises(ValueError) as exc_info:
self.param.from_json(self.new_hda(), self.trans, {"input_bam": None})
assert str(exc_info.value) == "Parameter 'my_name': requires a value, but no legal values defined"
def test_unvalidated_datasets(self):
self.options_xml = """"""
self.trans.workflow_building_mode = True
assert isinstance(
self.param.from_json(self.new_hda(), self.trans, {"input_bam": RuntimeValue()}),
model.HistoryDatasetAssociation,
)
def test_filter_param_value(self):
self.options_xml = """"""
assert ParameterOption("testname1", "testpath1", False) in self.param.get_options(
self.trans, {"input_bam": "testname1"}
)
assert ParameterOption("testname2", "testpath2", False) in self.param.get_options(
self.trans, {"input_bam": "testname2"}
)
assert len(self.param.get_options(self.trans, {"input_bam": "testname3"})) == 0
def test_filter_param_value2(self):
# Same test as above, but filtering on a different column.
self.options_xml = """"""
assert ParameterOption("testname1", "testpath1", False) in self.param.get_options(
self.trans, {"input_bam": "testpath1"}
)
assert ParameterOption("testname2", "testpath2", False) in self.param.get_options(
self.trans, {"input_bam": "testpath2"}
)
assert len(self.param.get_options(self.trans, {"input_bam": "testpath3"})) == 0
# TODO: Good deal of overlap here with TestDataToolParameter, refactor.
def setUp(self):
super().setUp()
self.test_history = model.History()
session = self.app.model.context
session.add(self.test_history)
session.commit()
self.app.tool_data_tables["test_table"] = MockToolDataTable()
self.trans = Mock(
app=self.app,
get_history=lambda: self.test_history,
get_current_user_roles=lambda: [],
workflow_building_mode=False,
webapp=Mock(name="galaxy"),
user=None,
)
self.type = "select"
self.set_data_ref = False
self.multiple = False
self.optional = False
self.options_xml = ""
self._param = None
@property
def param(self):
if not self._param:
multi_text = ""
if self.multiple:
multi_text = 'multiple="True"'
optional_text = ""
if self.optional:
optional_text = 'optional="True"'
options_text = self.options_xml
data_ref_text = ""
if self.set_data_ref:
data_ref_text = 'data_ref="input_bam"'
param_str = f"""{options_text}"""
self._param = self._parameter_for(xml=param_str)
return self._param
class MockToolDataTable:
def __init__(self):
self.columns = dict(
name=0,
value=1,
)
self.missing_index_file = None
def get_fields(self):
return [["testname1", "testpath1"], ["testname2", "testpath2"]]