about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorBonfaceKilz2021-09-28 11:21:07 +0300
committerGitHub2021-09-28 11:21:07 +0300
commit674dc56b9df38e7cf1bbc65a2fc6bf3cc16f7231 (patch)
treef35b34525843542aca50c4f22c6b62ca59d1a057 /tests
parent0cbb6ecde0315b7d6f021cb17406f5e5197e8a05 (diff)
parent16235188d4ee2ad21a667832baf6cbbea6d8856a (diff)
downloadgenenetwork3-674dc56b9df38e7cf1bbc65a2fc6bf3cc16f7231.tar.gz
Merge pull request #38 from genenetwork/feature/wgcna_analysis
script for wgcna analysis
Diffstat (limited to 'tests')
-rw-r--r--tests/integration/test_wgcna.py73
-rw-r--r--tests/unit/computations/test_wgcna.py160
2 files changed, 233 insertions, 0 deletions
diff --git a/tests/integration/test_wgcna.py b/tests/integration/test_wgcna.py
new file mode 100644
index 0000000..078449d
--- /dev/null
+++ b/tests/integration/test_wgcna.py
@@ -0,0 +1,73 @@
+"""integration tests for wgcna"""
+
+from unittest import TestCase
+from unittest import mock
+
+from gn3.app import create_app
+
+
+class WgcnaIntegrationTest(TestCase):
+    """class contains wgcna integration tests"""
+
+    def setUp(self):
+        self.app = create_app().test_client()
+
+    @mock.patch("gn3.api.wgcna.call_wgcna_script")
+    def test_wgcna_endpoint(self, mock_wgcna_script):
+        """test /api/wgcna/run_wgcna endpoint"""
+
+        wgcna_output_data = {
+            "code": 0,
+            "output": "run script successfully",
+            "data": {
+                "ModEigens": {
+                    "MEturquoise": [
+                        0.0646677768085351,
+                        0.137200224277058,
+                        0.63451113720732,
+                        -0.544002665501479,
+                        -0.489487590361863,
+                        0.197111117570427
+                    ]
+                },
+                "net_colors": {
+                    "X1": "turquoise",
+                    "X2": "turquoise",
+                    "X3": "turquoise",
+                    "X4": "turquoise"
+                },
+                "imageLoc": "/WGCNAoutput_1uujpTIpC.png"
+            }
+        }
+
+        request_data = {
+            "trait_names": [
+                "1455537_at",
+                "1425637_at"
+            ],
+            "trait_sample_data": [
+                {
+                    "129S1/SvImJ": 6.142,
+                    "A/J": 5.31,
+                    "AKR/J": 3.49,
+                    "B6D2F1": 2.899,
+                    "BALB/cByJ": 1.172,
+                    "BALB/cJ": 7.396
+                },
+                {
+                    "129S1/SvImJ": 1.42,
+                    "A/J": 2.31,
+                    "AKR/J": 5.49,
+                    "B6D2F1": 3.899,
+                    "BALB/cByJ": 1.172,
+                    "BALB/cJ": 7.396
+                }
+            ]
+        }
+        mock_wgcna_script.return_value = wgcna_output_data
+
+        response = self.app.post("/api/wgcna/run_wgcna",
+                                 json=request_data, follow_redirects=True)
+
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.get_json(), wgcna_output_data)
diff --git a/tests/unit/computations/test_wgcna.py b/tests/unit/computations/test_wgcna.py
new file mode 100644
index 0000000..ec81d94
--- /dev/null
+++ b/tests/unit/computations/test_wgcna.py
@@ -0,0 +1,160 @@
+"""module contains python code for wgcna"""
+from unittest import TestCase
+from unittest import mock
+
+from gn3.computations.wgcna import dump_wgcna_data
+from gn3.computations.wgcna import compose_wgcna_cmd
+from gn3.computations.wgcna import call_wgcna_script
+
+
+class TestWgcna(TestCase):
+    """test class for wgcna"""
+
+    @mock.patch("gn3.computations.wgcna.run_cmd")
+    @mock.patch("gn3.computations.wgcna.compose_wgcna_cmd")
+    @mock.patch("gn3.computations.wgcna.dump_wgcna_data")
+    def test_call_wgcna_script(self,
+                               mock_dumping_data,
+                               mock_compose_wgcna,
+                               mock_run_cmd):
+        """test for calling wgcna script"""
+
+        # pylint: disable = line-too-long
+        mock_dumping_data.return_value = "/tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json"
+
+        mock_compose_wgcna.return_value = "Rscript/GUIX_PATH/scripts/r_file.R /tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json"
+
+        request_data = {
+            "trait_names": ["1455537_at", "1425637_at", "1449593_at", "1421945_a_at", "1450423_s_at", "1423841_at", "1451144_at"],
+            "trait_sample_data": [
+                {
+                    "129S1/SvImJ": 7.142,
+                    "A/J": 7.31,
+                    "AKR/J": 7.49,
+                    "B6D2F1": 6.899,
+                    "BALB/cByJ": 7.172,
+                    "BALB/cJ": 7.396
+                },
+                {
+                    "129S1/SvImJ": 7.071,
+                    "A/J": 7.05,
+                    "AKR/J": 7.313,
+                    "B6D2F1": 6.999,
+                    "BALB/cByJ": 7.293,
+                    "BALB/cJ": 7.117
+                }]}
+
+        mock_run_cmd_results = {
+
+            "code": 0,
+            "output": "Flagging genes and samples with too many missing values...\n  ..step 1\nAllowing parallel execution with up to 3 working processes.\npickSoftThreshold: will use block size 7.\n pickSoftThreshold: calculating connectivity for given powers...\n   ..working on genes 1 through 7 of 7\n   Flagging genes and samples with too many missing values...\n    ..step 1\n ..Working on block 1 .\n    TOM calculation: adjacency..\n    ..will not use multithreading.\nclustering..\n ....detecting modules..\n ....calculating module eigengenes..\n ....checking kME in modules..\n ..merging modules that are too close..\n     mergeCloseModules: Merging modules whose distance is less than 0.15\n     mergeCloseModules: less than two proper modules.\n      ..color levels are turquoise\n      ..there is nothing to merge.\n       Calculating new MEs...\n"
+        }
+
+        json_output = "{\"inputdata\":{\"trait_sample_data \":{},\"minModuleSize\":30,\"TOMtype\":\"unsigned\"},\"outputdata\":{\"eigengenes\":[],\"colors\":[]}}"
+
+        expected_output = {
+
+            "data": {
+                "inputdata": {
+                    "trait_sample_data ": {},
+                    "minModuleSize": 30,
+                    "TOMtype": "unsigned"
+                },
+
+                "outputdata": {
+                    "eigengenes": [],
+                    "colors": []
+                }
+            },
+
+            **mock_run_cmd_results
+
+        }
+
+        with mock.patch("builtins.open", mock.mock_open(read_data=json_output)):
+
+            mock_run_cmd.return_value = mock_run_cmd_results
+
+            results = call_wgcna_script(
+                "Rscript/GUIX_PATH/scripts/r_file.R", request_data)
+
+            mock_dumping_data.assert_called_once_with(request_data)
+
+            mock_compose_wgcna.assert_called_once_with(
+                "Rscript/GUIX_PATH/scripts/r_file.R",
+                "/tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json")
+
+            mock_run_cmd.assert_called_once_with(
+                "Rscript/GUIX_PATH/scripts/r_file.R /tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json")
+
+            self.assertEqual(results, expected_output)
+
+    @mock.patch("gn3.computations.wgcna.run_cmd")
+    @mock.patch("gn3.computations.wgcna.compose_wgcna_cmd")
+    @mock.patch("gn3.computations.wgcna.dump_wgcna_data")
+    def test_call_wgcna_script_fails(self, mock_dumping_data, mock_compose_wgcna, mock_run_cmd):
+        """test for calling wgcna script\
+        fails and generates the expected error"""
+        # pylint: disable = line-too-long,
+        mock_dumping_data.return_value = "/tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json"
+
+        mock_compose_wgcna.return_value = "Rscript/GUIX_PATH/scripts/r_file.R /tmp/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc-test.json"
+
+        expected_error = {
+            "code": 2,
+            "output": "could not read the json file"
+        }
+
+        with mock.patch("builtins.open", mock.mock_open(read_data="")):
+
+            mock_run_cmd.return_value = expected_error
+            self.assertEqual(call_wgcna_script(
+                "input_file.R", ""), expected_error)
+
+    def test_compose_wgcna_cmd(self):
+        """test for composing wgcna cmd"""
+        wgcna_cmd = compose_wgcna_cmd(
+            "wgcna.r", "/tmp/wgcna.json")
+        self.assertEqual(
+            wgcna_cmd, "Rscript ./scripts/wgcna.r  /tmp/wgcna.json")
+
+    @mock.patch("gn3.computations.wgcna.TMPDIR", "/tmp")
+    @mock.patch("gn3.computations.wgcna.uuid.uuid4")
+    def test_create_json_file(self, file_name_generator):
+        """test for writing the data to a csv file"""
+        # # All the traits we have data for (should not contain duplicates)
+        # All the strains we have data for (contains duplicates)
+
+        trait_sample_data = {"1425642_at": {"129S1/SvImJ": 7.142,
+                                            "A/J": 7.31, "AKR/J": 7.49,
+                                            "B6D2F1": 6.899, "BALB/cByJ": 7.172,
+                                            "BALB/cJ": 7.396},
+                             "1457784_at": {"129S1/SvImJ": 7.071, "A/J": 7.05,
+                                            "AKR/J": 7.313,
+                                            "B6D2F1": 6.999, "BALB/cByJ": 7.293,
+                                            "BALB/cJ": 7.117},
+                             "1444351_at": {"129S1/SvImJ": 7.221, "A/J": 7.246,
+                                            "AKR/J": 7.754,
+                                            "B6D2F1": 6.866, "BALB/cByJ": 6.752,
+                                            "BALB/cJ": 7.269}
+
+                             }
+
+        expected_input = {
+            "trait_sample_data": trait_sample_data,
+            "TOMtype": "unsigned",
+            "minModuleSize": 30
+        }
+
+        with mock.patch("builtins.open", mock.mock_open()) as file_handler:
+
+            file_name_generator.return_value = "facb73ff-7eef-4053-b6ea-e91d3a22a00c"
+
+            results = dump_wgcna_data(
+                expected_input)
+
+            file_handler.assert_called_once_with(
+                "/tmp/facb73ff-7eef-4053-b6ea-e91d3a22a00c.json", 'w')
+
+            self.assertEqual(
+                results, "/tmp/facb73ff-7eef-4053-b6ea-e91d3a22a00c.json")