Skip to content

Commit cd0b333

Browse files
committed
Unit tests for recently published score sets API endpoint
1 parent b99c1fd commit cd0b333

3 files changed

Lines changed: 133 additions & 39 deletions

File tree

tests/helpers/util/score_set.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ def create_seq_score_set_with_variants(
165165
count_columns_metadata_json_path,
166166
)
167167

168-
assert score_set["numVariants"] == 3, (
169-
f"Could not create sequence based score set with variants within experiment {experiment_urn}"
170-
)
168+
assert (
169+
score_set["numVariants"] == 3
170+
), f"Could not create sequence based score set with variants within experiment {experiment_urn}"
171171

172172
jsonschema.validate(instance=score_set, schema=ScoreSet.model_json_schema())
173173
return score_set
@@ -196,9 +196,9 @@ def create_acc_score_set_with_variants(
196196
count_columns_metadata_json_path,
197197
)
198198

199-
assert score_set["numVariants"] == 3, (
200-
f"Could not create sequence based score set with variants within experiment {experiment_urn}"
201-
)
199+
assert (
200+
score_set["numVariants"] == 3
201+
), f"Could not create sequence based score set with variants within experiment {experiment_urn}"
202202

203203
jsonschema.validate(instance=score_set, schema=ScoreSet.model_json_schema())
204204
return score_set

tests/routers/test_experiments.py

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,9 @@ def test_cannot_create_experiment_that_keywords_has_endogenous_without_method_me
363363
assert response.status_code == 422
364364
response_data = response.json()
365365
assert (
366-
response_data["detail"]
367-
== "If 'Variant Library Creation Method' is 'Endogenous locus library method', "
368-
"both 'Endogenous Locus Library Method System' and 'Endogenous Locus Library Method Mechanism' "
369-
"must be present."
366+
response_data["detail"] == "If 'Variant Library Creation Method' is 'Endogenous locus library method', "
367+
"both 'Endogenous Locus Library Method System' and 'Endogenous Locus Library Method Mechanism' "
368+
"must be present."
370369
)
371370

372371

@@ -401,10 +400,9 @@ def test_cannot_create_experiment_that_keywords_has_endogenous_without_method_sy
401400
assert response.status_code == 422
402401
response_data = response.json()
403402
assert (
404-
response_data["detail"]
405-
== "If 'Variant Library Creation Method' is 'Endogenous locus library method', "
406-
"both 'Endogenous Locus Library Method System' and 'Endogenous Locus Library Method Mechanism' "
407-
"must be present."
403+
response_data["detail"] == "If 'Variant Library Creation Method' is 'Endogenous locus library method', "
404+
"both 'Endogenous Locus Library Method System' and 'Endogenous Locus Library Method Mechanism' "
405+
"must be present."
408406
)
409407

410408

@@ -478,10 +476,9 @@ def test_cannot_create_experiment_that_keywords_has_in_vitro_without_method_syst
478476
assert response.status_code == 422
479477
response_data = response.json()
480478
assert (
481-
response_data["detail"]
482-
== "If 'Variant Library Creation Method' is 'In vitro construct library method', "
483-
"both 'In Vitro Construct Library Method System' and 'In Vitro Construct Library Method Mechanism' "
484-
"must be present."
479+
response_data["detail"] == "If 'Variant Library Creation Method' is 'In vitro construct library method', "
480+
"both 'In Vitro Construct Library Method System' and 'In Vitro Construct Library Method Mechanism' "
481+
"must be present."
485482
)
486483

487484

@@ -516,10 +513,9 @@ def test_cannot_create_experiment_that_keywords_has_in_vitro_without_method_mech
516513
assert response.status_code == 422
517514
response_data = response.json()
518515
assert (
519-
response_data["detail"]
520-
== "If 'Variant Library Creation Method' is 'In vitro construct library method', "
521-
"both 'In Vitro Construct Library Method System' and 'In Vitro Construct Library Method Mechanism' "
522-
"must be present."
516+
response_data["detail"] == "If 'Variant Library Creation Method' is 'In vitro construct library method', "
517+
"both 'In Vitro Construct Library Method System' and 'In Vitro Construct Library Method Mechanism' "
518+
"must be present."
523519
)
524520

525521

@@ -717,23 +713,28 @@ def test_update_experiment_keywords(session, client, setup_router_db):
717713
assert response.status_code == 200
718714
experiment = response.json()
719715
experiment_post_payload = experiment.copy()
720-
experiment_post_payload.update({"keywords": [
716+
experiment_post_payload.update(
721717
{
722-
"keyword": {
723-
"key": "Phenotypic Assay Profiling Strategy",
724-
"label": "Shotgun sequencing",
725-
"special": False,
726-
"description": "Description"
727-
},
728-
"description": "Details of phenotypic assay profiling strategy",
729-
},
730-
731-
]})
718+
"keywords": [
719+
{
720+
"keyword": {
721+
"key": "Phenotypic Assay Profiling Strategy",
722+
"label": "Shotgun sequencing",
723+
"special": False,
724+
"description": "Description",
725+
},
726+
"description": "Details of phenotypic assay profiling strategy",
727+
},
728+
]
729+
}
730+
)
732731
updated_response = client.put(f"/api/v1/experiments/{experiment['urn']}", json=experiment_post_payload)
733732
assert updated_response.status_code == 200
734733
updated_experiment = updated_response.json()
735734
updated_expected_response = deepcopy(TEST_EXPERIMENT_WITH_UPDATE_KEYWORD_RESPONSE)
736-
updated_expected_response.update({"urn": updated_experiment["urn"], "experimentSetUrn": updated_experiment["experimentSetUrn"]})
735+
updated_expected_response.update(
736+
{"urn": updated_experiment["urn"], "experimentSetUrn": updated_experiment["experimentSetUrn"]}
737+
)
737738
assert sorted(updated_expected_response.keys()) == sorted(updated_experiment.keys())
738739
for key in updated_experiment:
739740
assert (key, updated_expected_response[key]) == (key, updated_experiment[key])
@@ -745,12 +746,21 @@ def test_update_experiment_keywords_case_insensitive(session, client, setup_rout
745746
experiment = create_experiment(client)
746747
experiment_post_payload = experiment.copy()
747748
# Test database has Delivery Method. The updating keyword's key is delivery method.
748-
experiment_post_payload.update({"keywords": [
749+
experiment_post_payload.update(
749750
{
750-
"keyword": {"key": "delivery method", "label": "Other", "special": False, "description": "Description"},
751-
"description": "Details of delivery method",
752-
},
753-
]})
751+
"keywords": [
752+
{
753+
"keyword": {
754+
"key": "delivery method",
755+
"label": "Other",
756+
"special": False,
757+
"description": "Description",
758+
},
759+
"description": "Details of delivery method",
760+
},
761+
]
762+
}
763+
)
754764
response = client.put(f"/api/v1/experiments/{experiment['urn']}", json=experiment_post_payload)
755765
response_data = response.json()
756766
expected_response = deepcopy(TEST_EXPERIMENT_WITH_KEYWORD_RESPONSE)

tests/routers/test_score_set.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,90 @@ def test_cannot_publish_score_set_without_variants(client, setup_router_db):
14141414
assert "cannot publish score set without variant scores" in response_data["detail"]
14151415

14161416

1417+
########################################################################################################################
1418+
# Recently published score sets
1419+
########################################################################################################################
1420+
1421+
1422+
def test_recently_published_returns_empty_list_when_no_score_sets_published(client, setup_router_db):
1423+
response = client.get("/api/v1/score-sets/recently-published")
1424+
assert response.status_code == 200
1425+
assert response.json() == []
1426+
1427+
1428+
def test_recently_published_returns_published_score_sets(session, data_provider, client, setup_router_db, data_files):
1429+
experiment = create_experiment(client)
1430+
score_set_1 = create_seq_score_set(client, experiment["urn"])
1431+
score_set_1 = mock_worker_variant_insertion(client, session, data_provider, score_set_1, data_files / "scores.csv")
1432+
score_set_2 = create_seq_score_set(client, experiment["urn"])
1433+
score_set_2 = mock_worker_variant_insertion(client, session, data_provider, score_set_2, data_files / "scores.csv")
1434+
1435+
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None):
1436+
published_1 = publish_score_set(client, score_set_1["urn"])
1437+
published_2 = publish_score_set(client, score_set_2["urn"])
1438+
1439+
response = client.get("/api/v1/score-sets/recently-published")
1440+
assert response.status_code == 200
1441+
response_data = response.json()
1442+
1443+
returned_urns = [ss["urn"] for ss in response_data]
1444+
assert published_1["urn"] in returned_urns
1445+
assert published_2["urn"] in returned_urns
1446+
1447+
1448+
def test_recently_published_does_not_return_unpublished_score_sets(client, setup_router_db):
1449+
experiment = create_experiment(client)
1450+
create_seq_score_set(client, experiment["urn"])
1451+
1452+
response = client.get("/api/v1/score-sets/recently-published")
1453+
assert response.status_code == 200
1454+
assert response.json() == []
1455+
1456+
1457+
def test_recently_published_respects_limit_parameter(session, data_provider, client, setup_router_db, data_files):
1458+
experiment = create_experiment(client)
1459+
published_urns = []
1460+
for _ in range(3):
1461+
score_set = create_seq_score_set(client, experiment["urn"])
1462+
score_set = mock_worker_variant_insertion(client, session, data_provider, score_set, data_files / "scores.csv")
1463+
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None):
1464+
published = publish_score_set(client, score_set["urn"])
1465+
published_urns.append(published["urn"])
1466+
1467+
response = client.get("/api/v1/score-sets/recently-published?limit=2")
1468+
assert response.status_code == 200
1469+
response_data = response.json()
1470+
assert len(response_data) == 2
1471+
1472+
1473+
def test_recently_published_rejects_limit_exceeding_maximum(client, setup_router_db):
1474+
response = client.get("/api/v1/score-sets/recently-published?limit=21")
1475+
assert response.status_code == 422
1476+
1477+
1478+
def test_recently_published_rejects_limit_of_zero(client, setup_router_db):
1479+
response = client.get("/api/v1/score-sets/recently-published?limit=0")
1480+
assert response.status_code == 422
1481+
1482+
1483+
def test_recently_published_accessible_to_anonymous_user(
1484+
session, data_provider, client, setup_router_db, data_files, anonymous_app_overrides
1485+
):
1486+
experiment = create_experiment(client)
1487+
score_set = create_seq_score_set(client, experiment["urn"])
1488+
score_set = mock_worker_variant_insertion(client, session, data_provider, score_set, data_files / "scores.csv")
1489+
1490+
with patch.object(arq.ArqRedis, "enqueue_job", return_value=None):
1491+
published = publish_score_set(client, score_set["urn"])
1492+
1493+
with DependencyOverrider(anonymous_app_overrides):
1494+
response = client.get("/api/v1/score-sets/recently-published")
1495+
1496+
assert response.status_code == 200
1497+
returned_urns = [ss["urn"] for ss in response.json()]
1498+
assert published["urn"] in returned_urns
1499+
1500+
14171501
def test_cannot_publish_other_user_private_score_set(session, data_provider, client, setup_router_db, data_files):
14181502
experiment = create_experiment(client)
14191503
score_set = create_seq_score_set(client, experiment["urn"])

0 commit comments

Comments
 (0)