/
test_job_wrapper.py
209 lines (147 loc) · 5.37 KB
/
test_job_wrapper.py
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
import os
from contextlib import contextmanager
from unittest import TestCase
from galaxy.jobs import (
JobWrapper,
TaskWrapper
)
from galaxy.model import (
Job,
Task,
User
)
from galaxy.tools import evaluation
from galaxy.util.bunch import Bunch
from tools_support import UsesApp
TEST_TOOL_ID = "cufftest"
TEST_VERSION_COMMAND = "bwa --version"
TEST_DEPENDENCIES_COMMANDS = ". /galaxy/modules/bwa/0.5.9/env.sh"
TEST_COMMAND = ""
class BaseWrapperTestCase(UsesApp):
def setUp(self):
self.setup_app()
job = Job()
job.id = 345
job.tool_id = TEST_TOOL_ID
job.user = User()
self.model_objects = {Job: {345: job}}
self.app.model.context = MockContext(self.model_objects)
self.app.toolbox = MockToolbox(MockTool(self))
self.working_directory = os.path.join(self.test_directory, "working")
self.app.object_store = MockObjectStore(self.working_directory)
self.queue = MockJobQueue(self.app)
self.job = job
def tearDown(self):
self.tear_down_app()
@contextmanager
def _prepared_wrapper(self):
wrapper = self._wrapper()
with _mock_tool_evaluator(MockEvaluator):
wrapper.prepare()
yield wrapper
def test_version_path(self):
wrapper = self._wrapper()
version_path = wrapper.get_version_string_path()
expected_path = os.path.join(self.test_directory, "new_files", "GALAXY_VERSION_STRING_345")
self.assertEquals(version_path, expected_path)
def test_prepare_sets_command_line(self):
with self._prepared_wrapper() as wrapper:
assert TEST_COMMAND in wrapper.command_line
def test_prepare_sets_dependency_shell_commands(self):
with self._prepared_wrapper() as wrapper:
assert TEST_DEPENDENCIES_COMMANDS == wrapper.dependency_shell_commands
class JobWrapperTestCase(BaseWrapperTestCase, TestCase):
def _wrapper(self):
return JobWrapper(self.job, self.queue)
def test_prepare_sets_version_command(self):
with self._prepared_wrapper() as wrapper:
assert TEST_VERSION_COMMAND in wrapper.write_version_cmd, wrapper.write_version_cmd
class TaskWrapperTestCase(BaseWrapperTestCase, TestCase):
def setUp(self):
super(TaskWrapperTestCase, self).setUp()
self.task = Task(self.job, self.working_directory, "prepare_bwa_job.sh")
self.task.id = 4
self.model_objects[Task] = {4: self.task}
def _wrapper(self):
return TaskWrapper(self.task, self.queue)
def test_prepare_sets_no_version_command(self):
with self._prepared_wrapper() as wrapper:
assert wrapper.write_version_cmd is None
class MockEvaluator(object):
def __init__(self, app, tool, job, local_working_directory):
self.app = app
self.tool = tool
self.job = job
self.local_working_directory = local_working_directory
self.param_dict = {}
def set_compute_environment(self, *args, **kwds):
pass
def build(self):
return TEST_COMMAND, [], []
class MockJobQueue(object):
def __init__(self, app):
self.app = app
self.dispatcher = MockJobDispatcher(app)
class MockJobDispatcher(object):
def __init__(self, app):
pass
def url_to_destination(self):
pass
class MockContext(object):
def __init__(self, model_objects):
self.expunged_all = False
self.flushed = False
self.model_objects = model_objects
self.created_objects = []
def expunge_all(self):
self.expunged_all = True
def query(self, clazz):
return MockQuery(self.model_objects.get(clazz))
def flush(self):
self.flushed = True
def add(self, object):
self.created_objects.append(object)
class MockQuery(object):
def __init__(self, class_objects):
self.class_objects = class_objects
def filter_by(self, **kwds):
return Bunch(first=lambda: None)
def get(self, id):
return self.class_objects.get(id, None)
class MockTool(object):
def __init__(self, app):
self.version_string_cmd = TEST_VERSION_COMMAND
self.tool_dir = "/path/to/tools"
self.dependencies = []
def build_dependency_shell_commands(self, job_directory):
return TEST_DEPENDENCIES_COMMANDS
class MockToolbox(object):
def __init__(self, test_tool):
self.test_tool = test_tool
def get(self, tool_id, default=None):
assert tool_id == TEST_TOOL_ID
return self.test_tool
def get_tool( self, tool_id, tool_version, exact=False ):
tool = self.get(tool_id)
return tool
class MockObjectStore(object):
def __init__(self, working_directory):
self.working_directory = working_directory
os.makedirs(working_directory)
def create(self, *args, **kwds):
pass
def get_filename(self, *args, **kwds):
if kwds.get("base_dir", "") == "job_work":
return self.working_directory
return None
# Poor man's mocking. Need to get a real mocking library as real Galaxy development
# dependnecy.
@contextmanager
def _mock_tool_evaluator(mock_constructor):
name = evaluation.ToolEvaluator.__name__
real_classs = getattr(evaluation, name)
try:
setattr(evaluation, name, mock_constructor)
yield
finally:
setattr(evaluation, name, real_classs)