Skip to content

Commit

Permalink
VA-Spec tests for variant annotations
Browse files Browse the repository at this point in the history
  • Loading branch information
bencap committed Feb 12, 2025
1 parent b19f72e commit 66e1f2f
Show file tree
Hide file tree
Showing 2 changed files with 204 additions and 14 deletions.
167 changes: 167 additions & 0 deletions tests/lib/annotation/test_variant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
from unittest.mock import patch
from ga4gh.va_spec.profiles import (
AssayVariantEffectMeasurementStudyResult,
AssayVariantEffectFunctionalClassificationStatement,
AssayVariantEffectClinicalClassificationStatement,
)
from ga4gh.vrs.models import MolecularVariation
from ga4gh.va_spec.profiles.assay_var_effect import AveFunctionalClassification, AveClinicalClassification

from mavedb.lib.annotation.dataset import score_set_to_data_set
from mavedb.lib.annotation.document import variant_to_document, experiment_as_iri, score_set_to_document
from mavedb.lib.annotation.contribution import (
mavedb_api_contribution,
mavedb_vrs_contribution,
mavedb_creator_contribution,
mavedb_modifier_contribution,
)
from mavedb.lib.annotation.variant import (
mapped_variant_to_variant_effect_measurement_study_result,
mapped_variant_to_functional_classification_statement,
mapped_variant_to_clinical_classification_statement,
annotation_for_variant,
)

from tests.helpers.constants import TEST_VALID_POST_MAPPED_VRS_ALLELE


def test_mapped_variant_to_variant_effect_measurement_study_result(mock_mapped_variant):
result = mapped_variant_to_variant_effect_measurement_study_result(mock_mapped_variant)

assert isinstance(result, AssayVariantEffectMeasurementStudyResult)
assert result.score == 1.0
assert result.focusVariant == MolecularVariation(**TEST_VALID_POST_MAPPED_VRS_ALLELE)
assert len(result.sourceDataSet) > 0
assert score_set_to_data_set(mock_mapped_variant.variant.score_set) in result.sourceDataSet
assert len(result.reportedIn) > 0
assert variant_to_document(mock_mapped_variant.variant) in result.reportedIn
assert len(result.contributions) > 0
assert mavedb_api_contribution() in result.contributions
assert mavedb_vrs_contribution(mock_mapped_variant) in result.contributions


def test_mapped_variant_to_functional_classification_statement(mock_mapped_variant):
classification = AveFunctionalClassification.NORMAL
with patch("mavedb.lib.annotation.variant.functional_classification_of_variant", return_value=classification):
result = mapped_variant_to_functional_classification_statement(mock_mapped_variant)

assert isinstance(result, AssayVariantEffectFunctionalClassificationStatement)
assert result.classification == classification
assert result.subjectVariant == MolecularVariation(**TEST_VALID_POST_MAPPED_VRS_ALLELE)
assert experiment_as_iri(mock_mapped_variant.variant.score_set.experiment) == result.objectAssay.root
assert len(result.reportedIn) > 0
assert variant_to_document(mock_mapped_variant.variant) in result.reportedIn
assert score_set_to_document(mock_mapped_variant.variant.score_set) in result.reportedIn
assert len(result.contributions) > 0
assert mavedb_api_contribution() in result.contributions
assert mavedb_vrs_contribution(mock_mapped_variant) in result.contributions
assert (
mavedb_creator_contribution(mock_mapped_variant.variant, mock_mapped_variant.variant.score_set.created_by)
in result.contributions
)
assert (
mavedb_creator_contribution(
mock_mapped_variant.variant.score_set, mock_mapped_variant.variant.score_set.created_by
)
in result.contributions
)
assert (
mavedb_modifier_contribution(
mock_mapped_variant.variant.score_set, mock_mapped_variant.variant.score_set.modified_by
)
in result.contributions
)


def test_mapped_variant_to_functional_classification_statement_classification_is_none(mock_mapped_variant):
with patch("mavedb.lib.annotation.variant.functional_classification_of_variant", return_value=None):
result = mapped_variant_to_functional_classification_statement(mock_mapped_variant)
assert result is None


def test_mapped_variant_to_clinical_classification_statement(mock_mapped_variant):
classification = AveClinicalClassification.BS3_MODERATE
with patch(
"mavedb.lib.annotation.variant.pillar_project_clinical_classification_of_variant",
return_value=classification,
):
result = mapped_variant_to_clinical_classification_statement(mock_mapped_variant)

assert isinstance(result, AssayVariantEffectClinicalClassificationStatement)
assert result.classification == classification
assert result.subjectVariant == MolecularVariation(**TEST_VALID_POST_MAPPED_VRS_ALLELE)
assert experiment_as_iri(mock_mapped_variant.variant.score_set.experiment) == result.objectAssay.root
assert len(result.reportedIn) > 0
assert variant_to_document(mock_mapped_variant.variant) in result.reportedIn
assert score_set_to_document(mock_mapped_variant.variant.score_set) in result.reportedIn
assert len(result.contributions) > 0
assert mavedb_api_contribution() in result.contributions
assert mavedb_vrs_contribution(mock_mapped_variant) in result.contributions
assert (
mavedb_creator_contribution(mock_mapped_variant.variant, mock_mapped_variant.variant.score_set.created_by)
in result.contributions
)
assert (
mavedb_creator_contribution(
mock_mapped_variant.variant.score_set, mock_mapped_variant.variant.score_set.created_by
)
in result.contributions
)
assert (
mavedb_modifier_contribution(
mock_mapped_variant.variant.score_set, mock_mapped_variant.variant.score_set.modified_by
)
in result.contributions
)


def test_mapped_variant_to_clinical_classification_statement_classification_is_none(mock_mapped_variant):
with patch("mavedb.lib.annotation.variant.pillar_project_clinical_classification_of_variant", return_value=None):
result = mapped_variant_to_clinical_classification_statement(mock_mapped_variant)
assert result is None


def test_annotation_for_variant(mock_mapped_variant):
functional_classification = AveFunctionalClassification.ABNORMAL
clinical_classification = AveClinicalClassification.PS3_MODERATE
with (
patch(
"mavedb.lib.annotation.variant.functional_classification_of_variant",
return_value=functional_classification,
),
patch(
"mavedb.lib.annotation.variant.pillar_project_clinical_classification_of_variant",
return_value=clinical_classification,
),
):
result = annotation_for_variant(mock_mapped_variant)
assert isinstance(result, dict)
assert result[mock_mapped_variant.variant.urn]["AssayVariantEffectMeasurementStudyResult"].score == 1.0
assert (
result[mock_mapped_variant.variant.urn][
"AssayVariantEffectFunctionalClassificationStatement"
].classification
== functional_classification
)
assert (
result[mock_mapped_variant.variant.urn]["AssayVariantEffectClinicalClassificationStatement"].classification
== clinical_classification
)


def test_annotation_for_variant_with_no_classifications(mock_mapped_variant):
with (
patch(
"mavedb.lib.annotation.variant.functional_classification_of_variant",
return_value=None,
),
patch(
"mavedb.lib.annotation.variant.pillar_project_clinical_classification_of_variant",
return_value=None,
),
):
result = annotation_for_variant(mock_mapped_variant)
assert isinstance(result, dict)
assert result[mock_mapped_variant.variant.urn]["AssayVariantEffectMeasurementStudyResult"].score == 1.0
assert result[mock_mapped_variant.variant.urn]["AssayVariantEffectFunctionalClassificationStatement"] is None
assert result[mock_mapped_variant.variant.urn]["AssayVariantEffectClinicalClassificationStatement"] is None
51 changes: 37 additions & 14 deletions tests/lib/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from mavedb.models.experiment import Experiment
from mavedb.models.license import License
from mavedb.models.publication_identifier import PublicationIdentifier
from mavedb.models.score_set_publication_identifier import ScoreSetPublicationIdentifierAssociation
from mavedb.models.role import Role
from mavedb.models.taxonomy import Taxonomy
from mavedb.models.score_set import ScoreSet
Expand All @@ -26,6 +27,9 @@
VALID_EXPERIMENT_URN,
VALID_EXPERIMENT_SET_URN,
TEST_PUBMED_IDENTIFIER,
TEST_VALID_POST_MAPPED_VRS_ALLELE,
TEST_SCORE_SET_RANGE,
TEST_SCORE_CALIBRATION,
)


Expand Down Expand Up @@ -67,19 +71,11 @@ def mock_publication():


@pytest.fixture
def mock_mapped_variant():
mv = mock.Mock(spec=MappedVariant)
mv.mapping_api_version = "1.0"
mv.mapped_date = datetime(2023, 1, 1)
return mv


@pytest.fixture
def mock_variant():
variant = mock.Mock(spec=Variant)
variant.urn = f"{VALID_SCORE_SET_URN}#1"
variant.score_set.urn = VALID_SCORE_SET_URN
return variant
def mock_publication_associations(mock_publication):
mv = mock.Mock(spec=ScoreSetPublicationIdentifierAssociation)
mv.publication = mock_publication
mv.primary = True
return [mv]


@pytest.fixture
Expand All @@ -102,14 +98,41 @@ def mock_experiment():


@pytest.fixture
def mock_score_set(mock_user):
def mock_score_set(mock_user, mock_experiment, mock_publication_associations):
score_set = mock.Mock(spec=ScoreSet)
score_set.urn = VALID_SCORE_SET_URN
score_set.score_ranges = TEST_SCORE_SET_RANGE
score_set.score_calibrations = {"pillar_project": TEST_SCORE_CALIBRATION}
score_set.license.short_name = "MIT"
score_set.created_by = mock_user
score_set.modified_by = mock_user
score_set.published_date = datetime(2023, 1, 1)
score_set.title = "Mock score set"
score_set.creation_date = datetime(2023, 1, 2)
score_set.modification_date = datetime(2023, 1, 3)
score_set.experiment = mock_experiment
score_set.publication_identifier_associations = mock_publication_associations
return score_set


@pytest.fixture
def mock_variant(mock_score_set):
variant = mock.Mock(spec=Variant)
variant.urn = f"{VALID_SCORE_SET_URN}#1"
variant.score_set = mock_score_set
variant.data = {"score_data": {"score": 1.0}}
variant.creation_date = datetime(2023, 1, 2)
variant.modification_date = datetime(2023, 1, 3)
return variant


@pytest.fixture
def mock_mapped_variant(mock_variant):
mv = mock.Mock(spec=MappedVariant)
mv.mapping_api_version = "1.0"
mv.mapped_date = datetime(2023, 1, 1)
mv.variant = mock_variant
mv.post_mapped = TEST_VALID_POST_MAPPED_VRS_ALLELE
mv.mapped_date = datetime(2023, 1, 2)
mv.modification_date = datetime(2023, 1, 3)
return mv

0 comments on commit 66e1f2f

Please # to comment.