Skip to content

Commit 9be51e2

Browse files
committed
Unit test for new variant CSV download with post-mapped HGVS
1 parent d3945aa commit 9be51e2

File tree

4 files changed

+136
-5
lines changed

4 files changed

+136
-5
lines changed

tests/helpers/constants.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,15 @@
987987
}
988988
}
989989

990+
TEST_POST_MAPPED_METADATA_WITH_EXPRESSION = {
991+
"genomic": {
992+
"sequence_id": "ga4gh:SQ.em9khDCUYXrVWBfWr9r8fjBUrTjj1aig",
993+
"sequence_type": "dna",
994+
"sequence_accessions": [VALID_NT_ACCESSION],
995+
"sequence_genes": [VALID_GENE],
996+
}
997+
}
998+
990999
TEST_SEQ_SCORESET_VARIANT_MAPPING_SCAFFOLD = {
9911000
"metadata": {},
9921001
"reference_sequences": {
@@ -1083,6 +1092,86 @@
10831092
"mapping_api_version": "pytest.0.0",
10841093
}
10851094

1095+
TEST_POST_MAPPED_VRS_WITH_HGVS_G_EXPRESSION = {
1096+
"id": "ga4gh:VA.fRW7u-kBQnAKitu1PoDMLvlECWZTHCos",
1097+
"type": "Allele",
1098+
"state": {
1099+
"type": "LiteralSequenceExpression",
1100+
"sequence": "G"
1101+
},
1102+
"digest": "fRW7u-kBQnAKitu1PoDMLvlECWZTHCos",
1103+
"location": {
1104+
"id": "ga4gh:SL.99b3WBaSSmaSTs6YmJfIhl1ZDCV07VZY",
1105+
"end": 23536836,
1106+
"type": "SequenceLocation",
1107+
"start": 23536835,
1108+
"digest": "99b3WBaSSmaSTs6YmJfIhl1ZDCV07VZY",
1109+
"sequenceReference": {
1110+
"type": "SequenceReference",
1111+
"label": "NC_000018.10",
1112+
"refgetAccession": "SQ.vWwFhJ5lQDMhh-czg06YtlWqu0lvFAZV"
1113+
}
1114+
},
1115+
"extensions": [{
1116+
"name": "vrs_ref_allele_seq",
1117+
"type": "Extension",
1118+
"value": "C"
1119+
}],
1120+
"expressions": [{
1121+
"value": "NC_000018.10:g.23536836C>G",
1122+
"syntax": "hgvs.g"
1123+
}]
1124+
}
1125+
1126+
TEST_POST_MAPPED_VRS_WITH_HGVS_P_EXPRESSION = {
1127+
"id": "ga4gh:VA.zkOAzZK5qG0D0mkJUfXlK1aS075OGSjh",
1128+
"type": "Allele",
1129+
"state": {
1130+
"type": "LiteralSequenceExpression",
1131+
"sequence": "R"
1132+
},
1133+
"digest": "zkOAzZK5qG0D0mkJUfXlK1aS075OGSjh",
1134+
"location": {
1135+
"id": "ga4gh:SL.uUyRpJbrPttRThL7A2zeWAnTcb_7f1R2",
1136+
"end": 116,
1137+
"type": "SequenceLocation",
1138+
"start": 115,
1139+
"digest": "uUyRpJbrPttRThL7A2zeWAnTcb_7f1R2",
1140+
"sequenceReference": {
1141+
"type": "SequenceReference",
1142+
"refgetAccession": "SQ.StlJo3M4b8cS253ufe9nPpWqQHBDOSPs"
1143+
}
1144+
},
1145+
"extensions": [{
1146+
"name": "vrs_ref_allele_seq",
1147+
"type": "Extension",
1148+
"value": "Q"
1149+
}],
1150+
"expressions": [{
1151+
"value": "NP_002746.1:p.Gln116Arg",
1152+
"syntax": "hgvs.p"
1153+
}]
1154+
}
1155+
1156+
TEST_MAPPED_VARIANT_WITH_HGVS_G_EXPRESSION = {
1157+
"pre_mapped": {},
1158+
"post_mapped": TEST_POST_MAPPED_VRS_WITH_HGVS_G_EXPRESSION,
1159+
"modification_date": datetime.isoformat(datetime.now()),
1160+
"mapped_date": datetime.isoformat(datetime.now()),
1161+
"current": True,
1162+
"vrs_version": "2.0",
1163+
"mapping_api_version": "pytest.0.0",
1164+
}
1165+
1166+
TEST_MAPPED_VARIANT_WITH_HGVS_P_EXPRESSION = {
1167+
"pre_mapped": {},
1168+
"post_mapped": TEST_POST_MAPPED_VRS_WITH_HGVS_P_EXPRESSION,
1169+
"modification_date": datetime.isoformat(datetime.now()),
1170+
"mapped_date": datetime.isoformat(datetime.now()),
1171+
"current": True,
1172+
"vrs_version": "2.0",
1173+
"mapping_api_version": "pytest.0.0",
1174+
}
10861175

10871176
TEST_WT_SCORE = 1.0
10881177

tests/helpers/util/variant.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from mavedb.models.variant import Variant
1818

1919
from tests.helpers.constants import (
20-
TEST_MINIMAL_MAPPED_VARIANT,
2120
TEST_MINIMAL_PRE_MAPPED_METADATA,
2221
TEST_MINIMAL_POST_MAPPED_METADATA,
2322
)
@@ -84,13 +83,13 @@ def mock_worker_variant_insertion(
8483
return client.get(f"api/v1/score-sets/{score_set['urn']}").json()
8584

8685

87-
def create_mapped_variants_for_score_set(db, score_set_urn):
86+
def create_mapped_variants_for_score_set(db, score_set_urn, mapped_variant: dict[str, any]):
8887
score_set = db.scalar(select(ScoreSet).where(ScoreSet.urn == score_set_urn))
8988
targets = db.scalars(select(TargetGene).where(TargetGene.score_set_id == score_set.id))
9089
variants = db.scalars(select(Variant).where(Variant.score_set_id == score_set.id)).all()
9190

9291
for variant in variants:
93-
mv = MappedVariant(**TEST_MINIMAL_MAPPED_VARIANT, variant_id=variant.id)
92+
mv = MappedVariant(**mapped_variant, variant_id=variant.id)
9493
db.add(mv)
9594

9695
for target in targets:

tests/routers/test_score_set.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import re
44
from copy import deepcopy
5+
import csv
56
from datetime import date
7+
from io import StringIO
68
from unittest.mock import patch
79

810
import jsonschema
@@ -27,6 +29,8 @@
2729
EXTRA_USER,
2830
EXTRA_LICENSE,
2931
TEST_CROSSREF_IDENTIFIER,
32+
TEST_MAPPED_VARIANT_WITH_HGVS_G_EXPRESSION,
33+
TEST_MAPPED_VARIANT_WITH_HGVS_P_EXPRESSION,
3034
TEST_MINIMAL_ACC_SCORESET,
3135
TEST_MINIMAL_SEQ_SCORESET,
3236
TEST_MINIMAL_SEQ_SCORESET_RESPONSE,
@@ -62,7 +66,7 @@
6266
publish_score_set,
6367
)
6468
from tests.helpers.util.user import change_ownership
65-
from tests.helpers.util.variant import mock_worker_variant_insertion
69+
from tests.helpers.util.variant import create_mapped_variants_for_score_set, mock_worker_variant_insertion
6670

6771

6872
########################################################################################################################
@@ -2347,6 +2351,44 @@ def test_upload_a_non_utf8_file(session, client, setup_router_db, data_files):
23472351
# Score set download files
23482352
########################################################################################################################
23492353

2354+
@pytest.mark.parametrize("mapped_variant,has_hgvs_g,has_hgvs_p", [(None, False, False), (TEST_MAPPED_VARIANT_WITH_HGVS_G_EXPRESSION, True, False), (TEST_MAPPED_VARIANT_WITH_HGVS_P_EXPRESSION, False, True)], ids=["without_post_mapped_vrs", "with_post_mapped_hgvs_g", "with_post_mapped_hgvs_p"])
2355+
def test_download_variants_data_file(session, data_provider, client, setup_router_db, data_files, mapped_variant, has_hgvs_g, has_hgvs_p):
2356+
experiment = create_experiment(client)
2357+
score_set = create_seq_score_set(client, experiment["urn"])
2358+
score_set = mock_worker_variant_insertion(client, session, data_provider, score_set, data_files / "scores.csv")
2359+
if mapped_variant is not None:
2360+
create_mapped_variants_for_score_set(session, score_set["urn"], mapped_variant)
2361+
2362+
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None) as worker_queue:
2363+
published_score_set = publish_score_set(client, score_set["urn"])
2364+
worker_queue.assert_called_once()
2365+
2366+
download_scores_csv_response = client.get(
2367+
f"/api/v1/score-sets/{published_score_set['urn']}/variants/data?drop_na_columns=true"
2368+
)
2369+
assert download_scores_csv_response.status_code == 200
2370+
download_scores_csv = download_scores_csv_response.text
2371+
2372+
reader = csv.DictReader(StringIO(download_scores_csv))
2373+
assert sorted(reader.fieldnames) == sorted([
2374+
"accession",
2375+
"hgvs_nt",
2376+
"hgvs_pro",
2377+
"post_mapped_hgvs_g",
2378+
"post_mapped_hgvs_p",
2379+
"score",
2380+
])
2381+
rows = list(reader)
2382+
for row in rows:
2383+
if has_hgvs_g:
2384+
assert row["post_mapped_hgvs_g"] == mapped_variant["post_mapped"]["expressions"][0]["value"]
2385+
else:
2386+
assert row["post_mapped_hgvs_g"] == "NA"
2387+
if has_hgvs_p:
2388+
assert row["post_mapped_hgvs_p"] == mapped_variant["post_mapped"]["expressions"][0]["value"]
2389+
else:
2390+
assert row["post_mapped_hgvs_p"] == "NA"
2391+
23502392

23512393
# Test file doesn't have hgvs_splice so its values are all NA.
23522394
def test_download_scores_file(session, data_provider, client, setup_router_db, data_files):

tests/routers/test_statistics.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from tests.helpers.constants import (
1414
TEST_BIORXIV_IDENTIFIER,
15+
TEST_MINIMAL_MAPPED_VARIANT,
1516
TEST_NT_CDOT_TRANSCRIPT,
1617
TEST_KEYWORDS,
1718
TEST_MEDRXIV_IDENTIFIER,
@@ -64,7 +65,7 @@ def setup_seq_scoreset(setup_router_db, session, data_provider, client, data_fil
6465
unpublished_score_set = mock_worker_variant_insertion(
6566
client, session, data_provider, unpublished_score_set, data_files / "scores.csv"
6667
)
67-
create_mapped_variants_for_score_set(session, unpublished_score_set["urn"])
68+
create_mapped_variants_for_score_set(session, unpublished_score_set["urn"], TEST_MINIMAL_MAPPED_VARIANT)
6869

6970
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None) as worker_queue:
7071
publish_score_set(client, unpublished_score_set["urn"])

0 commit comments

Comments
 (0)