Skip to content

Commit bbf48bc

Browse files
committed
fix: filter clinical control options to current mapped variants only
The /score-sets/{urn}/clinical-controls/options endpoint was returning options derived from all mapped variants, including stale (non-current) ones. The sibling /clinical-controls endpoint already applied MappedVariant.current.is_(True); this endpoint simply missed it. Adds a regression test that marks all mapped variants as non-current and asserts the options endpoint returns 404, directly proving the filter is enforced.
1 parent 380538d commit bbf48bc

2 files changed

Lines changed: 30 additions & 2 deletions

File tree

src/mavedb/routers/score_sets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2351,6 +2351,7 @@ async def get_clinical_controls_options_for_score_set(
23512351
select(ClinicalControl.db_name, ClinicalControl.db_version)
23522352
.join(MappedVariant, ClinicalControl.mapped_variants)
23532353
.join(Variant)
2354+
.where(MappedVariant.current.is_(True))
23542355
.where(Variant.score_set_id == item.id)
23552356
)
23562357

tests/routers/test_score_set.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from mavedb.models.enums.processing_state import ProcessingState
2323
from mavedb.models.enums.target_category import TargetCategory
2424
from mavedb.models.experiment import Experiment as ExperimentDbModel
25+
from mavedb.models.mapped_variant import MappedVariant as MappedVariantDbModel
2526
from mavedb.models.score_set import ScoreSet as ScoreSetDbModel
2627
from mavedb.models.variant import Variant as VariantDbModel
2728
from mavedb.view_models.orcid import OrcidUser
@@ -875,7 +876,9 @@ def test_show_score_sets_anonymous_can_fetch_public_score_sets(
875876
assert response_data[0]["urn"] == published_score_set["urn"]
876877

877878

878-
def test_show_score_sets_anonymous_cannot_fetch_private_score_sets(session, client, setup_router_db, anonymous_app_overrides):
879+
def test_show_score_sets_anonymous_cannot_fetch_private_score_sets(
880+
session, client, setup_router_db, anonymous_app_overrides
881+
):
879882
experiment = create_experiment(client)
880883
score_set = create_seq_score_set(client, experiment["urn"])
881884
# Score set is private (not published); change ownership so it belongs to another user
@@ -927,7 +930,9 @@ def test_show_score_sets_mixed_public_and_private_returns_404(
927930
):
928931
experiment = create_experiment(client)
929932
public_score_set = create_seq_score_set(client, experiment["urn"])
930-
public_score_set = mock_worker_variant_insertion(client, session, data_provider, public_score_set, data_files / "scores.csv")
933+
public_score_set = mock_worker_variant_insertion(
934+
client, session, data_provider, public_score_set, data_files / "scores.csv"
935+
)
931936
private_score_set = create_seq_score_set(client, experiment["urn"])
932937
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None):
933938
published_score_set = publish_score_set(client, public_score_set["urn"])
@@ -3522,6 +3527,28 @@ def test_can_fetch_current_clinical_control_options_for_score_set(
35223527
)
35233528

35243529

3530+
def test_clinical_control_options_exclude_non_current(client, setup_router_db, session, data_provider, data_files):
3531+
experiment = create_experiment(client)
3532+
score_set = create_seq_score_set_with_mapped_variants(
3533+
client, session, data_provider, experiment["urn"], data_files / "scores.csv"
3534+
)
3535+
link_clinical_controls_to_mapped_variants(session, score_set)
3536+
3537+
# Mark all mapped variants as non-current to simulate stale mapping data.
3538+
mapped_variants = session.scalars(
3539+
select(MappedVariantDbModel)
3540+
.join(VariantDbModel)
3541+
.join(ScoreSetDbModel)
3542+
.where(ScoreSetDbModel.urn == score_set["urn"])
3543+
).all()
3544+
for mv in mapped_variants:
3545+
mv.current = False
3546+
session.commit()
3547+
3548+
response = client.get(f"/api/v1/score-sets/{score_set['urn']}/clinical-controls/options")
3549+
assert response.status_code == 404
3550+
3551+
35253552
########################################################################################################################
35263553
# Fetching annotated variants for a score set
35273554
########################################################################################################################

0 commit comments

Comments
 (0)