-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rewrite classification tests to use mock paradigm
- Loading branch information
Showing
2 changed files
with
30 additions
and
116 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,137 +1,55 @@ | ||
import pytest | ||
|
||
from humps import camelize | ||
from sqlalchemy import select | ||
from mavedb.lib.annotation.classification import functional_classification_of_variant | ||
from mavedb.models.variant import Variant as VariantDbModel | ||
from mavedb.models.mapped_variant import MappedVariant as MappedVariantDbModel | ||
from mavedb.models.score_set import ScoreSet as ScoreSetDbModel | ||
from ga4gh.va_spec.profiles.assay_var_effect import AveFunctionalClassification, AveClinicalClassification | ||
from mavedb.lib.annotation.classification import pillar_project_clinical_classification_of_variant | ||
|
||
from tests.helpers.constants import ( | ||
TEST_SCORE_CALIBRATION, | ||
TEST_SCORE_SET_RANGE, | ||
) | ||
from tests.helpers.dependency_overrider import DependencyOverrider | ||
from tests.helpers.util import add_thresholds_to_score_set, create_experiment, create_seq_score_set_with_mapped_variants | ||
|
||
|
||
@pytest.mark.parametrize( | ||
"file_path,expected_classification", | ||
"score,expected_classification", | ||
[ | ||
("scores_indeterminate.csv", AveFunctionalClassification.INDETERMINATE), | ||
("scores_normal.csv", AveFunctionalClassification.NORMAL), | ||
("scores_abnormal.csv", AveFunctionalClassification.ABNORMAL), | ||
(0, AveFunctionalClassification.INDETERMINATE), | ||
(1, AveFunctionalClassification.NORMAL), | ||
(-1, AveFunctionalClassification.ABNORMAL), | ||
], | ||
) | ||
def test_functional_classification_of_variant_with_ranges( | ||
client, session, data_provider, data_files, setup_lib_db, file_path, expected_classification | ||
): | ||
experiment = create_experiment(client) | ||
score_set = create_seq_score_set_with_mapped_variants( | ||
client, | ||
session, | ||
data_provider, | ||
experiment["urn"], | ||
data_files / file_path, | ||
update={"scoreRanges": camelize(TEST_SCORE_SET_RANGE)}, | ||
) | ||
def test_functional_classification_of_variant_with_ranges(mock_mapped_variant, score, expected_classification): | ||
mock_mapped_variant.variant.data["score_data"]["score"] = score | ||
|
||
mapped_variant = session.scalar( | ||
select(MappedVariantDbModel) | ||
.join(VariantDbModel) | ||
.join(ScoreSetDbModel) | ||
.filter(ScoreSetDbModel.urn == score_set["urn"]) | ||
) | ||
assert mapped_variant | ||
|
||
result = functional_classification_of_variant(mapped_variant) | ||
result = functional_classification_of_variant(mock_mapped_variant) | ||
assert result == expected_classification | ||
|
||
|
||
def test_functional_classification_of_variant_without_ranges(client, session, data_provider, data_files, setup_lib_db): | ||
experiment = create_experiment(client) | ||
score_set = create_seq_score_set_with_mapped_variants( | ||
client, | ||
session, | ||
data_provider, | ||
experiment["urn"], | ||
data_files / "scores_normal.csv", | ||
) | ||
|
||
mapped_variant = session.scalar( | ||
select(MappedVariantDbModel) | ||
.join(VariantDbModel) | ||
.join(ScoreSetDbModel) | ||
.filter(ScoreSetDbModel.urn == score_set["urn"]) | ||
) | ||
assert mapped_variant | ||
def test_functional_classification_of_variant_without_ranges(mock_mapped_variant): | ||
mock_mapped_variant.variant.score_set.score_ranges = None | ||
|
||
result = functional_classification_of_variant(mapped_variant) | ||
result = functional_classification_of_variant(mock_mapped_variant) | ||
assert result is None | ||
|
||
|
||
@pytest.mark.parametrize( | ||
"file_path,expected_classification", | ||
"score,expected_classification", | ||
[ | ||
("scores_no_evidence.csv", None), | ||
("scores_b53_supporting.csv", AveClinicalClassification.BS3_SUPPORTING), | ||
("scores_p53_supporting.csv", AveClinicalClassification.PS3_SUPPORTING), | ||
("scores_b53_moderate.csv", AveClinicalClassification.BS3_MODERATE), | ||
("scores_p53_moderate.csv", AveClinicalClassification.PS3_MODERATE), | ||
("scores_b53_strong.csv", AveClinicalClassification.BS3_STRONG), | ||
("scores_p53_strong.csv", AveClinicalClassification.PS3_STRONG), | ||
("scores_b53_very_strong.csv", AveClinicalClassification.BS3_STRONG), | ||
("scores_p53_very_strong.csv", AveClinicalClassification.PS3_STRONG), | ||
(0, None), | ||
(-1, AveClinicalClassification.BS3_SUPPORTING), | ||
(1, AveClinicalClassification.PS3_SUPPORTING), | ||
(-2, AveClinicalClassification.BS3_MODERATE), | ||
(2, AveClinicalClassification.PS3_MODERATE), | ||
(-4, AveClinicalClassification.BS3_STRONG), | ||
(4, AveClinicalClassification.PS3_STRONG), | ||
(-8, AveClinicalClassification.BS3_STRONG), | ||
(8, AveClinicalClassification.PS3_STRONG), | ||
], | ||
) | ||
def test_clinical_classification_of_variant_with_thresholds( | ||
client, session, data_provider, data_files, setup_lib_db, admin_app_overrides, file_path, expected_classification | ||
): | ||
experiment = create_experiment(client) | ||
score_set = create_seq_score_set_with_mapped_variants( | ||
client, | ||
session, | ||
data_provider, | ||
experiment["urn"], | ||
data_files / file_path, | ||
) | ||
def test_clinical_classification_of_variant_with_thresholds(score, mock_mapped_variant, expected_classification): | ||
mock_mapped_variant.variant.data["score_data"]["score"] = score | ||
|
||
with DependencyOverrider(admin_app_overrides): | ||
add_thresholds_to_score_set(client, score_set["urn"], TEST_SCORE_CALIBRATION) | ||
|
||
mapped_variant = session.scalar( | ||
select(MappedVariantDbModel) | ||
.join(VariantDbModel) | ||
.join(ScoreSetDbModel) | ||
.filter(ScoreSetDbModel.urn == score_set["urn"]) | ||
) | ||
assert mapped_variant | ||
|
||
result = pillar_project_clinical_classification_of_variant(mapped_variant) | ||
result = pillar_project_clinical_classification_of_variant(mock_mapped_variant) | ||
assert result == expected_classification | ||
|
||
|
||
def test_clinical_classification_of_variant_without_thresholds( | ||
client, session, data_provider, data_files, setup_lib_db | ||
): | ||
experiment = create_experiment(client) | ||
score_set = create_seq_score_set_with_mapped_variants( | ||
client, | ||
session, | ||
data_provider, | ||
experiment["urn"], | ||
data_files / "scores_p53_supporting.csv", | ||
) | ||
|
||
mapped_variant = session.scalar( | ||
select(MappedVariantDbModel) | ||
.join(VariantDbModel) | ||
.join(ScoreSetDbModel) | ||
.filter(ScoreSetDbModel.urn == score_set["urn"]) | ||
) | ||
assert mapped_variant | ||
def test_clinical_classification_of_variant_without_thresholds(mock_mapped_variant): | ||
mock_mapped_variant.variant.score_set.score_calibrations = None | ||
|
||
result = pillar_project_clinical_classification_of_variant(mapped_variant) | ||
result = pillar_project_clinical_classification_of_variant(mock_mapped_variant) | ||
assert result is None |