""" Test lib/galaxy/visualization/plugins/registry. """ import os import imp import re test_utils = imp.load_source( 'test_utils', os.path.join( os.path.dirname( __file__), os.pardir, os.pardir, 'unittest_utils', 'utility.py' ) ) import galaxy_mock from galaxy import model from galaxy.visualization.plugins.registry import VisualizationsRegistry from galaxy.visualization.plugins import plugin # ----------------------------------------------------------------------------- glx_dir = test_utils.get_galaxy_root() template_cache_dir = os.path.join( glx_dir, 'database', 'compiled_templates' ) addtional_templates_dir = os.path.join( glx_dir, 'config', 'plugins', 'visualizations', 'common', 'templates' ) vis_reg_path = 'config/plugins/visualizations' config1 = """\ HistoryDatasetAssociation tabular.Tabular dataset_id dataset_id """ # ----------------------------------------------------------------------------- class VisualizationsRegistry_TestCase( test_utils.unittest.TestCase ): def test_plugin_load_from_repo( self ): """should attempt load if criteria met""" mock_app = galaxy_mock.MockApp( root=glx_dir ) plugin_mgr = VisualizationsRegistry( mock_app, directories_setting=vis_reg_path, template_cache_dir=None ) expected_plugins_path = os.path.join( glx_dir, vis_reg_path ) self.assertEqual( plugin_mgr.base_url, 'visualizations' ) self.assertItemsEqual( plugin_mgr.directories, [ expected_plugins_path ] ) scatterplot = plugin_mgr.plugins[ 'scatterplot' ] self.assertEqual( scatterplot.name, 'scatterplot' ) self.assertEqual( scatterplot.path, os.path.join( expected_plugins_path, 'scatterplot' ) ) self.assertEqual( scatterplot.base_url, '/'.join([ plugin_mgr.base_url, scatterplot.name ]) ) self.assertTrue( scatterplot.serves_static ) self.assertEqual( scatterplot.static_path, os.path.join( scatterplot.path, 'static' ) ) self.assertEqual( scatterplot.static_url, '/'.join([ scatterplot.base_url, 'static' ]) ) self.assertTrue( scatterplot.serves_templates ) self.assertEqual( scatterplot.template_path, os.path.join( scatterplot.path, 'templates' ) ) self.assertEqual( scatterplot.template_lookup.__class__.__name__, 'TemplateLookup' ) trackster = plugin_mgr.plugins[ 'trackster' ] self.assertEqual( trackster.name, 'trackster' ) self.assertEqual( trackster.path, os.path.join( expected_plugins_path, 'trackster' ) ) self.assertEqual( trackster.base_url, '/'.join([ plugin_mgr.base_url, trackster.name ]) ) self.assertFalse( trackster.serves_static ) self.assertFalse( trackster.serves_templates ) def test_plugin_load( self ): """""" mock_app_dir = galaxy_mock.MockDir({ 'plugins' : { 'vis1' : { 'config' : { 'vis1.xml' : config1 }, 'static' : {}, 'templates' : {}, }, 'vis2' : { 'config' : { 'vis2.xml' : config1 } }, 'not_a_vis1' : { 'config' : { 'vis1.xml' : 'blerbler' }, }, 'not_a_vis1' : { # no config 'static' : {}, 'templates' : {}, }, # empty 'not_a_vis2' : {}, 'not_a_vis3' : 'blerbler', # bad config 'not_a_vis4' : { 'config' : { 'not_a_vis4.xml' : 'blerbler' } }, } }) mock_app = galaxy_mock.MockApp( root=mock_app_dir.root_path ) plugin_mgr = VisualizationsRegistry( mock_app, directories_setting='plugins', template_cache_dir=template_cache_dir ) expected_plugins_path = os.path.join( mock_app_dir.root_path, 'plugins' ) expected_plugin_names = [ 'vis1', 'vis2' ] self.assertEqual( plugin_mgr.base_url, 'visualizations' ) self.assertItemsEqual( plugin_mgr.directories, [ expected_plugins_path ] ) self.assertItemsEqual( plugin_mgr.plugins.keys(), expected_plugin_names ) vis1 = plugin_mgr.plugins[ 'vis1' ] self.assertEqual( vis1.name, 'vis1' ) self.assertEqual( vis1.path, os.path.join( expected_plugins_path, 'vis1' ) ) self.assertEqual( vis1.base_url, '/'.join([ plugin_mgr.base_url, vis1.name ]) ) self.assertTrue( vis1.serves_static ) self.assertEqual( vis1.static_path, os.path.join( vis1.path, 'static' ) ) self.assertEqual( vis1.static_url, '/'.join([ vis1.base_url, 'static' ]) ) self.assertTrue( vis1.serves_templates ) self.assertEqual( vis1.template_path, os.path.join( vis1.path, 'templates' ) ) self.assertEqual( vis1.template_lookup.__class__.__name__, 'TemplateLookup' ) vis2 = plugin_mgr.plugins[ 'vis2' ] self.assertEqual( vis2.name, 'vis2' ) self.assertEqual( vis2.path, os.path.join( expected_plugins_path, 'vis2' ) ) self.assertEqual( vis2.base_url, '/'.join([ plugin_mgr.base_url, vis2.name ]) ) self.assertFalse( vis2.serves_static ) self.assertFalse( vis2.serves_templates ) mock_app_dir.remove() template_cache_dir def test_interactive_environ_plugin_load( self ): """ """ ipython_config = test_utils.clean_multiline_string( """\ HistoryDatasetAssociation tabular.Tabular data.Text dataset_id dataset_id """ ) mock_app_dir = { 'plugins' : { 'ipython' : { 'config' : { 'ipython.xml' : ipython_config }, 'templates' : {} }, }, } # going to use a fake template here to simplify testing ipython_template = "${ ie_request }-${ get_api_key() }" mock_app_dir[ 'plugins' ][ 'ipython' ][ 'templates' ][ 'ipython.mako' ] = ipython_template # so that we don't create a cached version of that fake template in the real mako caches # we'll set up a cache in the temp dir mock_app_dir[ 'caches' ] = {} # and make sure the vis reg uses that mock_app_dir = galaxy_mock.MockDir( mock_app_dir ) mock_app = galaxy_mock.MockApp( root=mock_app_dir.root_path ) plugin_mgr = VisualizationsRegistry( mock_app, directories_setting='plugins', template_cache_dir=os.path.join( mock_app_dir.root_path, 'caches' ) ) # ...then start testing expected_plugins_path = os.path.join( mock_app_dir.root_path, 'plugins' ) expected_plugin_names = [ 'ipython' ] self.assertEqual( plugin_mgr.base_url, 'visualizations' ) self.assertItemsEqual( plugin_mgr.directories, [ expected_plugins_path ] ) self.assertItemsEqual( plugin_mgr.plugins.keys(), expected_plugin_names ) ipython = plugin_mgr.plugins[ 'ipython' ] config = ipython.config self.assertEqual( ipython.name, 'ipython' ) self.assertEqual( config.get( 'plugin_type' ), 'interactive_environment' ) # get_api_key needs a user, fill_template a trans user = model.User( email="blah@bler.blah", password="dockerDockerDOCKER" ) trans = galaxy_mock.MockTrans( user=user ) # use a mock request factory - this will be written into the filled template to show it was used ipython.INTENV_REQUEST_FACTORY = lambda t, p: 'mock' # should return the (new) api key for the above user (see the template above) response = ipython._render( {}, trans=trans ) response.strip() self.assertIsInstance( response, basestring ) self.assertTrue( '-' in response ) ie_request, api_key = response.split( '-' ) self.assertEqual( ie_request, 'mock' ) match = re.match( r'[a-f0-9]{32}', api_key ) self.assertIsNotNone( match ) self.assertEqual( match.span(), ( 0, 32 ) ) mock_app_dir.remove() def test_script_entry( self ): """""" script_entry_config = test_utils.clean_multiline_string( """\ HistoryDatasetAssociation """ ) mock_app_dir = galaxy_mock.MockDir({ 'plugins' : { 'jstest' : { 'config' : { 'jstest.xml' : script_entry_config }, 'static' : {} }, } }) mock_app = galaxy_mock.MockApp( root=mock_app_dir.root_path ) plugin_mgr = VisualizationsRegistry( mock_app, directories_setting='plugins', template_cache_dir=template_cache_dir ) script_entry = plugin_mgr.plugins[ 'jstest' ] self.assertIsInstance( script_entry, plugin.ScriptVisualizationPlugin ) self.assertEqual( script_entry.name, 'jstest' ) self.assertTrue( script_entry.serves_static ) self.assertTrue( script_entry.serves_templates ) self.assertEqual( script_entry.static_path, os.path.join( script_entry.path, 'static' ) ) trans = galaxy_mock.MockTrans() script_entry._set_up_template_plugin( mock_app_dir.root_path, [ addtional_templates_dir ] ) response = script_entry._render( {}, trans=trans, embedded=True ) # print response self.assertTrue( 'src="bler"' in response ) self.assertTrue( 'type="text/javascript"' in response ) self.assertTrue( 'data-main="one"' in response ) mock_app_dir.remove() # ----------------------------------------------------------------------------- # TODO: config parser tests (in separate file) if __name__ == '__main__': test_utils.unittest.main()