aboutsummaryrefslogtreecommitdiff
"""Test partial correlations"""
from unittest import mock

import pytest

from gn3.computations.partial_correlations import partial_correlations_with_target_db

@pytest.mark.integration_test
@pytest.mark.parametrize(
    "post_data", (
        None, {}, {
            "primary_trait": None,
            "control_traits": None,
            "method": None,
            "target_db": None
        }, {
            "primary_trait": None,
            "control_traits": None,
            "method": None,
            "target_db": "a_db"
        }, {
            "primary_trait": None,
            "control_traits": None,
            "method": "a_method",
            "target_db": None
        }, {
            "primary_trait": None,
            "control_traits": None,
            "method": "a_method",
            "target_db": "a_db"
        }, {
            "primary_trait": None,
            "control_traits": ["a_trait", "another"],
            "method": None,
            "target_db": None
        }, {
            "primary_trait": None,
            "control_traits": ["a_trait", "another"],
            "method": None,
            "target_db": "a_db"
        }, {
            "primary_trait": None,
            "control_traits": ["a_trait", "another"],
            "method": "a_method",
            "target_db": None
        }, {
            "primary_trait": None,
            "control_traits": ["a_trait", "another"],
            "method": "a_method",
            "target_db": "a_db"
        }, {
            "primary_trait": "a_trait",
            "control_traits": None,
            "method": None,
            "target_db": None
        }, {
            "primary_trait": "a_trait",
            "control_traits": None,
            "method": None,
            "target_db": "a_db"
        }, {
            "primary_trait": "a_trait",
            "control_traits": None,
            "method": "a_method",
            "target_db": None
        }, {
            "primary_trait": "a_trait",
            "control_traits": None,
            "method": "a_method",
            "target_db": "a_db"
        }, {
            "primary_trait": "a_trait",
            "control_traits": ["a_trait", "another"],
            "method": None,
            "target_db": None
        }, {
            "primary_trait": "a_trait",
            "control_traits": ["a_trait", "another"],
            "method": None,
            "target_db": "a_db"
        }, {
            "primary_trait": "a_trait",
            "control_traits": ["a_trait", "another"],
            "method": "a_method",
            "target_db": None
        }))
def test_partial_correlation_api_with_missing_request_data(client, post_data):
    """
    Test /api/correlations/partial endpoint with various expected request data
    missing.
    """
    response = client.post("/api/correlation/partial", json=post_data)
    assert (
        response.status_code == 400 and response.is_json and
        response.json.get("status") == "error")

@pytest.mark.integration_test
@pytest.mark.slow
@pytest.mark.parametrize(
    "post_data",
    ({# ProbeSet
        "primary_trait": {"dataset": "a_dataset", "trait_name": "a_name"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }, {# Publish
        "primary_trait": {
            "dataset": "a_Publish_dataset", "trait_name": "a_name"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }, {# Geno
        "primary_trait": {"dataset": "a_Geno_dataset", "trait_name": "a_name"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }, {# Temp
        "primary_trait": {"dataset": "a_Temp_dataset", "trait_name": "a_name"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }))
def test_partial_correlation_api_with_non_existent_primary_traits(
        client, post_data, mocker):
    """
    Check that the system responds appropriately in the case where the user
    makes a request with a non-existent primary trait.
    """
    mocker.patch("gn3.api.correlation.redis.Redis", mock.MagicMock())
    response = client.post("/api/correlation/partial", json=post_data)
    assert (
        response.status_code == 200 and response.is_json and
        response.json.get("status") == "success")

@pytest.mark.integration_test
@pytest.mark.slow
@pytest.mark.parametrize(
    "post_data",
    ({# ProbeSet
        "primary_trait": {
            "dataset": "UCLA_BXDBXH_CARTILAGE_V2",
            "trait_name": "ILM103710672"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }, {# Publish
        "primary_trait": {"dataset": "BXDPublish", "trait_name": "BXD_12557"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }, {# Geno
        "primary_trait": {"dataset": "AKXDGeno", "trait_name": "D4Mit16"},
        "control_traits": [
            {"dataset": "a_dataset", "trait_name": "a_name"},
            {"dataset": "a_dataset2", "trait_name": "a_name2"}],
        "method": "a_method",
        "target_db": "a_db"
    }
     # Temp -- the data in the database for these is ephemeral, making it
     #         difficult to test for this
     ))
def test_partial_correlation_api_with_non_existent_control_traits(client, post_data, mocker):
    """
    Check that the system responds appropriately in the case where the user
    makes a request with a non-existent control traits.

    The code repetition here is on purpose - valuing clarity over succinctness.
    """
    mocker.patch("gn3.api.correlation.redis.Redis", mock.MagicMock())
    response = client.post("/api/correlation/partial", json=post_data)
    assert (
        response.status_code == 200 and response.is_json and
        response.json.get("status") == "success")

@pytest.mark.integration_test
@pytest.mark.slow
@pytest.mark.parametrize(
    "primary,controls,method,target", (
        (# Probeset
            "UCLA_BXDBXH_CARTILAGE_V2::ILM103710672", (
                "UCLA_BXDBXH_CARTILAGE_V2::nonExisting01",
                "UCLA_BXDBXH_CARTILAGE_V2::nonExisting02",
                "UCLA_BXDBXH_CARTILAGE_V2::ILM380019"),
            "Genetic Correlation, Pearson's r", "BXDPublish"),
        (# Publish
            "BXDPublish::17937", (
                "BXDPublish::17940",
                "BXDPublish::nonExisting03"),
            "Genetic Correlation, Spearman's rho", "BXDPublish"),
        (# Geno
            "AKXDGeno::D4Mit16", (
                "AKXDGeno::D1Mit170",
                "AKXDGeno::nonExisting04",
                "AKXDGeno::D1Mit135",
                "AKXDGeno::nonExisting05",
                "AKXDGeno::nonExisting06"),
            "SGO Literature Correlation", "BXDPublish")
    )
    # Temp -- the data in the database for these is ephemeral, making it
    #         difficult to test for these without a temp database with the temp
    #         traits data set to something we are in control of
     )
def test_part_corr_api_with_mix_of_existing_and_non_existing_control_traits(
        db_conn, primary, controls, method, target):
    """
    Check that calling the function with a mix of existing and missing control
    traits raises an warning.
    """
    criteria = 10
    with pytest.warns(UserWarning):
        partial_correlations_with_target_db(
            db_conn, primary, controls, method, criteria, target)