about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-04-14 14:35:22 -0500
committerFrederick Muriuki Muriithi2025-04-14 15:06:03 -0500
commit4768b837c24aa3622d87c3c6adff112cb975ab20 (patch)
treefaf0d128c91f8ed15c4c3db6b694b7bc95a6e8f2
parent364265d86c35c0770f6b0a053bb5bdecaf208376 (diff)
downloadgn-uploader-4768b837c24aa3622d87c3c6adff112cb975ab20.tar.gz
Add tests for new difference computation function.
-rw-r--r--tests/uploader/phenotypes/test_misc.py303
-rw-r--r--uploader/phenotypes/misc.py11
2 files changed, 314 insertions, 0 deletions
diff --git a/tests/uploader/phenotypes/test_misc.py b/tests/uploader/phenotypes/test_misc.py
new file mode 100644
index 0000000..f333d66
--- /dev/null
+++ b/tests/uploader/phenotypes/test_misc.py
@@ -0,0 +1,303 @@
+"""Test miscellaneous phenotypes functions."""
+
+import pytest
+
+from uploader.phenotypes.misc import phenotypes_data_differences
+
+__sample_db_phenotypes_data__ = (
+    {
+        "PhenotypeId": 4,
+        "xref_id": 10001,
+        "DataId": 8967043,
+        "data": {
+            "B6D2F1": {"StrainId": 1, "value": None},
+            "C57BL/6J": {"StrainId": 2, "value": None},
+            "DBA/2J": {"StrainId": 3, "value": None},
+            "BXD1": {"StrainId": 4, "value": 61.4},
+            "BXD2": {"StrainId": 5, "value": 49},
+            "BXD5": {"StrainId": 6, "value": 62.5},
+            "BXD6": {"StrainId": 7, "value": 53.1}
+        }
+    },
+    {
+        "PhenotypeId": 10,
+        "xref_id": 10002,
+        "DataId": 8967044,
+        "data": {
+            "B6D2F1": {"StrainId": 1, "value": None},
+            "C57BL/6J": {"StrainId": 2, "value": None},
+            "DBA/2J": {"StrainId": 3, "value": None},
+            "BXD1": {"StrainId": 4, "value": 54.1},
+            "BXD2": {"StrainId": 5, "value": 50.1},
+            "BXD5": {"StrainId": 6, "value": 53.3},
+            "BXD6": {"StrainId": 7, "value": 55.1}
+        }
+    },
+    {
+        "PhenotypeId": 15,
+        "xref_id": 10003,
+        "DataId": 8967045,
+        "data": {
+            "B6D2F1": {"StrainId": 1, "value": None},
+            "C57BL/6J": {"StrainId": 2, "value": None},
+            "DBA/2J": {"StrainId": 3, "value": None},
+            "BXD1": {"StrainId": 4, "value": 483},
+            "BXD2": {"StrainId": 5, "value": 403},
+            "BXD5": {"StrainId": 6, "value": 501},
+            "BXD6": {"StrainId": 7, "value": 403}
+        }
+    },
+    {
+        "PhenotypeId": 20,
+        "xref_id": 10004,
+        "DataId": 8967046,
+        "data": {
+            "B6D2F1": {"StrainId": 1, "value": None},
+            "C57BL/6J": {"StrainId": 2, "value": None},
+            "DBA/2J": {"StrainId": 3, "value": None},
+            "BXD1": {"StrainId": 4, "value": 49.8},
+            "BXD2": {"StrainId": 5, "value": 45.5},
+            "BXD5": {"StrainId": 6, "value": 62.9},
+            "BXD6": {"StrainId": 7, "value": None}
+        }
+    },
+    {
+        "PhenotypeId": 25,
+        "xref_id": 10005,
+        "DataId": 8967047,
+        "data": {
+            "B6D2F1": {"StrainId": 1, "value": None},
+            "C57BL/6J": {"StrainId": 2, "value": None},
+            "DBA/2J": {"StrainId": 3, "value": None},
+            "BXD1": {"StrainId": 4, "value": 46},
+            "BXD2": {"StrainId": 5, "value": 44.9},
+            "BXD5": {"StrainId": 6, "value": 52.5},
+            "BXD6": {"StrainId": 7, "value": None}
+        }
+    })
+
+
+@pytest.mark.unit_test
+@pytest.mark.parametrize(
+    "filedata,dbdata,expected",
+    ((tuple(), tuple(), tuple()), # No data
+
+     # No data difference
+     (({
+             "phenotype_id": 4,
+             "xref_id": 10001,
+             "data": {
+                 "B6D2F1": None,
+                 "C57BL/6J": None,
+                 "DBA/2J": None,
+                 "BXD1": 61.4,
+                 "BXD2": 49,
+                 "BXD5":62.5,
+                 "BXD6": 53.1
+             }
+     },
+          {
+              "phenotype_id": 10,
+              "xref_id": 10002,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 54.1,
+                  "BXD2": 50.1,
+                  "BXD5": 53.3,
+                  "BXD6": 55.1
+              }
+          },
+          {
+              "phenotype_id": 15,
+              "xref_id": 10003,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 483,
+                  "BXD2": 403,
+                  "BXD5": 501,
+                  "BXD6": 403
+              }
+          },
+          {
+              "phenotype_id": 20,
+              "xref_id": 10004,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 49.8,
+                  "BXD2": 45.5,
+                  "BXD5": 62.9,
+                  "BXD6": None
+              }
+          },
+          {
+              "phenotype_id": 25,
+              "xref_id": 10005,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 46,
+                  "BXD2": 44.9,
+                  "BXD5": 52.5,
+                  "BXD6": None
+              }
+          }),
+         __sample_db_phenotypes_data__,
+         tuple()),
+
+     # Change values: No deletions
+     (({
+             "phenotype_id": 4,
+             "xref_id": 10001,
+             "data": {
+                 "B6D2F1": None,
+                 "C57BL/6J": None,
+                 "DBA/2J": None,
+                 "BXD1": 77.2,
+                 "BXD2": 49,
+                 "BXD5":62.5,
+                 "BXD6": 53.1
+             }
+     },
+          {
+              "phenotype_id": 10,
+              "xref_id": 10002,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 54.1,
+                  "BXD2": 50.1,
+                  "BXD5": 53.3,
+                  "BXD6": 55.1
+              }
+          },
+          {
+              "phenotype_id": 15,
+              "xref_id": 10003,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 483,
+                  "BXD2": 403,
+                  "BXD5": 503,
+                  "BXD6": 903
+              }
+          },
+          {
+              "phenotype_id": 20,
+              "xref_id": 10004,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": 1,
+                  "BXD1": 8,
+                  "BXD2": 9,
+                  "BXD5": 62.9,
+                  "BXD6": None
+              }
+          },
+          {
+              "phenotype_id": 25,
+              "xref_id": 10005,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 46,
+                  "BXD2": 44.9,
+                  "BXD5": 52.5,
+                  "BXD6": None
+              }
+          }),
+         __sample_db_phenotypes_data__,
+         ({"PhenotypeId": 4, "xref_id": 10001, "DataId": 8967043, "StrainId": 4,  "value": 77.2},
+          {"PhenotypeId": 15, "xref_id": 10003, "DataId": 8967045, "StrainId": 6, "value": 503},
+          {"PhenotypeId": 15, "xref_id": 10003, "DataId": 8967045, "StrainId": 7, "value": 903},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 3, "value": 1},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 4, "value": 8},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 5, "value": 9})),
+
+     # Changes — with deletions
+     (({
+             "phenotype_id": 4,
+             "xref_id": 10001,
+             "data": {
+                 "B6D2F1": None,
+                 "C57BL/6J": None,
+                 "DBA/2J": None,
+                 "BXD1": None,
+                 "BXD2": 49,
+                 "BXD5":62.5,
+                 "BXD6": 53.1
+             }
+     },
+          {
+              "phenotype_id": 10,
+              "xref_id": 10002,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 54.1,
+                  "BXD2": 50.1,
+                  "BXD5": 53.3,
+                  "BXD6": 55.1
+              }
+          },
+          {
+              "phenotype_id": 15,
+              "xref_id": 10003,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 483,
+                  "BXD2": 403,
+                  "BXD5": None,
+                  "BXD6": None
+              }
+          },
+          {
+              "phenotype_id": 20,
+              "xref_id": 10004,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": 15,
+                  "BXD1": None,
+                  "BXD2": 24,
+                  "BXD5": 62.9,
+                  "BXD6": None
+              }
+          },
+          {
+              "phenotype_id": 25,
+              "xref_id": 10005,
+              "data": {
+                  "B6D2F1": None,
+                  "C57BL/6J": None,
+                  "DBA/2J": None,
+                  "BXD1": 46,
+                  "BXD2": 44.9,
+                  "BXD5": 52.5,
+                  "BXD6": None
+              }
+          }),
+         __sample_db_phenotypes_data__,
+         ({"PhenotypeId": 4, "xref_id": 10001, "DataId": 8967043, "StrainId": 4,  "value": None},
+          {"PhenotypeId": 15, "xref_id": 10003, "DataId": 8967045, "StrainId": 6, "value": None},
+          {"PhenotypeId": 15, "xref_id": 10003, "DataId": 8967045, "StrainId": 7, "value": None},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 3, "value": 15},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 4, "value": None},
+          {"PhenotypeId": 20, "xref_id": 10004, "DataId": 8967046, "StrainId": 5, "value": 24}))))
+def test_phenotypes_data_differences(filedata, dbdata, expected):
+    """Test differences are computed correctly."""
+    assert phenotypes_data_differences(filedata, dbdata) == expected
diff --git a/uploader/phenotypes/misc.py b/uploader/phenotypes/misc.py
new file mode 100644
index 0000000..7003f81
--- /dev/null
+++ b/uploader/phenotypes/misc.py
@@ -0,0 +1,11 @@
+"""Miscellaneous functions handling phenotypes and phenotypes data."""
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+def phenotypes_data_differences(
+        filedata: tuple[dict, ...], dbdata: tuple[dict, ...]
+) -> tuple[dict, ...]:
+    """Compute differences between file data and db data"""
+    return tuple()