about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/test_rqtl2.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/tests/unit/test_rqtl2.py b/tests/unit/test_rqtl2.py
new file mode 100644
index 0000000..5e4f657
--- /dev/null
+++ b/tests/unit/test_rqtl2.py
@@ -0,0 +1,109 @@
+"""Module contains the unittest for rqtl2 functions  """
+# pylint: disable=C0301
+from unittest import mock
+import pytest
+from gn3.computations.rqtl2 import compose_rqtl2_cmd
+from gn3.computations.rqtl2 import generate_rqtl2_files
+from gn3.computations.rqtl2 import prepare_files
+from gn3.computations.rqtl2 import validate_required_keys
+
+
+@pytest.mark.unit_test
+@mock.patch("gn3.computations.rqtl2.write_to_csv")
+def test_generate_rqtl2_files(mock_write_to_csv):
+    """Test for generating rqtl2 files from set of inputs"""
+
+    mock_write_to_csv.side_effect = (
+        "/tmp/workspace/geno_file.csv",
+        "/tmp/workspace/pheno_file.csv"
+    )
+    data = {"crosstype": "riself",
+            "geno_data": [],
+            "pheno_data":  [],
+            "alleles": ["L", "C"],
+            "geno_codes": {
+                "L": 1,
+                "C": 2
+            },
+            "na.strings": ["-", "NA"]
+            }
+
+    test_results = generate_rqtl2_files(data, "/tmp/workspace")
+    expected_results = {"geno_file": "/tmp/workspace/geno_file.csv",
+                        "pheno_file": "/tmp/workspace/pheno_file.csv",
+                        **data
+                        }
+    assert test_results == expected_results
+
+
+@pytest.mark.unit_test
+def test_validate_required_keys():
+    """Test to validate required keys are in a dataset"""
+    required_keys = ["geno_data", "pheno_data", "geno_codes"]
+    assert ((False,
+            "Required key(s) missing: geno_data, pheno_data, geno_codes")
+            == validate_required_keys(required_keys, {})
+            )
+    assert ((True,
+            "")
+            == validate_required_keys(required_keys, {
+                "geno_data": [],
+                "pheno_data": [],
+                "geno_codes": {}
+            })
+            )
+
+
+@pytest.mark.unit_test
+def test_compose_rqtl2_cmd():
+    """Test for composing rqtl2 command"""
+    input_file = "/tmp/575732e-691e-49e5-8d82-30c564927c95/input_file.json"
+    output_file = "/tmp/575732e-691e-49e5-8d82-30c564927c95/output_file.json"
+    directory = "/tmp/575732e-691e-49e5-8d82-30c564927c95"
+    expected_results = f"Rscript /rqtl2_wrapper.R --input_file {input_file} --directory {directory} --output_file {output_file} --nperm 12 --threshold 0.05 --cores 1"
+
+    # test for using default configs
+    assert compose_rqtl2_cmd(rqtl_path="/rqtl2_wrapper.R",
+                             input_file=input_file,
+                             output_file=output_file,
+                             workspace_dir=directory,
+                             data={
+                                 "nperm": 12,
+                                 "threshold": 0.05
+                             },
+                             config={}) == expected_results
+
+    # test for default permutation  and threshold and  custom configs
+    expected_results = f"/bin/rscript /rqtl2_wrapper.R --input_file {input_file} --directory {directory} --output_file {output_file} --nperm 0 --threshold 1 --cores 12"
+    assert (compose_rqtl2_cmd(rqtl_path="/rqtl2_wrapper.R",
+                              input_file=input_file,
+                              output_file=output_file,
+                              workspace_dir=directory,
+                              data={},
+                              config={"MULTIPROCESSOR_PROCS": 12, "RSCRIPT": "/bin/rscript"})
+            == expected_results)
+
+
+@pytest.mark.unit_test
+@mock.patch("gn3.computations.rqtl2.os.makedirs")
+@mock.patch("gn3.computations.rqtl2.create_file")
+@mock.patch("gn3.computations.rqtl2.uuid")
+def test_preparing_rqtl_files(mock_uuid, mock_create_file, mock_mkdir):
+    """test to create required rqtl files"""
+    mock_create_file.return_value = None
+    mock_mkdir.return_value = None
+    mock_uuid.uuid4.return_value = "2fc75611-1524-418e-970f-67f94ea09846"
+    assert (
+        (
+            "/tmp/2fc75611-1524-418e-970f-67f94ea09846",
+            "/tmp/2fc75611-1524-418e-970f-67f94ea09846/rqtl2-input-2fc75611-1524-418e-970f-67f94ea09846.json",
+            "/tmp/2fc75611-1524-418e-970f-67f94ea09846/rqtl2-output-2fc75611-1524-418e-970f-67f94ea09846.json",
+            "/tmp/rqtl2-log-2fc75611-1524-418e-970f-67f94ea09846"
+        ) == prepare_files(tmpdir="/tmp/")
+    )
+    # assert method to create files is called
+    expected_calls = [mock.call("/tmp/2fc75611-1524-418e-970f-67f94ea09846/rqtl2-input-2fc75611-1524-418e-970f-67f94ea09846.json"),
+                      mock.call(
+                          "/tmp/2fc75611-1524-418e-970f-67f94ea09846/rqtl2-output-2fc75611-1524-418e-970f-67f94ea09846.json"),
+                      mock.call("/tmp/rqtl2-log-2fc75611-1524-418e-970f-67f94ea09846")]
+    mock_create_file.assert_has_calls(expected_calls)