import logging
from typing import (
    Any,
    Optional,
)
import pytest
from galaxy.tool_util.verify.test_data import TestDataResolver
from galaxy.util.unittest import TestCase
from galaxy_test.base.env import (
    GalaxyTarget,
    setup_keep_outdir,
    target_url_parts,
)
log = logging.getLogger(__name__)
[docs]
def host_port_and_url(test_driver: Optional[Any]) -> GalaxyTarget:
    host, port, url = target_url_parts()
    server_wrapper = test_driver and test_driver.server_wrappers and test_driver.server_wrappers[0]
    if server_wrapper:
        host = server_wrapper.host
        port = server_wrapper.port
        url = f"http://{host}:{port}{server_wrapper.prefix.rstrip('/')}/"
    return host, port, url 
[docs]
@pytest.mark.usefixtures("embedded_driver")
class FunctionalTestCase(TestCase):
    """Base class for tests targetting actual Galaxy servers.
    Subclass should override galaxy_driver_class if a Galaxy server
    needs to be launched to run the test, this base class assumes a
    server is already running.
    """
    galaxy_driver_class: Optional[type] = None
    host: str
    port: Optional[str]
    url: str
    keepOutdir: str
    test_data_resolver: TestDataResolver
    _test_driver: Optional[Any]
[docs]
    def setUp(self) -> None:
        self.host, self.port, self.url = host_port_and_url(self._test_driver)
        self.test_data_resolver = TestDataResolver()
        self.keepOutdir = setup_keep_outdir() 
[docs]
    @classmethod
    def setUpClass(cls):
        """Configure and start Galaxy for a test."""
        pass 
[docs]
    @classmethod
    def tearDownClass(cls):
        """Shutdown Galaxy server and cleanup temp directory."""
        pass 
[docs]
    def get_filename(self, filename: str) -> str:
        # No longer used by tool tests - drop if isn't used else where.
        return self.test_data_resolver.get_filename(filename)