Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy_test.selenium.test_tool_form
import json
import pytest
from galaxy.model.unittest_utils.store_fixtures import one_hda_model_store_dict
from galaxy.selenium.navigates_galaxy import retry_call_during_transitions
from galaxy_test.base import rules_test_data
from galaxy_test.base.populators import (
flakey,
skip_if_github_down,
stage_rules_example,
)
from .framework import (
managed_history,
retry_assertion_during_transitions,
selenium_test,
SeleniumTestCase,
UsesHistoryItemAssertions,
)
[docs]class ToolFormTestCase(SeleniumTestCase, UsesHistoryItemAssertions):
[docs] @selenium_test
def test_run_tool_verify_contents_by_peek(self):
self._run_environment_test_tool()
self.history_panel_wait_for_hid_ok(1)
self.history_panel_click_item_title(hid=1)
self.assert_item_peek_includes(1, "42")
[docs] @selenium_test
def test_run_tool_verify_dataset_details(self):
self._run_environment_test_tool()
self.history_panel_wait_for_hid_ok(1)
self._check_dataset_details_for_inttest_value(1)
[docs] @selenium_test
def test_verify_dataset_details_tables(self):
self._run_environment_test_tool()
self.history_panel_wait_for_hid_ok(1)
hda = self.latest_history_item()
self._check_dataset_details_for_inttest_value(1)
dataset_details_key_value_pairs = self._table_to_key_value_elements("table#dataset-details")
number_found = name_found = format_found = False
for key, value in dataset_details_key_value_pairs:
if "Number" in key.text:
assert str(hda["hid"]) in value.text
number_found = True
if "Name" in key.text:
assert hda["name"] in value.text
name_found = True
if "Format" in key.text:
assert hda["extension"] in value.text
format_found = True
assert number_found
assert name_found
assert format_found
job_outputs = self._table_to_key_value_elements("table#job-outputs")
assert job_outputs[0][0].text == "environment_variables"
generic_item = job_outputs[0][1]
assert "1 : environment_variables" in generic_item.text
generic_item.click()
self.sleep_for(self.wait_types.UX_RENDER)
assert generic_item.find_element_by_css_selector("pre").text == "42\nmoo\nNOTTHREE"
generic_item.find_element_by_css_selector("[title='Run Job Again']").click()
self.components.tool_form.execute.wait_for_visible()
def _table_to_key_value_elements(self, table_selector):
tool_parameters_table = self.wait_for_selector_visible(table_selector)
tbody_element = tool_parameters_table.find_element_by_css_selector("tbody")
trs = tbody_element.find_elements_by_css_selector("tr")
assert trs
key_value_pairs = []
for tr in trs:
tds = tr.find_elements_by_css_selector("td")
assert tds
key_value_pairs.append((tds[0], tds[1]))
return key_value_pairs
[docs] @selenium_test
def test_rerun(self):
self._run_environment_test_tool()
self.history_panel_wait_for_hid_ok(1)
self.hda_click_primary_action_button(1, "rerun")
def check_recorded_val():
inttest_div_element = self.tool_parameter_div("inttest")
inttest_input_element = inttest_div_element.find_element_by_css_selector("input")
recorded_val = inttest_input_element.get_attribute("value")
# Assert form re-rendered with correct value in textbox.
assert recorded_val == "42", recorded_val
# These form entries seem to be replaced/updated occasionally
# causing stale elements.
retry_call_during_transitions(check_recorded_val)
self.tool_form_execute()
self.history_panel_wait_for_hid_ok(2)
self._check_dataset_details_for_inttest_value(2)
[docs] @selenium_test
@flakey
def test_run_data(self):
test_path = self.get_filename("1.fasta")
test_path_decoy = self.get_filename("1.txt")
# Upload form posts bad data if executed two times in a row like this, so
# wait between uploads. xref https://github.com/galaxyproject/galaxy/issues/5169
self.perform_upload(test_path)
self.history_panel_wait_for_hid_ok(1)
self.perform_upload(test_path_decoy)
self.history_panel_wait_for_hid_ok(2)
self.home()
self.tool_open("head")
self.tool_set_value("input", "1.fasta", expected_type="data")
self.screenshot("tool_form_simple_data")
self.tool_form_execute()
self.history_panel_wait_for_hid_ok(3)
latest_hda = self.latest_history_item()
assert latest_hda["hid"] == 3
assert latest_hda["name"] == "Select first on data 1"
[docs] @selenium_test
def test_bibtex_rendering(self):
self.home()
# prefetch citations so they will be available quickly when rendering tool form.
citations_api = self.api_get("tools/bibtex/citations")
citation_count = len(citations_api)
self.tool_open("bibtex")
self.components.tool_form.about.wait_for_and_click()
@retry_assertion_during_transitions
def assert_citations_visible():
references = self.components.tool_form.reference.all()
references_rendered = len(references)
if references_rendered != citation_count:
citations_api = self.api_get("tools/bibtex/citations")
current_citation_count = len(citations_api)
message = f"Expected {citation_count} references to be rendered, {references_rendered} actually rendered. Currently the API yields {current_citation_count} references"
raise AssertionError(message)
return references
references = assert_citations_visible()
doi_resolved_citation = references[0]
assert "platform for interactive" in doi_resolved_citation.text
self.screenshot("tool_form_citations_formatted")
def _check_dataset_details_for_inttest_value(self, hid, expected_value="42"):
self.hda_click_details(hid)
self.components.dataset_details._.wait_for_visible()
tool_parameters_table = self.components.dataset_details.tool_parameters.wait_for_visible()
tbody_element = tool_parameters_table.find_element_by_css_selector("tbody")
tds = tbody_element.find_elements_by_css_selector("td")
assert tds
assert any(expected_value in td.text for td in tds)
def _run_environment_test_tool(self, inttest_value="42"):
self.home()
self.tool_open("environment_variables")
self.tool_set_value("inttest", inttest_value)
self.tool_form_execute()
[docs]class LoggedInToolFormTestCase(SeleniumTestCase):
ensure_registered = True
[docs] @selenium_test
def test_dataset_state_filtering(self):
# upload an ok (HID 1) and a discarded (HID 2) dataset and run a tool
# normally HID 2 would be selected but since it is discarded - it won't
# be an option so verify the result was run with HID 1.
test_path = self.get_filename("1.fasta")
self.perform_upload(test_path)
self.history_panel_wait_for_hid_ok(1)
history_id = self.current_history_id()
self.dataset_populator.create_contents_from_store(
history_id,
store_dict=one_hda_model_store_dict(include_source=False),
)
self.home()
self.tool_open("head")
self.components.tool_form.execute.wait_for_visible()
self.screenshot("tool_form_with_filtered_discarded_input")
self.tool_form_execute()
self.history_panel_wait_for_hid_ok(3)
latest_hda = self.latest_history_item()
assert latest_hda["hid"] == 3
assert latest_hda["name"] == "Select first on data 1"
[docs] @selenium_test
def test_run_apply_rules_1(self):
self._apply_rules_and_check(rules_test_data.EXAMPLE_1)
self.screenshot("tool_apply_rules_example_1_final")
[docs] @selenium_test
def test_run_apply_rules_2(self):
self._apply_rules_and_check(rules_test_data.EXAMPLE_2)
self.screenshot("tool_apply_rules_example_2_final")
[docs] @selenium_test
def test_run_apply_rules_3(self):
self._apply_rules_and_check(rules_test_data.EXAMPLE_3)
self.screenshot("tool_apply_rules_example_3_final")
[docs] @selenium_test
def test_run_apply_rules_4(self):
self._apply_rules_and_check(rules_test_data.EXAMPLE_4)
self.screenshot("tool_apply_rules_example_4_final")
[docs] @selenium_test
@managed_history
@skip_if_github_down
@pytest.mark.gtn_screenshot
@pytest.mark.local
def test_run_apply_rules_tutorial(self):
self.home()
self.upload_rule_start()
self.upload_rule_set_data_type("Collection")
self.components.upload.rule_source_content.wait_for_and_send_keys(
"""https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/treated1fb.txt treated_single_1
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/treated2fb.txt treated_paired_2
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/treated3fb.txt treated_paired_3
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/untreated1fb.txt untreated_single_4
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/untreated2fb.txt untreated_single_5
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/untreated3fb.txt untreated_paired_6
https://raw.githubusercontent.com/jmchilton/galaxy/apply_rules_tutorials/test-data/rules/untreated4fb.txt untreated_paired_7
"""
)
self.screenshot("rules_apply_rules_example_4_1_input_paste")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.rule_builder_set_mapping("url", "A")
self.rule_builder_set_mapping("list-identifiers", ["B"])
self.rule_builder_set_collection_name("flat_count_list")
self.rule_builder_set_extension("txt")
self.screenshot("rules_apply_rules_example_4_2_input_rules")
rule_builder.main_button_ok.wait_for_and_click()
self.history_panel_wait_for_hid_ok(1)
self.screenshot("rules_apply_rules_example_4_3_input_ready")
self.history_multi_view_display_collection_contents(1, "list")
self.screenshot("rules_apply_rules_example_4_4_input_list")
self.home()
add_depth_rules = {
"rules": [
{
"type": "add_column_metadata",
"value": "identifier0",
},
{"type": "add_column_regex", "target_column": 0, "expression": "(.*)_(.*)_.*", "group_count": 2},
],
"mapping": [
{
"type": "list_identifiers",
"columns": [1, 2, 0],
}
],
}
self._tool_apply_with_source(
add_depth_rules,
hid=1,
landing_screenshot="rules_apply_rules_example_4_5_apply_rules_landing",
rule_init_screenshot="rules_apply_rules_example_4_6_apply_rules_init_flat",
rule_complete_screenshot="rules_apply_rules_example_4_7_apply_rules_add_depth",
)
self.history_panel_wait_for_hid_ok(16)
self.history_multi_view_display_collection_contents(16, "list:list:list")
self.screenshot("rules_apply_rules_example_4_8_nested")
self.home()
invert_rules = {
"rules": [
{
"type": "add_column_metadata",
"value": "identifier0",
},
{
"type": "add_column_metadata",
"value": "identifier1",
},
{
"type": "add_column_metadata",
"value": "identifier2",
},
],
"mapping": [
{
"type": "list_identifiers",
"columns": [1, 0, 2],
}
],
}
self._tool_apply_with_source(
invert_rules,
rule_init_screenshot="rules_apply_rules_example_4_9_apply_rules_init_nested",
rule_complete_screenshot="rules_apply_rules_example_4_10_apply_rules_inverted",
)
self.history_panel_wait_for_hid_ok(24)
self.history_multi_view_display_collection_contents(24, "list:list:list")
self.screenshot("rules_apply_rules_example_4_11_inverted")
self.home()
filter_rules = {
"rules": [
{
"type": "add_column_metadata",
"value": "identifier0",
},
{
"type": "add_filter_regex",
"target_column": 0,
"expression": ".*_single_.*",
"invert": False,
},
],
"mapping": [
{
"type": "list_identifiers",
"columns": [0],
}
],
}
self._tool_apply_with_source(
filter_rules, hid=1, rule_complete_screenshot="rules_apply_rules_example_4_12_apply_rules_filter"
)
self.history_panel_wait_for_hid_ok(28)
self.history_multi_view_display_collection_contents(28, "list")
self.screenshot("rules_apply_rules_example_4_13_filtered")
self.home()
filter_and_nest_rules = {
"rules": [
{
"type": "add_column_metadata",
"value": "identifier0",
},
{
"type": "add_filter_regex",
"target_column": 0,
"expression": ".*_single_.*",
"invert": False,
},
{"type": "add_column_regex", "target_column": 0, "expression": "(.*)_single_.*", "group_count": 1},
],
"mapping": [
{
"type": "list_identifiers",
"columns": [1, 0],
}
],
}
self._tool_apply_with_source(
filter_and_nest_rules,
hid=1,
rule_complete_screenshot="rules_apply_rules_example_4_14_apply_rules_filtered_and_nested",
)
self.history_panel_wait_for_hid_ok(32)
self.history_multi_view_display_collection_contents(32, "list:list")
self.screenshot("rules_apply_rules_example_4_15_filtered_and_nested")
def _apply_rules_and_check(self, example):
rule_builder = self.components.rule_builder
self.home()
history_id = self.current_history_id()
stage_rules_example(self.api_interactor_for_logged_in_user(), history_id, example)
self.dataset_populator.wait_for_history(history_id)
self.home()
self._tool_open_apply_rules()
self.screenshot("tool_apply_rules_landing")
self.tool_parameter_edit_rules()
rule_builder._.wait_for_visible()
self.screenshot("tool_apply_rules_builder_landing")
self.rule_builder_set_source(json.dumps(example["rules"]))
self.screenshot("tool_apply_rules_after")
rule_builder.main_button_ok.wait_for_and_click()
self.tool_form_execute()
output_hid = example["output_hid"]
self.home()
self.history_panel_wait_for_hid_ok(output_hid)
output_hdca = self.dataset_populator.get_history_collection_details(history_id, hid=output_hid, wait=False)
example["check"](output_hdca, self.dataset_populator)
def _tool_apply_with_source(
self, rules_json, hid=None, landing_screenshot=None, rule_init_screenshot=None, rule_complete_screenshot=None
):
self._tool_open_apply_rules()
if hid:
self.tool_set_value("input", f"{hid}:", expected_type="data_collection")
if landing_screenshot:
self.screenshot(landing_screenshot)
rule_builder = self.components.rule_builder
self.tool_parameter_edit_rules()
rule_builder._.wait_for_visible()
if rule_init_screenshot:
self.screenshot(rule_init_screenshot)
self.rule_builder_set_source(json.dumps(rules_json))
if rule_complete_screenshot:
self.screenshot(rule_complete_screenshot)
rule_builder.main_button_ok.wait_for_and_click()
self.tool_form_execute()
def _tool_open_apply_rules(self):
self.tool_open("__APPLY_RULES__", outer=True) # may appear twice in panel, grab top-level link