File: TestGalaxyTools.py

package info (click to toggle)
python-bioblend 1.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,096 kB
  • sloc: python: 7,596; sh: 219; makefile: 158
file content (172 lines) | stat: -rw-r--r-- 7,429 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
"""
"""
import os
from typing import (
    Any,
    Dict,
)

from bioblend.galaxy.tools.inputs import (
    conditional,
    dataset,
    inputs,
    repeat,
)
from . import (
    GalaxyTestBase,
    test_util,
)


class TestGalaxyTools(GalaxyTestBase.GalaxyTestBase):
    def test_get_tools(self):
        # Test requires target Galaxy is configured with at least one tool.
        tools = self.gi.tools.get_tools()
        assert len(tools) > 0
        assert all(map(self._assert_is_tool_rep, tools))

    def test_get_tool_panel(self):
        # Test requires target Galaxy is configured with at least one tool
        # section.
        tool_panel = self.gi.tools.get_tool_panel()
        sections = [s for s in tool_panel if "elems" in s]
        assert len(sections) > 0
        assert all(map(self._assert_is_tool_rep, sections[0]["elems"]))

    def _assert_is_tool_rep(self, data):
        assert data["model_class"].endswith("Tool")
        # Special tools like SetMetadataTool may have different model_class
        # than Tool - but they all seem to end in tool.

        for key in ["name", "id", "version"]:
            assert key in data
        return True

    def test_paste_content(self):
        history = self.gi.histories.create_history(name="test_paste_data history")
        paste_text = "line 1\nline 2\rline 3\r\nline 4"
        tool_output = self.gi.tools.paste_content(paste_text, history["id"])
        assert len(tool_output["outputs"]) == 1
        # All lines in the resulting dataset should end with "\n"
        expected_contents = ("\n".join(paste_text.splitlines()) + "\n").encode()
        self._wait_and_verify_dataset(tool_output["outputs"][0]["id"], expected_contents)
        # Same with space_to_tab=True
        tool_output = self.gi.tools.paste_content(paste_text, history["id"], space_to_tab=True)
        assert len(tool_output["outputs"]) == 1
        expected_contents = ("\n".join("\t".join(_.split()) for _ in paste_text.splitlines()) + "\n").encode()
        self._wait_and_verify_dataset(tool_output["outputs"][0]["id"], expected_contents)

    def test_upload_file(self):
        history = self.gi.histories.create_history(name="test_upload_file history")

        fn = test_util.get_abspath("test_util.py")
        file_name = "test1"
        tool_output = self.gi.tools.upload_file(
            fn,
            # First param could be a regular path also of course...
            history_id=history["id"],
            file_name=file_name,
            dbkey="?",
            file_type="txt",
        )
        self._wait_for_and_verify_upload(tool_output, file_name, fn, expected_dbkey="?")

    def test_upload_file_dbkey(self):
        history = self.gi.histories.create_history(name="test_upload_file history")
        fn = test_util.get_abspath("test_util.py")
        file_name = "test1"
        dbkey = "hg19"
        tool_output = self.gi.tools.upload_file(
            fn,
            history_id=history["id"],
            file_name=file_name,
            dbkey=dbkey,
            file_type="txt",
        )
        self._wait_for_and_verify_upload(tool_output, file_name, fn, expected_dbkey=dbkey)

    @test_util.skip_unless_tool("random_lines1")
    def test_run_random_lines(self):
        # Run second test case from randomlines.xml
        history_id = self.gi.histories.create_history(name="test_run_random_lines history")["id"]
        with open(test_util.get_abspath(os.path.join("data", "1.bed"))) as f:
            contents = f.read()
        dataset_id = self._test_dataset(history_id, contents=contents)
        tool_inputs = (
            inputs()
            .set("num_lines", "1")
            .set("input", dataset(dataset_id))
            .set("seed_source", conditional().set("seed_source_selector", "set_seed").set("seed", "asdf"))
        )
        tool_output = self.gi.tools.run_tool(history_id=history_id, tool_id="random_lines1", tool_inputs=tool_inputs)
        assert len(tool_output["outputs"]) == 1
        # TODO: Wait for results and verify has 1 line and is
        # chr5  131424298   131424460   CCDS4149.1_cds_0_0_chr5_131424299_f 0   +

    @test_util.skip_unless_tool("cat1")
    def test_run_cat1(self):
        history_id = self.gi.histories.create_history(name="test_run_cat1 history")["id"]
        dataset1_id = self._test_dataset(history_id, contents="1 2 3")
        dataset2_id = self._test_dataset(history_id, contents="4 5 6")
        dataset3_id = self._test_dataset(history_id, contents="7 8 9")
        tool_inputs = (
            inputs()
            .set("input1", dataset(dataset1_id))
            .set(
                "queries",
                repeat()
                .instance(inputs().set("input2", dataset(dataset2_id)))
                .instance(inputs().set("input2", dataset(dataset3_id))),
            )
        )
        tool_output = self.gi.tools.run_tool(history_id=history_id, tool_id="cat1", tool_inputs=tool_inputs)
        assert len(tool_output["outputs"]) == 1
        # TODO: Wait for results and verify it has 3 lines - 1 2 3, 4 5 6,
        # and 7 8 9.

    @test_util.skip_unless_galaxy("release_19.05")
    @test_util.skip_unless_tool("CONVERTER_fasta_to_bowtie_color_index")
    def test_tool_dependency_install(self):
        installed_dependencies = self.gi.tools.install_dependencies("CONVERTER_fasta_to_bowtie_color_index")
        assert any(
            True for d in installed_dependencies if d.get("name") == "bowtie" and d.get("dependency_type") == "conda"
        ), f"installed_dependencies is {installed_dependencies}"
        status = self.gi.tools.uninstall_dependencies("CONVERTER_fasta_to_bowtie_color_index")
        assert status[0]["model_class"] == "NullDependency", status

    @test_util.skip_unless_tool("CONVERTER_fasta_to_bowtie_color_index")
    def test_tool_requirements(self):
        tool_requirements = self.gi.tools.requirements("CONVERTER_fasta_to_bowtie_color_index")
        assert any(
            True
            for tr in tool_requirements
            if {"dependency_type", "version"} <= set(tr.keys()) and tr.get("name") == "bowtie"
        ), f"tool_requirements is {tool_requirements}"

    @test_util.skip_unless_tool("CONVERTER_fasta_to_bowtie_color_index")
    def test_reload(self):
        response = self.gi.tools.reload("CONVERTER_fasta_to_bowtie_color_index")
        assert isinstance(response, dict)
        assert "message" in response
        assert "id" in response["message"]

    @test_util.skip_unless_tool("sra_source")
    def test_get_citations(self):
        citations = self.gi.tools.get_citations("sra_source")
        assert len(citations) == 2

    def _wait_for_and_verify_upload(
        self, tool_output: Dict[str, Any], file_name: str, fn: str, expected_dbkey: str = "?"
    ) -> None:
        assert len(tool_output["outputs"]) == 1
        output = tool_output["outputs"][0]
        assert output["name"] == file_name
        expected_contents = open(fn, "rb").read()
        self._wait_and_verify_dataset(output["id"], expected_contents)
        assert output["genome_build"] == expected_dbkey

    @test_util.skip_unless_tool("random_lines1")
    def test_get_tool_model(self):
        history_id = self.gi.histories.create_history(name="test_run_random_lines history")["id"]
        tool_model = self.gi.tools.build(tool_id="random_lines1", history_id=history_id)
        assert len(tool_model["inputs"]) == 3