from galaxy import model
from galaxy.app_unittest_utils.tools_support import UsesApp
from galaxy.tools.parameters import (
basic,
dataset_matcher,
)
from galaxy.util import (
bunch,
XML,
)
from galaxy.util.unittest import TestCase
from .test_data_parameters import MockHistoryDatasetAssociation
class MockTool:
def __init__(self, app):
self.app = app
self.tool_type = "default"
self.valid_input_states = model.Dataset.valid_input_states
class TestDatasetMatcher(TestCase, UsesApp):
def test_hda_mismatches(self):
# Datasets not visible are not "valid" for param.
self.mock_hda.visible = False
assert not self.test_context.hda_match(self.mock_hda)
# Datasets that don't match datatype are not valid.
self.mock_hda.visible = True
self.mock_hda.extension = "data"
self.mock_hda.conversion_destination = (False, None, None)
assert not self.test_context.hda_match(self.mock_hda)
def test_valid_hda_direct_match(self):
# Datasets that visible and matching are valid
self.mock_hda.visible = True
self.mock_hda.extension = "txt"
hda_match = self.test_context.hda_match(self.mock_hda, check_implicit_conversions=False)
assert hda_match
# Match is not a conversion and so matching hda is the same hda
# supplied.
assert not hda_match.implicit_conversion
assert hda_match.hda == self.mock_hda
def test_valid_hda_implicit_convered(self):
# Find conversion returns an HDA to an already implicitly converted
# dataset.
self.mock_hda.extension = "data"
converted_hda = model.HistoryDatasetAssociation()
self.mock_hda.conversion_destination = (False, "tabular", converted_hda)
hda_match = self.test_context.hda_match(self.mock_hda)
assert hda_match
assert hda_match.implicit_conversion
assert hda_match.hda == converted_hda
assert hda_match.target_ext == "tabular"
def test_hda_match_implicit_can_convert(self):
# Find conversion returns a target extension to convert to, but not
# a previously implicitly converted dataset.
self.mock_hda.extension = "data"
self.mock_hda.conversion_destination = (False, "tabular", None)
hda_match = self.test_context.hda_match(self.mock_hda)
assert hda_match
assert hda_match.implicit_conversion
assert hda_match.hda == self.mock_hda
assert hda_match.target_ext == "tabular"
def test_hda_match_properly_skips_conversion(self):
self.mock_hda.extension = "data"
self.mock_hda.conversion_destination = (False, "tabular", bunch.Bunch())
hda_match = self.test_context.hda_match(self.mock_hda, check_implicit_conversions=False)
assert not hda_match
def test_data_destination_tools_require_public(self):
self.tool.tool_type = "data_destination"
# Public datasets okay and valid
self.app.security_agent.dataset_is_public = lambda dataset: True
hda_match = self.test_context.hda_match(self.mock_hda)
assert hda_match
# Non-public datasets not valid
self.app.security_agent.dataset_is_public = lambda dataset: False
hda_match = self.test_context.hda_match(self.mock_hda)
assert not hda_match
def test_filtered_hda_matched_key(self):
self.filtered_param = True
data1_val = model.HistoryDatasetAssociation()
data1_val.dbkey = "hg18"
self.other_values = {"data1": data1_val}
assert self.test_context.filter_values == {"hg18"}
# mock_hda is hg19, other is hg18 so should not be "valid hda"
hda_match = self.test_context.hda_match(self.mock_hda)
assert not hda_match
def test_filtered_hda_unmatched_key(self):
self.filtered_param = True
data1_val = model.HistoryDatasetAssociation()
data1_val.dbkey = "hg19"
self.other_values = {"data1": data1_val}
# Other param value and this dataset both hg19, should be valid
hda_match = self.test_context.hda_match(self.mock_hda)
assert hda_match
def test_metadata_filtered_hda_options_filter_attribute_matched_keys(self):
self.metadata_filtered_param = True
data1_val = model.HistoryDatasetAssociation()
self.other_values = {"data1": data1_val}
hda1 = MockHistoryDatasetAssociation()
hda1.metadata = MockMetadata()
hda1.metadata.foo = "bar"
hda2 = MockHistoryDatasetAssociation()
hda2.metadata = MockMetadata()
hda2.metadata.foo = "baz"
assert self.test_context.filter_values == {"baz", "bar"}
hda_match = self.test_context.hda_match(hda1)
assert hda_match
hda_match = self.test_context.hda_match(hda2)
assert hda_match
def test_metadata_filtered_hda_options_filter_attribute_unmatched_key(self):
self.metadata_filtered_param = True
data1_val = model.HistoryDatasetAssociation()
self.other_values = {"data1": data1_val}
hda = MockHistoryDatasetAssociation()
hda.metadata = MockMetadata()
hda.metadata.foo = "no-match"
assert self.test_context.filter_values == {"baz", "bar"}
hda_match = self.test_context.hda_match(hda)
assert not hda_match
def setUp(self):
self.setup_app()
self.mock_hda = MockHistoryDatasetAssociation()
self.tool = MockTool(self.app)
self.current_user_roles = []
self.other_values = {}
# Reset lazily generated stuff
self.filtered_param = False
self.metadata_filtered_param = False
self._test_context = None
self.param = None
@property
def test_context(self):
if self._test_context is None:
option_xml = ""
if self.filtered_param:
option_xml = """"""
if self.metadata_filtered_param:
option_xml = """
"""
param_xml = XML(f"""{option_xml}""")
self.param = basic.DataToolParameter(
self.tool,
param_xml,
)
trans = bunch.Bunch(
app=self.app,
get_current_user_roles=lambda: self.current_user_roles,
workflow_building_mode=True,
)
self._test_context = dataset_matcher.get_dataset_matcher_factory(trans).dataset_matcher(
param=self.param, other_values=self.other_values
)
return self._test_context
class MockMetadata:
def __init__(self):
self.foo = None