Skip to content

Commit 4e84df6

Browse files
committed
✅ add utils to test isabl apps
1 parent b998a18 commit 4e84df6

File tree

3 files changed

+175
-0
lines changed

3 files changed

+175
-0
lines changed

isabl_cli/test/__init__.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Isabl CLI testing utilities for apps development."""
2+
3+
import pytest
4+
5+
6+
@pytest.fixture
7+
def commit(request):
8+
"""Return true if user wants to commit the test applications."""
9+
return request.config.getoption("--commit")
10+
11+
12+
def pytest_addoption(parser):
13+
"""Add option to commit or not applications."""
14+
parser.addoption("--commit", action="store_true", help="commit applications")

isabl_cli/test/utils.py

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import json
2+
import uuid
3+
4+
from isabl_cli import api
5+
from isabl_cli import factories
6+
7+
8+
def create_experiment(
9+
bam,
10+
bedfile="/a/fake/bedfile",
11+
assembly="GRCh37",
12+
sequencing_data=None,
13+
method="TD",
14+
analyte="DNA",
15+
species="HUMAN",
16+
sample_class=None,
17+
technique_name=None,
18+
sample=None,
19+
):
20+
"""Easily create a sequencing experiment for testing purposes."""
21+
# create sequencing technique
22+
technique = factories.TechniqueFactory(
23+
method=method, analyte=analyte, name=technique_name or str(uuid.uuid4())
24+
)
25+
26+
# create experiment
27+
technique["bed_files"][assembly] = dict(targets=bedfile, baits=bedfile)
28+
experiment = factories.ExperimentFactory(technique=technique)
29+
30+
# force sample if provided
31+
if sample:
32+
experiment["sample"] = sample
33+
else:
34+
sample_class = sample_class or experiment["sample"]["sample_class"]
35+
experiment["sample"]["individual"]["species"] = species
36+
experiment["sample"]["sample_class"] = sample_class
37+
38+
experiment["sequencing_data"] = sequencing_data or []
39+
experiment["bam_files"][assembly] = dict(url=bam, analysis=1)
40+
return api.create_instance("experiments", **experiment)
41+
42+
43+
def create_pair(
44+
tumor_bam,
45+
normal_bam,
46+
bedfile="/a/fake/bedfile",
47+
assembly="GRCh37",
48+
method="TD",
49+
analyte="DNA",
50+
species="HUMAN",
51+
):
52+
"""Create pair."""
53+
pair = []
54+
technique = factories.TechniqueFactory(method=method, analyte=analyte)
55+
technique["bed_files"][assembly] = dict(targets=bedfile, baits=bedfile)
56+
57+
for i in tumor_bam, normal_bam:
58+
experiment = factories.ExperimentFactory(technique=technique)
59+
experiment["sample"]["individual"]["species"] = species
60+
experiment["bam_files"][assembly] = dict(url=i, analysis=1)
61+
pair.append(api.create_instance("experiments", **experiment))
62+
63+
return pair[0], pair[1]
64+
65+
66+
def create_test_result(
67+
application=None, results=None, targets=None, references=None, analyses=None
68+
):
69+
"""Return an analysis object."""
70+
return api.create_instance(
71+
"analyses",
72+
**factories.AnalysisFactory(
73+
targets=targets or [],
74+
references=references or [],
75+
analyses=analyses or [],
76+
application=application or factories.ApplicationFactory(),
77+
status="SUCCEEDED",
78+
results=results or {},
79+
),
80+
)
81+
82+
83+
def assert_run(
84+
application,
85+
tuples,
86+
commit,
87+
results=None,
88+
project_results=None,
89+
assert_valid=True,
90+
assert_skipped=False,
91+
assert_invalid=False,
92+
):
93+
"""Run application, check results, and return analyses."""
94+
ret = []
95+
valid, skipped, invalid = application.run(tuples, commit=commit)
96+
97+
if assert_valid:
98+
assert valid, "No valid RAN analyses."
99+
100+
for i, status in valid:
101+
ret.append(i)
102+
results = results or []
103+
104+
if not commit:
105+
assert status == application.STAGED_MSG
106+
continue
107+
108+
for j in results:
109+
assert i["results"].get(j) is not None, (
110+
f"Result {j} is missing in: "
111+
+ json.dumps(i["results"], sort_keys=True, indent=4)
112+
)
113+
114+
if assert_skipped:
115+
assert skipped, "No SKIPPED analyses."
116+
117+
if assert_invalid:
118+
assert invalid, "No INVALID analyses."
119+
120+
if project_results:
121+
project = tuples[0][0][0].projects[0].pk
122+
analyses = api.get_instances(
123+
endpoint="analyses", project_level_analysis=project, limit=1
124+
)
125+
126+
if analyses:
127+
assert (
128+
analyses[0]["status"] == "SUCCEEDED"
129+
), f"Project level analysis {analyses[0].pk} has not SUCCEEDED status."
130+
131+
for j in project_results:
132+
assert analyses[0]["results"].get(j) is not None, (
133+
f"Result {j} is missing in: "
134+
+ json.dumps(analyses[0]["results"], sort_keys=True, indent=4)
135+
)
136+
137+
return ret

tests/test_testutils.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from isabl_cli import api
2+
from isabl_cli import factories
3+
from isabl_cli.test import utils
4+
5+
from .test_app import TestApplication
6+
7+
8+
def test_create_utils():
9+
# for now just get some coverage
10+
assert utils.create_experiment("/a/bam")
11+
assert utils.create_pair("/tumor/bam", "/tumor/bam")
12+
assert utils.create_test_result()
13+
14+
15+
def test_assert_run():
16+
# test assert_run utility
17+
data = api.create_instance("projects", **factories.ProjectFactory())
18+
data = factories.ExperimentFactory(projects=[data])
19+
data["sample"]["individual"]["species"] = "HUMAN"
20+
assert utils.assert_run(
21+
application=TestApplication(),
22+
tuples=[([api.create_instance("experiments", **data)], [])],
23+
commit=True,
24+
)

0 commit comments

Comments
 (0)