Skip to content

Commit 4220768

Browse files
committed
tests(dipclust): parametrize sample_query cases and remove loop
Replace internal loops with pytest parametrization to generate explicit test cases per query scenario. Preserves existing behavior and error handling while improving test clarity and failure diagnostics. No production code changes.
1 parent 509ad40 commit 4220768

1 file changed

Lines changed: 44 additions & 12 deletions

File tree

tests/anoph/test_dipclust.py

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,11 @@ def case_af1_sim(af1_sim_fixture, af1_sim_api):
8080
return af1_sim_fixture, af1_sim_api
8181

8282

83+
@pytest.mark.parametrize("sample_query", [None, "sex_call == 'F'"])
8384
@pytest.mark.parametrize("distance_metric", ["cityblock", "euclidean"])
8485
@parametrize_with_cases("fixture,api", cases=".")
8586
def test_plot_diplotype_clustering(
86-
fixture, api: AnophelesDipClustAnalysis, distance_metric
87+
fixture, api: AnophelesDipClustAnalysis, distance_metric, sample_query
8788
):
8889
# Set up test parameters.
8990
all_sample_sets = api.sample_sets()["sample_set"].to_list()
@@ -96,24 +97,32 @@ def test_plot_diplotype_clustering(
9697
"median",
9798
"ward",
9899
)
99-
sample_queries = (None, "sex_call == 'F'")
100100
dipclust_params = dict(
101101
region=fixture.random_region_str(region_size=5000),
102102
sample_sets=[random.choice(all_sample_sets)],
103103
linkage_method=random.choice(linkage_methods),
104104
distance_metric=distance_metric,
105-
sample_query=random.choice(sample_queries),
105+
sample_query=sample_query,
106106
show=False,
107107
)
108108

109+
# Check if any samples match the query.
110+
if sample_query is not None:
111+
df_samples = api.sample_metadata().query(sample_query)
112+
if len(df_samples) == 0:
113+
with pytest.raises(ValueError):
114+
api.plot_diplotype_clustering(**dipclust_params)
115+
return
116+
109117
# Run checks.
110118
api.plot_diplotype_clustering(**dipclust_params)
111119

112120

121+
@pytest.mark.parametrize("sample_query", [None, "sex_call == 'F'"])
113122
@pytest.mark.parametrize("distance_metric", ["cityblock", "euclidean"])
114123
@parametrize_with_cases("fixture,api", cases=".")
115124
def test_plot_diplotype_clustering_advanced(
116-
fixture, api: AnophelesDipClustAnalysis, distance_metric
125+
fixture, api: AnophelesDipClustAnalysis, distance_metric, sample_query
117126
):
118127
# Set up test parameters.
119128
all_sample_sets = api.sample_sets()["sample_set"].to_list()
@@ -126,24 +135,32 @@ def test_plot_diplotype_clustering_advanced(
126135
"median",
127136
"ward",
128137
)
129-
sample_queries = (None, "sex_call == 'F'")
130138
dipclust_params = dict(
131139
region=fixture.random_region_str(region_size=5000),
132140
sample_sets=[random.choice(all_sample_sets)],
133141
linkage_method=random.choice(linkage_methods),
134142
distance_metric=distance_metric,
135-
sample_query=random.choice(sample_queries),
143+
sample_query=sample_query,
136144
show=False,
137145
)
138146

147+
# Check if any samples match the query.
148+
if sample_query is not None:
149+
df_samples = api.sample_metadata().query(sample_query)
150+
if len(df_samples) == 0:
151+
with pytest.raises(ValueError):
152+
api.plot_diplotype_clustering_advanced(**dipclust_params)
153+
return
154+
139155
# Run checks.
140156
api.plot_diplotype_clustering_advanced(**dipclust_params)
141157

142158

159+
@pytest.mark.parametrize("sample_query", [None, "sex_call == 'F'"])
143160
@pytest.mark.parametrize("n", [1, 2])
144161
@parametrize_with_cases("fixture,api", cases=".")
145162
def test_plot_diplotype_clustering_advanced_with_transcript(
146-
fixture, api: AnophelesDipClustAnalysis, n
163+
fixture, api: AnophelesDipClustAnalysis, n, sample_query
147164
):
148165
# Set up test parameters.
149166
contig = fixture.random_contig()
@@ -158,24 +175,32 @@ def test_plot_diplotype_clustering_advanced_with_transcript(
158175
"median",
159176
"ward",
160177
)
161-
sample_queries = (None, "sex_call == 'F'")
162178
dipclust_params = dict(
163179
region=contig,
164180
snp_transcript=transcripts,
165181
sample_sets=[random.choice(all_sample_sets)],
166182
linkage_method=random.choice(linkage_methods),
167183
distance_metric="cityblock",
168-
sample_query=random.choice(sample_queries),
184+
sample_query=sample_query,
169185
show=False,
170186
)
171187

188+
# Check if any samples match the query.
189+
if sample_query is not None:
190+
df_samples = api.sample_metadata().query(sample_query)
191+
if len(df_samples) == 0:
192+
with pytest.raises(ValueError):
193+
api.plot_diplotype_clustering_advanced(**dipclust_params)
194+
return
195+
172196
# Run checks.
173197
api.plot_diplotype_clustering_advanced(**dipclust_params)
174198

175199

200+
@pytest.mark.parametrize("sample_query", [None, "sex_call == 'F'"])
176201
@parametrize_with_cases("fixture,api", cases=".")
177202
def test_plot_diplotype_clustering_advanced_with_cnv_region(
178-
fixture, api: AnophelesDipClustAnalysis
203+
fixture, api: AnophelesDipClustAnalysis, sample_query
179204
):
180205
# Set up test parameters.
181206
region = fixture.random_region_str(region_size=5000)
@@ -189,16 +214,23 @@ def test_plot_diplotype_clustering_advanced_with_cnv_region(
189214
"median",
190215
"ward",
191216
)
192-
sample_queries = (None, "sex_call == 'F'")
193217
dipclust_params = dict(
194218
region=region,
195219
cnv_region=region,
196220
sample_sets=[random.choice(all_sample_sets)],
197221
linkage_method=random.choice(linkage_methods),
198222
distance_metric="cityblock",
199-
sample_query=random.choice(sample_queries),
223+
sample_query=sample_query,
200224
show=False,
201225
)
202226

227+
# Check if any samples match the query.
228+
if sample_query is not None:
229+
df_samples = api.sample_metadata().query(sample_query)
230+
if len(df_samples) == 0:
231+
with pytest.raises(ValueError):
232+
api.plot_diplotype_clustering_advanced(**dipclust_params)
233+
return
234+
203235
# Run checks.
204236
api.plot_diplotype_clustering_advanced(**dipclust_params)

0 commit comments

Comments
 (0)