Files
galaxy/lib/tool_shed/test/base

Test Infrastructure

Base classes and utilities for Tool Shed functional tests.

Components

base/
├── driver.py             # ToolShedTestDriver - embedded server setup
├── testcase.py           # ShedTestCase - main test base class
├── playwrighttestcase.py # PlaywrightTestCase - browser test base
├── playwrightbrowser.py  # PlaywrightShedBrowser - browser abstraction
├── browser.py            # ShedBrowser protocol
├── populators.py         # ToolShedPopulator - API fixture creation
├── api.py                # ShedApiTestCase - API test base
├── api_util.py           # API interaction utilities
└── test_db_util.py       # Direct database access

Base Classes

ShedTestCase

Main test base class with repository/category management:

class TestFeature(ShedTestCase):
    def test_repo_creation(self):
        category = self.create_category(name="Tools")
        repo = self.get_or_create_repository(
            name="mytool",
            category=category,
            strings_displayed=["created"],
        )
        self.upload_file(repo, "mytool.tar")

Key methods:

  • create_category() - Create test category
  • get_or_create_repository() - Create repository with category
  • upload_file() / commit_tar_to_repository() - Upload content
  • reset_metadata_on_repository() - Reset repository metadata
  • verify_installed_repository() - Check Galaxy installation

PlaywrightTestCase

For browser UI tests:

class TestUI(PlaywrightTestCase):
    def test_navigation(self):
        self.visit_url("/")
        page = self._page  # Playwright Page object
        page.click(".nav-link")
        self.screenshot("after_click")  # Optional screenshot

Properties:

  • _page - Playwright Page instance
  • _playwright_browser - PlaywrightShedBrowser wrapper

ShedApiTestCase

Pure API tests without browser:

class TestApi(ShedApiTestCase):
    def test_endpoint(self):
        response = self._get("repositories")
        assert response.status_code == 200

ToolShedPopulator

API-based fixture creation (in populators.py):

populator = ToolShedPopulator(admin_interactor, user_interactor)

# Create category
category = populator.new_category("Test Category")

# Create and populate repository
repo = populator.new_repository(category_id=category.id)
populator.upload_revision(repo, "column_maker")  # From test_data/repos/

# Setup predefined repos
populator.setup_column_maker_repo()
populator.setup_bismark_repo()

Upload Methods

# Upload from test_data/repos/ directory
populator.upload_revision(repo, "column_maker")

# Upload specific tar file
populator.upload_tar(repo, path_to_tar)

# Upload multiple revisions
for revision in ["1", "2", "3"]:
    populator.upload_revision(repo, f"column_maker/{revision}")

Browser Abstractions

ShedBrowser Protocol

Common interface for browser implementations:

class ShedBrowser(Protocol):
    def visit_url(self, url: str) -> None: ...
    def check_page_for_string(self, string: str) -> None: ...
    def submit_form(self, button: str, **kwd) -> None: ...

PlaywrightShedBrowser

Modern browser with Playwright:

browser = PlaywrightShedBrowser(page)
browser.visit_url("/")
browser.logout_if_logged_in()
browser.expect_logged_in()

Locators available via Locators class:

  • Locators.toolbar_login
  • Locators.login_submit_button
  • Locators.register_link

Test Driver

ToolShedTestDriver sets up embedded shed server:

# Usually handled by conftest.py fixture
driver = ToolShedTestDriver()
driver.setup()  # Starts embedded server
# ... run tests ...
driver.tear_down()

The embedded_driver fixture in conftest.py manages this automatically.

Database Utilities

Direct database access via test_db_util.py:

from tool_shed.test.base import test_db_util

# Get repository by name
repo = test_db_util.get_repository_by_name("myrepo")

# Get user
user = test_db_util.get_user("test@example.org")

Use sparingly - prefer API-based approaches via populators.