aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAlexander Kabui2021-03-16 10:36:58 +0300
committerGitHub2021-03-16 10:36:58 +0300
commit43d1bb7f6cd2b5890d5b3eb7c357caafda25a35c (patch)
tree73683272f32cffc860497a93b5c844c272252e67 /tests
parent995f1dbd081eb64ad177f929615a4edee01cb68f (diff)
downloadgenenetwork3-43d1bb7f6cd2b5890d5b3eb7c357caafda25a35c.tar.gz
Refactor/clean up correlations (#4)
* initial commit for Refactor/clean-up-correlation * add python scipy dependency * initial commit for sample correlation * initial commit for sample correlation endpoint * initial commit for integration and unittest * initial commit for registering correlation blueprint * add and modify unittest and integration tests for correlation * Add compute compute_all_sample_corr method for correlation * add scipy to requirement txt file * add tissue correlation for trait list * add unittest for tissue correlation * add lit correlation for trait list * add unittests for lit correlation for trait list * modify lit correlarion for trait list * add unittests for lit correlation for trait list * add correlation metho in dynamic url * add file format for expected structure input while doing sample correlation * modify input data structure -> add trait id * update tests for sample r correlation * add compute all lit correlation method * add endpoint for computing lit_corr * add unit and integration tests for computing lit corr * add /api/correlation/tissue_corr/{corr_method} endpoint for tissue correlation * add unittest and integration tests for tissue correlation Co-authored-by: BonfaceKilz <bonfacemunyoki@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/integration/test_correlation.py118
-rw-r--r--tests/unit/computations/correlation_test_data/target_dataset.json230
-rw-r--r--tests/unit/computations/correlation_test_data/this_trait_data.json76
-rw-r--r--tests/unit/computations/test_correlation.py399
4 files changed, 785 insertions, 38 deletions
diff --git a/tests/integration/test_correlation.py b/tests/integration/test_correlation.py
index 33e0de9..488a8a4 100644
--- a/tests/integration/test_correlation.py
+++ b/tests/integration/test_correlation.py
@@ -1,57 +1,99 @@
-"""Integration tests for correlation api"""
-
-import os
-import json
-import unittest
+"""module contains integration tests for correlation"""
+from unittest import TestCase
from unittest import mock
-
from gn3.app import create_app
-def file_path(relative_path):
- """getting abs path for file """
- dir_name = os.path.dirname(os.path.abspath(__file__))
- split_path = relative_path.split("/")
- new_path = os.path.join(dir_name, *split_path)
- return new_path
+class CorrelationIntegrationTest(TestCase):
+ """class for correlation integration tests"""
-
-class CorrelationAPITest(unittest.TestCase):
- # currently disable
- """Test cases for the Correlation API"""
def setUp(self):
self.app = create_app().test_client()
- with open(file_path("correlation_data.json")) as json_file:
- self.correlation_data = json.load(json_file)
+ def test_fail(self):
+ """initial method for class that fails"""
+ self.assertEqual(2, 2)
+
+ @mock.patch("gn3.api.correlation.compute_all_sample_correlation")
+ def test_sample_r_correlation(self, mock_compute_samples):
+ """Test /api/correlation/sample_r/{method}"""
+ this_trait_data = {
+ "trait_id": "1455376_at",
+ "trait_sample_data": {
+ "C57BL/6J": "6.138",
+ "DBA/2J": "6.266",
+ "B6D2F1": "6.434",
+ "D2B6F1": "6.55",
+ "BXS2": "6.7"
+ }}
+
+ traits_dataset = [
+ {
+ "trait_id": "14192_at",
+ "trait_sample_data": {
+ "DBA/2J": "7.13",
+ "D2B6F1": "5.65",
+ "BXD2": "1.46"
+ }
+ }
+ ]
+
+ correlation_input_data = {"corr_method": "pearson",
+ "this_trait": this_trait_data,
+ "target_dataset": traits_dataset}
+
+ expected_results = [
+ {
+ "sample_r": "-0.407",
+ "p_value": "6.234e-04"
+ },
+ {
+ "sample_r": "0.398",
+ "sample_p": "8.614e-04"
+ }
+ ]
+
+ mock_compute_samples.return_value = expected_results
+
+ api_response = {
+ "corr_results": expected_results
+ }
+
+ response = self.app.post("/api/correlation/sample_r/pearson",
+ json=correlation_input_data, follow_redirects=True)
- with open(file_path("expected_corr_results.json")) as results_file:
- self.correlation_results = json.load(results_file)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.get_json(), api_response)
- def tearDown(self):
- self.correlation_data = ""
+ @mock.patch("gn3.api.correlation.compute_all_lit_correlation")
+ def test_lit_correlation(self, mock_compute_corr):
+ """Test api/correlation/lit_corr/{species}/{gene_id}"""
- self.correlation_results = ""
+ mock_compute_corr.return_value = []
- @mock.patch("gn3.api.correlation.compute_correlation")
- def test_corr_compute(self, compute_corr):
- """Test that the correct response in correlation"""
+ post_data = [{"gene_id": 8, "lit_corr": 1}, {
+ "gene_id": 12, "lit_corr": 0.3}]
- compute_corr.return_value = self.correlation_results
- response = self.app.post("/api/correlation/corr_compute",
- json=self.correlation_data,
- follow_redirects=True)
+ response = self.app.post(
+ "/api/correlation/lit_corr/mouse/16", json=post_data, follow_redirects=True)
+ self.assertEqual(mock_compute_corr.call_count, 1)
self.assertEqual(response.status_code, 200)
- @mock.patch("gn3.api.correlation.compute_correlation")
- def test_corr_compute_failed_request(self, compute_corr):
- """test taht cormpute requests fails """
+ @mock.patch("gn3.api.correlation.compute_all_tissue_correlation")
+ def test_tissue_correlation(self, mock_tissue_corr):
+ """Test api/correlation/tissue_corr/{corr_method}"""
+ mock_tissue_corr.return_value = {}
- compute_corr.return_value = self.correlation_results
+ primary_dict = {"trait_id": "1449593_at", "tissue_values": [1, 2, 3]}
- response = self.app.post("/api/correlation/corr_compute",
- json=None,
- follow_redirects=True)
+ target_tissue_dict_list = [
+ {"trait_id": "1449593_at", "tissue_values": [1, 2, 3]}]
- self.assertEqual(response.status_code, 400)
+ tissue_corr_input_data = {"primary_tissue": primary_dict,
+ "target_tissues": target_tissue_dict_list}
+
+ response = self.app.post("/api/correlation/tissue_corr/spearman",
+ json=tissue_corr_input_data, follow_redirects=True)
+
+ self.assertEqual(response.status_code, 200)
diff --git a/tests/unit/computations/correlation_test_data/target_dataset.json b/tests/unit/computations/correlation_test_data/target_dataset.json
new file mode 100644
index 0000000..f6757b6
--- /dev/null
+++ b/tests/unit/computations/correlation_test_data/target_dataset.json
@@ -0,0 +1,230 @@
+[
+ {
+ "trait_id":"1425637_at",
+ "sample_data":{
+ "BXD1":7.081,
+ "BXD2":6.912,
+ "BXD5":7.153,
+ "BXD6":6.92,
+ "BXD8":6.886,
+ "BXD9":7.406,
+ "BXD11":6.917,
+ "BXD12":6.914,
+ "BXD13":6.964,
+ "BXD15":6.863,
+ "BXD16":7.06,
+ "BXD19":7.002,
+ "BXD20":7.158,
+ "BXD21":7.039,
+ "BXD22":7.036,
+ "BXD23":6.962,
+ "BXD24":6.946,
+ "BXD27":7.084,
+ "BXD28":7.154,
+ "BXD29":6.932,
+ "BXD31":6.994,
+ "BXD32":6.846,
+ "BXD33":7.078,
+ "BXD34":6.94,
+ "BXD38":6.992,
+ "BXD39":7.048,
+ "BXD40":7.14,
+ "BXD42":6.98,
+ "BXD43":7.072,
+ "BXD44":7.045,
+ "BXD45":6.739,
+ "BXD48":7.07,
+ "BXD48a":6.998,
+ "BXD50":7.053,
+ "BXD51":6.922,
+ "BXD55":6.782,
+ "BXD60":7.042,
+ "BXD61":6.887,
+ "BXD62":6.86,
+ "BXD63":6.815,
+ "BXD64":7.424,
+ "BXD65":7.216,
+ "BXD65a":6.934,
+ "BXD65b":6.893,
+ "BXD66":6.935,
+ "BXD67":6.985,
+ "BXD68":7.044,
+ "BXD69":6.908,
+ "BXD70":6.864,
+ "BXD73":7.074,
+ "BXD73a":6.986,
+ "BXD74":6.914,
+ "BXD75":6.98,
+ "BXD76":6.772,
+ "BXD77":7.121,
+ "BXD79":6.829,
+ "BXD83":7.018,
+ "BXD84":6.948,
+ "BXD85":7.112,
+ "BXD86":6.858,
+ "BXD87":6.865,
+ "BXD89":7.034,
+ "BXD90":6.901,
+ "BXD93":6.97,
+ "BXD94":7.112,
+ "BXD98":6.954,
+ "BXD99":6.912,
+ "C57BL/6J":7.121,
+ "DBA/2J":6.821,
+ "B6D2F1":6.998,
+ "D2B6F1":6.967
+ }
+ },
+ {
+ "trait_id":"1455376_at",
+ "trait_sample_data":{
+ "BXD1":10.929,
+ "BXD2":11.279,
+ "BXD5":11.941,
+ "BXD6":11.407,
+ "BXD8":12.048,
+ "BXD9":11.694,
+ "BXD11":11.534,
+ "BXD12":11.048,
+ "BXD13":12.274,
+ "BXD15":12.077,
+ "BXD16":11.91,
+ "BXD19":11.797,
+ "BXD20":11.67,
+ "BXD21":12.062,
+ "BXD22":12.49,
+ "BXD23":11.957,
+ "BXD24":11.766,
+ "BXD27":13.026,
+ "BXD28":12.184,
+ "BXD29":11.792,
+ "BXD31":12.36,
+ "BXD32":10.608,
+ "BXD33":11.817,
+ "BXD34":11.213,
+ "BXD38":11.212,
+ "BXD39":12.023,
+ "BXD40":12.892,
+ "BXD42":11.518,
+ "BXD43":12.306,
+ "BXD44":11.932,
+ "BXD45":10.982,
+ "BXD48":12.055,
+ "BXD48a":12.572,
+ "BXD50":11.696,
+ "BXD51":11.828,
+ "BXD55":10.523,
+ "BXD60":11.403,
+ "BXD61":11.378,
+ "BXD62":11.887,
+ "BXD63":11.776,
+ "BXD64":12.37,
+ "BXD65":11.122,
+ "BXD65a":10.853,
+ "BXD65b":11.46,
+ "BXD66":11.546,
+ "BXD67":12.198,
+ "BXD68":13.21,
+ "BXD69":11.581,
+ "BXD70":12.338,
+ "BXD73":11.876,
+ "BXD73a":11.75,
+ "BXD74":11.898,
+ "BXD75":11.718,
+ "BXD76":11.926,
+ "BXD77":12.326,
+ "BXD79":12.052,
+ "BXD83":11.478,
+ "BXD84":11.494,
+ "BXD85":11.435,
+ "BXD86":11.476,
+ "BXD87":11.456,
+ "BXD89":11.547,
+ "BXD90":12.452,
+ "BXD93":12.921,
+ "BXD94":11.892,
+ "BXD98":12.614,
+ "BXD99":13.142,
+ "C57BL/6J":12.138,
+ "DBA/2J":11.394,
+ "B6D2F1":11.615,
+ "D2B6F1":11.918
+ }
+ },
+ {
+ "trait_id":"1444351_at",
+ "trait_sample_data":{
+ "BXD1":17.847,
+ "BXD2":15.262,
+ "BXD5":18.054,
+ "BXD6":17.24,
+ "BXD8":15.735,
+ "BXD9":17.876,
+ "BXD11":17.359,
+ "BXD12":17.906,
+ "BXD13":16.084,
+ "BXD15":17.173,
+ "BXD16":15.941,
+ "BXD19":17.721,
+ "BXD20":17.548,
+ "BXD21":17.242,
+ "BXD22":17.012,
+ "BXD23":17.139,
+ "BXD24":17.904,
+ "BXD27":17.008,
+ "BXD28":17.441,
+ "BXD29":17.606,
+ "BXD31":17.35,
+ "BXD32":17.859,
+ "BXD33":17.453,
+ "BXD34":15.924,
+ "BXD38":17.271,
+ "BXD39":18.034,
+ "BXD40":17.844,
+ "BXD42":17.444,
+ "BXD43":17.676,
+ "BXD44":17.71,
+ "BXD45":17.059,
+ "BXD48":17.334,
+ "BXD48a":17.398,
+ "BXD50":17.343,
+ "BXD51":17.514,
+ "BXD55":14.995,
+ "BXD60":18.03,
+ "BXD61":17.628,
+ "BXD62":17.431,
+ "BXD63":16.96,
+ "BXD64":18.199,
+ "BXD65":17.593,
+ "BXD65a":17.49,
+ "BXD65b":17.268,
+ "BXD66":16.602,
+ "BXD67":17.306,
+ "BXD68":17.167,
+ "BXD69":17.706,
+ "BXD70":17.287,
+ "BXD73":17.412,
+ "BXD73a":16.224,
+ "BXD74":16.873,
+ "BXD75":17.202,
+ "BXD76":16.934,
+ "BXD77":17.926,
+ "BXD79":16.55,
+ "BXD83":17.042,
+ "BXD84":17.134,
+ "BXD85":18.021,
+ "BXD86":17.194,
+ "BXD87":17.075,
+ "BXD89":17.511,
+ "BXD90":17.168,
+ "BXD93":17.817,
+ "BXD94":18.04,
+ "BXD98":16.744,
+ "BXD99":17.304,
+ "C57BL/6J":17.084,
+ "DBA/2J":17.316,
+ "B6D2F1":16.964,
+ "D2B6F1":17.086
+ }
+ }
+] \ No newline at end of file
diff --git a/tests/unit/computations/correlation_test_data/this_trait_data.json b/tests/unit/computations/correlation_test_data/this_trait_data.json
new file mode 100644
index 0000000..7c57fdb
--- /dev/null
+++ b/tests/unit/computations/correlation_test_data/this_trait_data.json
@@ -0,0 +1,76 @@
+{
+ "trait_id":"1457784_at",
+ "trait_sample_data":{
+ "BXD1": 6.03,
+ "BXD2": 6.001,
+ "BXD5": 6.154,
+ "BXD6": 6.179,
+ "BXD8": 6.2,
+ "BXD9": 6.062,
+ "BXD11": 6.12,
+ "BXD12": 6.159,
+ "BXD13": 6.153,
+ "BXD15": 6.144,
+ "BXD16": 6.212,
+ "BXD19": 6.206,
+ "BXD20": 6.008,
+ "BXD21": 6.062,
+ "BXD22": 6.042,
+ "BXD23": 6.135,
+ "BXD24": 6.144,
+ "BXD27": 6.316,
+ "BXD28": 6.14,
+ "BXD29": 6.222,
+ "BXD31": 6.211,
+ "BXD32": 5.984,
+ "BXD33": 6.128,
+ "BXD34": 6.086,
+ "BXD38": 6.342,
+ "BXD39": 6.111,
+ "BXD40": 6.136,
+ "BXD42": 6.201,
+ "BXD43": 5.934,
+ "BXD44": 6.116,
+ "BXD45": 6.226,
+ "BXD48": 6.228,
+ "BXD48a": 6.16,
+ "BXD50": 5.92,
+ "BXD51": 6.227,
+ "BXD55": 6.137,
+ "BXD60": 5.932,
+ "BXD61": 6.18,
+ "BXD62": 6.188,
+ "BXD63": 6.134,
+ "BXD64": 6.102,
+ "BXD65": 6.258,
+ "BXD65a": 6.031,
+ "BXD65b": 6.088,
+ "BXD66": 6.07,
+ "BXD67": 6.275,
+ "BXD68": 6.116,
+ "BXD69": 6.031,
+ "BXD70": 6.14,
+ "BXD73": 6.089,
+ "BXD73a": 6.195,
+ "BXD74": 5.971,
+ "BXD75": 5.972,
+ "BXD76": 6.125,
+ "BXD77": 6.107,
+ "BXD79": 6.288,
+ "BXD83": 6.119,
+ "BXD84": 6.102,
+ "BXD85": 5.959,
+ "BXD86": 6.249,
+ "BXD87": 6.172,
+ "BXD89": 6.13,
+ "BXD90": 6.162,
+ "BXD93": 6.19,
+ "BXD94": 6.068,
+ "BXD98": 6.137,
+ "BXD99": 6.252,
+ "C57BL/6J": 6.255,
+ "DBA/2J": 6.14,
+ "B6D2F1": 6.223,
+ "D2B6F1": 6.038
+}
+} \ No newline at end of file
diff --git a/tests/unit/computations/test_correlation.py b/tests/unit/computations/test_correlation.py
new file mode 100644
index 0000000..84b9330
--- /dev/null
+++ b/tests/unit/computations/test_correlation.py
@@ -0,0 +1,399 @@
+"""module contains the tests for correlation"""
+import unittest
+from unittest import TestCase
+from unittest import mock
+
+from collections import namedtuple
+
+from gn3.computations.correlations import normalize_values
+from gn3.computations.correlations import do_bicor
+from gn3.computations.correlations import compute_sample_r_correlation
+from gn3.computations.correlations import compute_all_sample_correlation
+from gn3.computations.correlations import filter_shared_sample_keys
+from gn3.computations.correlations import tissue_lit_corr_for_probe_type
+from gn3.computations.correlations import tissue_correlation_for_trait_list
+from gn3.computations.correlations import lit_correlation_for_trait_list
+from gn3.computations.correlations import fetch_lit_correlation_data
+from gn3.computations.correlations import query_formatter
+from gn3.computations.correlations import map_to_mouse_gene_id
+from gn3.computations.correlations import compute_all_lit_correlation
+from gn3.computations.correlations import compute_all_tissue_correlation
+
+
+class QueryableMixin:
+ """base class for db call"""
+
+ def execute(self, query_options):
+ """base method for execute"""
+ raise NotImplementedError()
+
+ def fetchone(self):
+ """base method for fetching one iten"""
+ raise NotImplementedError()
+
+ def fetchall(self):
+ """base method for fetch all items"""
+ raise NotImplementedError()
+
+
+class IllegalOperationError(Exception):
+ """custom error to raise illegal operation in db"""
+
+ def __init__(self):
+ super().__init__("Operation not permitted!")
+
+
+class DataBase(QueryableMixin):
+ """Class for creating db object"""
+
+ def __init__(self):
+ self.__query_options = None
+ self.__results = None
+
+ def execute(self, query_options):
+ """method to execute an sql query"""
+ self.__query_options = query_options
+ self.results_generator()
+ return self
+
+ def fetchone(self):
+ """method to fetch single item from the db query"""
+ if self.__results is None:
+ raise IllegalOperationError()
+
+ return self.__results[0]
+
+ def fetchall(self):
+ """method for fetching all items from db query"""
+ if self.__results is None:
+ raise IllegalOperationError()
+ return self.__results
+
+ def results_generator(self, expected_results=None):
+ """private method for generating mock results"""
+
+ if expected_results is None:
+ self.__results = [namedtuple("lit_coeff", "val")(x*0.1)
+ for x in range(1, 4)]
+ else:
+ self.__results = expected_results
+
+
+class TestCorrelation(TestCase):
+ """class for testing correlation functions"""
+
+ def test_normalize_values(self):
+ """function to test normalizing values """
+ results = normalize_values([2.3, None, None, 3.2, 4.1, 5],
+ [3.4, 7.2, 1.3, None, 6.2, 4.1])
+
+ expected_results = ([2.3, 4.1, 5], [3.4, 6.2, 4.1], 3)
+
+ self.assertEqual(results, expected_results)
+
+ def test_bicor(self):
+ """test for doing biweight mid correlation """
+
+ results = do_bicor(x_val=[1, 2, 3], y_val=[4, 5, 6])
+
+ self.assertEqual(results, ([1, 2, 3], [4, 5, 6])
+ )
+
+ @mock.patch("gn3.computations.correlations.compute_corr_coeff_p_value")
+ @mock.patch("gn3.computations.correlations.normalize_values")
+ def test_compute_sample_r_correlation(self, norm_vals, compute_corr):
+ """test for doing sample correlation gets the cor\
+ and p value and rho value using pearson correlation"""
+ primary_values = [2.3, 4.1, 5]
+ target_values = [3.4, 6.2, 4.1]
+
+ norm_vals.return_value = ([2.3, 4.1, 5, 4.2, 4, 1.2],
+ [3.4, 6.2, 4, 1.1, 8, 1.1], 6)
+ compute_corr.side_effect = [(0.7, 0.3), (-1.0, 0.9), (1, 0.21)]
+
+ pearson_results = compute_sample_r_correlation(corr_method="pearson",
+ trait_vals=primary_values,
+ target_samples_vals=target_values)
+
+ spearman_results = compute_sample_r_correlation(corr_method="spearman",
+ trait_vals=primary_values,
+ target_samples_vals=target_values)
+
+ bicor_results = compute_sample_r_correlation(corr_method="bicor",
+ trait_vals=primary_values,
+ target_samples_vals=target_values)
+
+ self.assertEqual(bicor_results, (1, 0.21, 6))
+ self.assertEqual(pearson_results, (0.7, 0.3, 6))
+ self.assertEqual(spearman_results, (-1.0, 0.9, 6))
+
+ self.assertIsInstance(
+ pearson_results, tuple, "message")
+ self.assertIsInstance(
+ spearman_results, tuple, "message")
+
+ def test_filter_shared_sample_keys(self):
+ """function to tests shared key between two dicts"""
+
+ this_samplelist = {
+ "C57BL/6J": "6.638",
+ "DBA/2J": "6.266",
+ "B6D2F1": "6.494",
+ "D2B6F1": "6.565",
+ "BXD2": "6.456"
+ }
+
+ target_samplelist = {
+ "DBA/2J": "1.23",
+ "D2B6F1": "6.565",
+ "BXD2": "6.456"
+
+ }
+
+ filtered_target_samplelist = ["1.23", "6.565", "6.456"]
+ filtered_this_samplelist = ["6.266", "6.565", "6.456"]
+
+ results = filter_shared_sample_keys(
+ this_samplelist=this_samplelist, target_samplelist=target_samplelist)
+
+ self.assertEqual(results, (filtered_this_samplelist,
+ filtered_target_samplelist))
+
+ @mock.patch("gn3.computations.correlations.compute_sample_r_correlation")
+ @mock.patch("gn3.computations.correlations.filter_shared_sample_keys")
+ def test_compute_all_sample(self, filter_shared_samples, sample_r_corr):
+ """given target dataset compute all sample r correlation"""
+
+ filter_shared_samples.return_value = (["1.23", "6.565", "6.456"], [
+ "6.266", "6.565", "6.456"])
+ sample_r_corr.return_value = ([-1.0, 0.9, 6])
+
+ this_trait_data = {
+ "trait_id": "1455376_at",
+ "trait_sample_data": {
+ "C57BL/6J": "6.638",
+ "DBA/2J": "6.266",
+ "B6D2F1": "6.494",
+ "D2B6F1": "6.565",
+ "BXD2": "6.456"
+ }}
+
+ traits_dataset = [
+ {
+ "trait_id": "1419792_at",
+ "trait_sample_data": {
+ "DBA/2J": "1.23",
+ "D2B6F1": "6.565",
+ "BXD2": "6.456"
+ }
+ }
+ ]
+
+ sample_all_results = [{"1419792_at": {"corr_coeffient": -1.0,
+ "p_value": 0.9,
+ "num_overlap": 6}}]
+ # ?corr_method: str, trait_vals, target_samples_vals
+
+ self.assertEqual(compute_all_sample_correlation(
+ this_trait=this_trait_data, target_dataset=traits_dataset), sample_all_results)
+ sample_r_corr.assert_called_once_with(
+ corr_method="pearson", trait_vals=['1.23', '6.565', '6.456'],
+ target_samples_vals=['6.266', '6.565', '6.456'])
+ filter_shared_samples.assert_called_once_with(
+ this_trait_data.get("trait_sample_data"), traits_dataset[0].get("trait_sample_data"))
+
+ @unittest.skip("not implemented")
+ def test_tissue_lit_corr_for_probe_type(self):
+ """tests for doing tissue and lit correlation for trait list\
+ if both the dataset and target dataset are probeset runs\
+ on after initial correlation has been done"""
+
+ results = tissue_lit_corr_for_probe_type(
+ corr_type="tissue", top_corr_results={})
+
+ self.assertEqual(results, (None, None))
+
+ @mock.patch("gn3.computations.correlations.compute_corr_coeff_p_value")
+ def test_tissue_correlation_for_trait_list(self, mock_compute_corr_coeff):
+ """test given a primary tissue values for a trait and and a list of\
+ target tissues for traits do the tissue correlation for them"""
+
+ primary_tissue_values = [1.1, 1.5, 2.3]
+ target_tissues_values = [1, 2, 3]
+ mock_compute_corr_coeff.side_effect = [(0.4, 0.9), (-0.2, 0.91)]
+ expected_tissue_results = {
+ 'tissue_corr': 0.4, 'p_value': 0.9, "tissue_number": 3}
+
+ tissue_results = tissue_correlation_for_trait_list(
+ primary_tissue_values, target_tissues_values,
+ corr_method="pearson", compute_corr_p_value=mock_compute_corr_coeff)
+
+ self.assertEqual(tissue_results, expected_tissue_results)
+
+ @mock.patch("gn3.computations.correlations.fetch_lit_correlation_data")
+ @mock.patch("gn3.computations.correlations.map_to_mouse_gene_id")
+ def test_lit_correlation_for_trait_list(self, mock_mouse_gene_id, fetch_lit_data):
+ """fetch results from db call for lit correlation given a trait list\
+ after doing correlation"""
+
+ target_trait_lists = [{"gene_id": 15},
+ {"gene_id": 17},
+ {"gene_id": 11}]
+ mock_mouse_gene_id.side_effect = [12, 11, 18, 16, 20]
+
+ database_instance = namedtuple("database", "execute")("fetchone")
+
+ fetch_lit_data.side_effect = [(15, 9), (17, 8), (11, 12)]
+
+ lit_results = lit_correlation_for_trait_list(
+ database=database_instance, target_trait_lists=target_trait_lists,
+ species="rat", trait_gene_id="12")
+
+ expected_results = [{"gene_id": 15, "lit_corr": 9}, {
+ "gene_id": 17, "lit_corr": 8}, {"gene_id": 11, "lit_corr": 12}]
+
+ self.assertEqual(lit_results, expected_results)
+
+ def test_fetch_lit_correlation_data(self):
+ """test for fetching lit correlation data from\
+ the database where the input and mouse geneid are none"""
+
+ database_instance = DataBase()
+ results = fetch_lit_correlation_data(database=database_instance,
+ gene_id="1",
+ input_mouse_gene_id=None,
+ mouse_gene_id=None)
+
+ self.assertEqual(results, ("1", 0))
+
+ def test_fetch_lit_correlation_data_db_query(self):
+ """test for fetching lit corr coefficent givent the input\
+ input trait mouse gene id and mouse gene id"""
+
+ database_instance = DataBase()
+ expected_results = ("1", 0.1)
+
+ lit_results = fetch_lit_correlation_data(database=database_instance,
+ gene_id="1",
+ input_mouse_gene_id="20",
+ mouse_gene_id="15")
+
+ self.assertEqual(expected_results, lit_results)
+
+ def test_query_lit_correlation_for_db_empty(self):
+ """test that corr coeffient returned is 0 given the\
+ db value if corr coefficient is empty"""
+ database_instance = mock.Mock()
+ database_instance.execute.return_value.fetchone.return_value = None
+
+ lit_results = fetch_lit_correlation_data(database=database_instance,
+ input_mouse_gene_id="12",
+ gene_id="16",
+ mouse_gene_id="12")
+
+ self.assertEqual(lit_results, ("16", 0))
+
+ def test_query_formatter(self):
+ """test for formatting a query given the query string and also the\
+ values"""
+ query = """
+ SELECT VALUE
+ FROM LCorr
+ WHERE GeneId1='%s' and
+ GeneId2='%s'
+ """
+
+ expected_formatted_query = """
+ SELECT VALUE
+ FROM LCorr
+ WHERE GeneId1='20' and
+ GeneId2='15'
+ """
+
+ mouse_gene_id = "20"
+ input_mouse_gene_id = "15"
+
+ query_values = (mouse_gene_id, input_mouse_gene_id)
+
+ formatted_query = query_formatter(query, *query_values)
+
+ self.assertEqual(formatted_query, expected_formatted_query)
+
+ def test_query_formatter_no_query_values(self):
+ """test for formatting a query where there are no\
+ string placeholder"""
+ query = """SELECT * FROM USERS"""
+ formatted_query = query_formatter(query)
+
+ self.assertEqual(formatted_query, query)
+
+ def test_map_to_mouse_gene_id(self):
+ """test for converting a gene id to mouse geneid\
+ given a species which is not mouse"""
+ database_instance = mock.Mock()
+ test_data = [("Human", 14), (None, 9), ("Mouse", 15), ("Rat", 14)]
+
+ database_results = [namedtuple("mouse_id", "mouse")(val)
+ for val in range(12, 20)]
+ results = []
+
+ database_instance.execute.return_value.fetchone.side_effect = database_results
+ expected_results = [12, None, 13, 14]
+ for (species, gene_id) in test_data:
+
+ mouse_gene_id_results = map_to_mouse_gene_id(
+ database=database_instance, species=species, gene_id=gene_id)
+ results.append(mouse_gene_id_results)
+
+ self.assertEqual(results, expected_results)
+
+ @mock.patch("gn3.computations.correlations.lit_correlation_for_trait_list")
+ def test_compute_all_lit_correlation(self, mock_lit_corr):
+ """test for compute all lit correlation which acts\
+ as an abstraction for lit_correlation_for_trait_list
+ and is used in the api/correlation/lit"""
+
+ database = mock.Mock()
+
+ expected_mocked_lit_results = [{"gene_id": 11, "lit_corr": 9}, {
+ "gene_id": 17, "lit_corr": 8}]
+
+ mock_lit_corr.side_effect = expected_mocked_lit_results
+
+ lit_correlation_results = compute_all_lit_correlation(
+ database_instance=database, trait_lists=[{"gene_id": 11}],
+ species="rat", gene_id=12)
+
+ expected_results = {
+ "lit_results": {"gene_id": 11, "lit_corr": 9}
+ }
+
+ self.assertEqual(lit_correlation_results, expected_results)
+
+ @mock.patch("gn3.computations.correlations.tissue_correlation_for_trait_list")
+ def test_compute_all_tissue_correlation(self, mock_tissue_corr):
+ """test for compute all tissue corelation which abstracts
+ api calling the tissue_correlation for trait_list"""
+
+ primary_tissue_dict = {"trait_id": "1419792_at",
+ "tissue_values": [1, 2, 3, 4, 5]}
+
+ target_tissue_dict = [{"trait_id": "1418702_a_at", "tissue_values": [1, 2, 3]},
+ {"trait_id": "1412_at", "tissue_values": [1, 2, 3]}]
+
+ mock_tissue_corr.side_effect = [{"tissue_corr": -0.5, "p_value": 0.9, "tissue_number": 3},
+ {"tissue_corr": 1.11, "p_value": 0.2, "tissue_number": 3}]
+
+ expected_results = {"1418702_a_at":
+ {"tissue_corr": -0.5, "p_value": 0.9, "tissue_number": 3},
+ "1412_at":
+ {"tissue_corr": 1.11, "p_value": 0.2, "tissue_number": 3}}
+
+ results = compute_all_tissue_correlation(
+ primary_tissue_dict=primary_tissue_dict,
+ target_tissues_dict_list=target_tissue_dict,
+ corr_method="pearson")
+
+ self.assertEqual(mock_tissue_corr.call_count, 2)
+
+ self.assertEqual(results, expected_results)