Files
galaxy/test/selenium_tests/test_uploads.py
T
John Chilton 8af243c176 Allow rule based operations on existing collections.
Allow the rules DSL & GUI component to operate on existing collections to allow filtering, sorting, modifying identifiers and general re-organization of existing collections (e.g. the outputs of tools). Implementing this as a collection operation tool so that it should be executable interactively in the tool form and in a batch fashion as part of workflow executions.

For this to be tracked properly as a tool execution and to work properly in the tool form, I've implemented a new tool framework and tool form parameter type called "rules".

This can thought of as a more GUI friendly alternative to my proposed collection operations that consumed JavaScript expressions.

This includes API tests for both tool and workflow execution of the new tool as well as Selenium tests for tool form execution, workflow editor interactions, and workflow running.
2018-04-24 11:10:43 -04:00

326 lines
15 KiB
Python

import os
from selenium.webdriver.common.keys import Keys
from .framework import (
selenium_test,
SeleniumTestCase,
UsesHistoryItemAssertions,
)
class UploadsTestCase(SeleniumTestCase, UsesHistoryItemAssertions):
@selenium_test
def test_upload_simplest(self):
self.perform_upload(self.get_filename("1.sam"))
self.history_panel_wait_for_hid_ok(1)
history_contents = self.current_history_contents()
history_count = len(history_contents)
assert history_count == 1, "Incorrect number of items in history - expected 1, found %d" % history_count
hda = history_contents[0]
assert hda["name"] == '1.sam', hda
assert hda["extension"] == "sam", hda
self.history_panel_click_item_title(hid=1, wait=True)
self.assert_item_dbkey_displayed_as(1, "?")
@selenium_test
def test_upload_specify_ext(self):
self.perform_upload(self.get_filename("1.sam"), ext="txt")
self.history_panel_wait_for_hid_ok(1)
history_contents = self.current_history_contents()
hda = history_contents[0]
assert hda["name"] == '1.sam'
assert hda["extension"] == "txt", hda
@selenium_test
def test_upload_specify_genome(self):
self.perform_upload(self.get_filename("1.sam"), genome="hg18")
self.history_panel_wait_for_hid_ok(1)
self.history_panel_click_item_title(hid=1, wait=True)
self.assert_item_dbkey_displayed_as(1, "hg18")
@selenium_test
def test_upload_specify_ext_all(self):
self.perform_upload(self.get_filename("1.sam"), ext_all="txt")
self.history_panel_wait_for_hid_ok(1)
history_contents = self.current_history_contents()
hda = history_contents[0]
assert hda["name"] == '1.sam'
assert hda["extension"] == "txt", hda
@selenium_test
def test_upload_specify_genome_all(self):
self.perform_upload(self.get_filename("1.sam"), genome_all="hg18")
self.history_panel_wait_for_hid_ok(1)
self.history_panel_click_item_title(hid=1, wait=True)
self.assert_item_dbkey_displayed_as(1, "hg18")
@selenium_test
def test_upload_list(self):
self.upload_list([self.get_filename("1.tabular")], name="Test List")
self.history_panel_wait_for_hid_ok(2)
# Make sure modals disappeared - both List creator (TODO: upload).
self.wait_for_selector_absent_or_hidden(".collection-creator")
self.assert_item_name(2, "Test List")
# Make sure source item is hidden when the collection is created.
self.history_panel_wait_for_hid_hidden(1)
@selenium_test
def test_upload_pair(self):
self.upload_list([self.get_filename("1.tabular"), self.get_filename("2.tabular")], name="Test Pair")
self.history_panel_wait_for_hid_ok(3)
# Make sure modals disappeared - both collection creator (TODO: upload).
self.wait_for_selector_absent_or_hidden(".collection-creator")
self.assert_item_name(3, "Test Pair")
# Make sure source items are hidden when the collection is created.
self.history_panel_wait_for_hid_hidden(1)
self.history_panel_wait_for_hid_hidden(2)
@selenium_test
def test_upload_pair_specify_extension(self):
self.upload_list([self.get_filename("1.tabular"), self.get_filename("2.tabular")], name="Test Pair", ext="txt", hide_source_items=False)
self.history_panel_wait_for_hid_ok(3)
self.history_panel_wait_for_hid_ok(1)
history_contents = self.current_history_contents()
hda = history_contents[0]
assert hda["name"] == '1.tabular'
assert hda["extension"] == "txt", hda
@selenium_test
def test_upload_paired_list(self):
self.upload_paired_list([self.get_filename("1.tabular"), self.get_filename("2.tabular")], name="Test Paired List")
self.history_panel_wait_for_hid_ok(3)
# Make sure modals disappeared - both collection creator (TODO: upload).
self.wait_for_selector_absent_or_hidden(".collection-creator")
self.assert_item_name(3, "Test Paired List")
# Make sure source items are hidden when the collection is created.
self.history_panel_wait_for_hid_hidden(1)
self.history_panel_wait_for_hid_hidden(2)
@selenium_test
def test_rules_example_1_datasets(self):
# Test case generated for:
# https://www.ebi.ac.uk/ena/data/view/PRJDA60709
self.home()
self.upload_rule_start()
self.screenshot("rules_example_1_1_rules_landing")
self.components.upload.rule_source_content.wait_for_and_send_keys("""study_accession sample_accession experiment_accession fastq_ftp
PRJDA60709 SAMD00016379 DRX000475 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000770/DRR000770.fastq.gz
PRJDA60709 SAMD00016383 DRX000476 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000771/DRR000771.fastq.gz
PRJDA60709 SAMD00016380 DRX000477 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000772/DRR000772.fastq.gz
PRJDA60709 SAMD00016378 DRX000478 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000773/DRR000773.fastq.gz
PRJDA60709 SAMD00016381 DRX000479 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000774/DRR000774.fastq.gz
PRJDA60709 SAMD00016382 DRX000480 ftp.sra.ebi.ac.uk/vol1/fastq/DRR000/DRR000775/DRR000775.fastq.gz""")
self.screenshot("rules_example_1_2_paste")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.screenshot("rules_example_1_3_initial_rules")
rule_builder.menu_button_filter.wait_for_and_click()
self.screenshot("rule_builder_filters")
rule_builder.menu_item_rule_type(rule_type="add-filter-count").wait_for_and_click()
filter_editor = rule_builder.rule_editor(rule_type="add-filter-count")
filter_editor_element = filter_editor.wait_for_visible()
filter_input = filter_editor_element.find_element_by_css_selector("input[type='number']")
filter_input.clear()
filter_input.send_keys("1")
self.screenshot("rules_example_1_4_filter_header")
rule_builder.rule_editor_ok.wait_for_and_click()
self.rule_builder_set_mapping("url", "D")
self.rule_builder_set_mapping("name", "C", screenshot_name="rules_example_1_5_mapping_edit")
self.screenshot("rules_example_1_6_mapping_set")
self.rule_builder_set_extension("fastqsanger.gz")
self.screenshot("rules_example_1_7_extension_set")
# rule_builder.main_button_ok.wait_for_and_click()
# self.history_panel_wait_for_hid_ok(6)
# self.screenshot("rules_example_1_6_download_complete")
@selenium_test
def test_rules_example_2_list(self):
self.perform_upload(self.get_filename("rules/PRJDA60709.tsv"))
self.history_panel_wait_for_hid_ok(1)
self.upload_rule_start()
self.upload_rule_set_data_type("Collection")
self.upload_rule_set_input_type("History Dataset")
self.upload_rule_set_dataset("1:")
self.screenshot("rules_example_2_1_inputs")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.screenshot("rules_example_2_2_initial_rules")
# Filter header.
self.rule_builder_filter_count(1)
self.rule_builder_set_mapping("url", "D")
self.rule_builder_set_mapping("list-identifiers", "C")
self.rule_builder_set_extension("fastqsanger.gz")
self.screenshot("rules_example_2_3_rules")
self.rule_builder_set_collection_name("PRJDA60709")
self.screenshot("rules_example_2_4_name")
# rule_builder.main_buton_ok.wait_for_and_click()
# self.history_panel_wait_for_hid_ok(2)
# self.screenshot("rules_example_2_5_download_complete")
@selenium_test
def test_rules_example_3_list_pairs(self):
self.perform_upload(self.get_filename("rules/PRJDB3920.tsv"))
self.history_panel_wait_for_hid_ok(1)
self.upload_rule_start()
self.upload_rule_set_data_type("Collection")
self.upload_rule_set_input_type("History Dataset")
self.upload_rule_set_dataset("1:")
self.screenshot("rules_example_3_1_inputs")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.screenshot("rules_example_3_2_initial_rules")
# Filter header.
self.rule_builder_filter_count(1)
self.rule_builder_set_mapping("list-identifiers", "C")
self.rule_builder_set_extension("fastqsanger.gz")
self.screenshot("rules_example_3_3_old_rules")
self.rule_builder_add_regex_groups("D", 2, "(.*);(.*)", screenshot_name="rules_example_3_4_regex")
self.screenshot("rules_example_3_6_with_regexes")
# Remove A also?
self.rule_builder_remove_columns(["D"], screenshot_name="rules_example_3_7_removed_column")
self.rule_builder_split_columns(["D"], ["E"], screenshot_name="rules_example_3_8_split_columns")
self.screenshot("rules_example_3_9_columns_are_split")
self.rule_builder_add_regex_groups("D", 1, ".*_(\d).fastq.gz", screenshot_name="rules_example_3_10_regex_paired")
self.screenshot("rules_example_3_11_has_paired_id")
self.rule_builder_swap_columns("D", "E", screenshot_name="rules_example_3_12_swap_columns")
self.screenshot("rules_example_3_13_swapped_columns")
self.rule_builder_set_mapping("paired-identifier", "D")
self.rule_builder_set_mapping("url", "E")
self.rule_builder_set_collection_name("PRJDB3920")
self.screenshot("rules_example_3_14_paired_identifier_set")
@selenium_test
def test_rules_example_4_accessions(self):
# http://www.uniprot.org/uniprot/?query=proteome:UP000052092+AND+proteomecomponent:%22Genome%22
self._setup_uniprot_example()
self.screenshot("rules_example_4_1_inputs")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.screenshot("rules_example_4_2_initial_rules")
self.rule_builder_filter_count(1)
self.rule_builder_remove_columns(["B", "C", "E", "F", "G"])
self.rule_builder_set_mapping("info", "B")
self.screenshot("rules_example_4_3_basic_rules")
self.rule_builder_sort("A", screenshot_name="rules_example_4_4_sort")
self.rule_builder_add_regex_replacement("A", ".*", "http://www.uniprot.org/uniprot/\\0.fasta", screenshot_name="rules_example_4_5_url")
self.screenshot("rules_example_4_6_url_built")
self.rule_builder_set_mapping("list-identifiers", "A")
self.rule_builder_set_mapping("url", "C")
self.rule_builder_set_extension("fasta")
self.rule_builder_set_collection_name("UP000052092")
self.screenshot("rules_example_4_7_mapping_extension_and_name")
rule_builder.view_source.wait_for_and_click()
text_area_elem = rule_builder.source.wait_for_visible()
self.screenshot("rules_example_4_8_source")
self.write_screenshot_directory_file("rules_example_4_8_text", text_area_elem.get_attribute("value"))
rule_builder.main_button_ok.wait_for_and_click()
rule_builder.view_source.wait_for_visible()
@selenium_test
def test_rules_example_5_matching_collections(self):
self._setup_uniprot_example()
self.screenshot("rules_example_5_1_inputs")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder.view_source.wait_for_and_click()
content = self._read_rules_test_data_file("uniprot.json")
self.rule_builder_enter_source_text(content)
self.screenshot("rules_example_5_2_source")
rule_builder.main_button_ok.wait_for_and_click()
rule_builder.view_source.wait_for_visible()
self.screenshot("rules_example_5_3_initial_rules")
self.rule_builder_add_value("fasta", screenshot_name="rules_example_5_4_fasta")
self.rule_builder_add_value("UP000052092 FASTA")
self.rule_builder_add_regex_replacement("A", ".*", "http://www.uniprot.org/uniprot/\\0.gff", screenshot_name="rules_example_5_5_url")
self.rule_builder_add_value("gff3")
self.rule_builder_add_value("UP000052092 GFF3")
self._scroll_to_end_of_table()
self.screenshot("rules_example_5_6_presplit")
self.rule_builder_split_columns(["C", "D", "E"], ["F", "G", "H"], screenshot_name="rules_example_5_7_split_columns")
self.screenshot("rules_example_5_8_split")
self.rule_builder_set_mapping("file-type", "D")
self.rule_builder_set_mapping("collection-name", "E")
self.screenshot("rules_example_5_9_mapping")
@selenium_test
def test_rules_example_6_nested_lists(self):
self.home()
self.perform_upload(self.get_filename("rules/PRJNA355367.tsv"))
self.history_panel_wait_for_hid_ok(1)
self.upload_rule_start()
self.upload_rule_set_data_type("Collection")
self.upload_rule_set_input_type("History Dataset")
self.upload_rule_set_dataset("1:")
self.screenshot("rules_example_6_1_paste")
self.upload_rule_build()
rule_builder = self.components.rule_builder
rule_builder._.wait_for_and_click()
self.screenshot("rules_example_6_2_rules_landing")
self.rule_builder_filter_count(1)
self.rule_builder_set_mapping("url", "J")
self.rule_builder_set_extension("sra")
self._scroll_to_end_of_table()
self.screenshot("rules_example_6_3_end_of_table")
self.rule_builder_add_regex_groups("L", 1, "([^\d]+)\d+", screenshot_name="rules_example_6_4_regex")
self.rule_builder_set_mapping("list-identifiers", ["M", "A"], screenshot_name="rules_example_6_5_multiple_identifiers_edit")
self._scroll_to_end_of_table()
self.screenshot("rules_example_6_6_multiple_identifiers")
self.rule_builder_set_collection_name("PRJNA355367")
self.screenshot("rules_example_6_7_named")
def _read_rules_test_data_file(self, name):
with open(self.test_data_resolver.get_filename(os.path.join("rules", name)), "r") as f:
return f.read()
def _scroll_to_end_of_table(self):
rule_builder = self.components.rule_builder
table_elem = rule_builder.table.wait_for_visible()
first_cell = table_elem.find_elements_by_css_selector("td")[0]
action_chains = self.action_chains()
action_chains.move_to_element(first_cell)
action_chains.click(first_cell)
for i in range(15):
action_chains.send_keys(Keys.ARROW_RIGHT)
action_chains.perform()
def _setup_uniprot_example(self):
self.perform_upload(self.get_filename("rules/uniprot.tsv"))
self.history_panel_wait_for_hid_ok(1)
self.upload_rule_start()
self.upload_rule_set_data_type("Collection")
self.upload_rule_set_input_type("History Dataset")
self.upload_rule_set_dataset("1:")
# @selenium_test
# def test_rules_example_5_matching_collections(self):
# self.rule_builder_add_value("Protein FASTA")
# self.rule_builder_add_value("gff")
# self.rule_builder_add_value("Protein GFF")