from unittest import TestCase from xml.etree.ElementTree import XML from galaxy import model from galaxy.util import bunch from galaxy.tools.parameters import basic from galaxy.tools.parameters import dataset_matcher import tools_support from .test_data_parameters import MockHistoryDatasetAssociation class DatasetMatcherTestCase( TestCase, tools_support.UsesApp ): def test_hda_accessible( self ): # Cannot access errored or discard datasets. self.mock_hda.dataset.state = model.Dataset.states.ERROR assert not self.test_context.hda_accessible( self.mock_hda ) self.mock_hda.dataset.state = model.Dataset.states.DISCARDED assert not self.test_context.hda_accessible( self.mock_hda ) # Can access datasets in other states. self.mock_hda.dataset.state = model.Dataset.states.OK assert self.test_context.hda_accessible( self.mock_hda ) self.mock_hda.dataset.state = model.Dataset.states.QUEUED assert self.test_context.hda_accessible( self.mock_hda ) # Cannot access dataset if security agent says no. self.app.security_agent.can_access_dataset = lambda roles, dataset: False assert not self.test_context.hda_accessible( self.mock_hda ) def test_selected( self ): self.test_context.value = [] assert not self.test_context.selected( self.mock_hda ) self.test_context.value = [ self.mock_hda ] assert self.test_context.selected( self.mock_hda ) 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.datatype_matches = False 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.datatype_matches = True 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.datatype_matches = False converted_hda = model.HistoryDatasetAssociation() self.mock_hda.conversion_destination = ( "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.datatype_matches = False self.mock_hda.conversion_destination = ( "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.datatype_matches = False self.mock_hda.conversion_destination = ( "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_value == "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 setUp( self ): self.setup_app() self.mock_hda = MockHistoryDatasetAssociation() self.tool = bunch.Bunch( app=self.app, tool_type="default", ) self.current_user_roles = [] self.other_values = {} # Reset lazily generated stuff self.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 = '''''' param_xml = XML( '''%s''' % option_xml ) self.param = basic.DataToolParameter( self.tool, param_xml, ) self._test_context = dataset_matcher.DatasetMatcher( trans=bunch.Bunch( app=self.app, get_current_user_roles=lambda: self.current_user_roles, workflow_building_mode=True, ), param=self.param, value=[ ], other_values=self.other_values ) return self._test_context