Skip to content

Commit

Permalink
Merge pull request #42 from monarch-initiative/qc_diff_unit_tests
Browse files Browse the repository at this point in the history
QC diff unit tests
  • Loading branch information
amc-corey-cox committed Oct 21, 2022
2 parents ee35305 + 5e2e870 commit 9f1c05c
Show file tree
Hide file tree
Showing 5 changed files with 421 additions and 99 deletions.
32 changes: 27 additions & 5 deletions cat_merge/qc_diff_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,19 +111,30 @@ def diff_type(

@validate_diff_args
def diff_dict(a: Union[Dict, None], b: Union[Dict, None], flags: Dict) -> Dict:
if a is None or b is None:
change = True
else:
change = False

diff = {}
a = {} if a is None else a
b = {} if b is None else b
missing = ""
change = False

for key in dict.fromkeys(list(a.keys()), list(b.keys())):
missing = ""
for key in dict.fromkeys(list(a.keys()) + list(b.keys())):
if key not in a.keys():
missing = "-"
elif key not in b.keys():
missing = "+"
diff_value = diff_type(a.get(key), b.get(key), flags)
if flags["change"] or flags["show_all"]:

if a.get(key) is None and b.get(key) is None:
diff_value = None
if not (key in a.keys() and key in b.keys()):
flags['change'] = True
else:
diff_value = diff_type(a.get(key), b.get(key), flags)

if flags["change"] or flags["show_all"] or missing != "":
diff[missing + key] = diff_value
change = any([change, flags["change"]])
flags["change"] = False
Expand All @@ -137,6 +148,12 @@ def diff_list(a: Union[List, None], b: Union[List, None], flags: Dict) -> List:
diff = []
a = [] if a is None else a
b = [] if b is None else b

# Check if either list contains a list
if any(isinstance(n, list) and len(n) == 0 for n in a + b):
message = "diff_list: found list containing list, structure not supported."
raise NotImplementedError(message)

a_as_keys = dict(zip(a, a))
b_as_keys = dict(zip(b, b))

Expand Down Expand Up @@ -230,6 +247,11 @@ def sources_dict(a: Union[Dict, List[Dict]]) -> Dict:
case None:
pass
case list():
if not all(isinstance(x, dict) for x in a):
# all list entries must be dict
message = "sources_dict: List contains non-dict entries, aborting"
raise ValueError(message)

for i in a:
if i.get("name") is not None:
a_dict[i.get("name")] = i
Expand Down
10 changes: 6 additions & 4 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ def value(df: DataFrame, id: str, column: str):


def flags_params():
params = {"change_T_show_T": {"change": True, "show_all": True},
"change_F_show_T": {"change": False, "show_all": True},
"change_T_show_F": {"change": True, "show_all": False},
"change_F_show_F": {"change": False, "show_all": False}}
params = {
# "change_T_show_T": {"change": True, "show_all": True},
"change_F_show_T": {"change": False, "show_all": True},
# "change_T_show_F": {"change": True, "show_all": False},
"change_F_show_F": {"change": False, "show_all": False},
}
return copy.deepcopy(params)


Expand Down
105 changes: 105 additions & 0 deletions tests/unit/test_diff_dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import pytest
from tests.test_utils import *
from cat_merge.qc_diff_utils import diff_dict
from typing import Dict


@pytest.fixture
def dict1() -> Dict:
return {'item1': None, 'item7': 'item7', 'item2': 'item2'}


def test_diff_dict_none(dict1, flags):
assert diff_dict(None, dict1, flags) == {'-item1': None, '-item7': '-item7', '-item2': '-item2'}
assert flags["change"] is True
flags['change'] = False

assert diff_dict(dict1, None, flags) == {'+item1': None, '+item7': '+item7', '+item2': '+item2'}
assert flags["change"] is True


@pytest.fixture
def dict1_copy() -> Dict:
return {'item1': None, 'item7': 'item7', 'item2': 'item2'}


def test_diff_dict_match(dict1, dict1_copy, flags):
if flags["show_all"]:
assert diff_dict(dict1, dict1_copy, flags) == {'item1': None, 'item7': 'item7', 'item2': 'item2'}
assert flags["change"] is False
assert diff_dict(dict1_copy, dict1, flags) == {'item1': None, 'item7': 'item7', 'item2': 'item2'}
assert flags["change"] is False
else:
assert diff_dict(dict1, dict1_copy, flags) == dict()
assert flags["change"] is False
assert diff_dict(dict1_copy, dict1, flags) == dict()
assert flags["change"] is False


@pytest.fixture
def empty_dict() -> Dict:
return dict()


def test_diff_dict_empty(empty_dict, dict1, flags):
assert diff_dict(None, empty_dict, flags) == dict()
assert flags["change"] is True
flags['change'] = False

assert diff_dict(empty_dict, None, flags) == dict()
assert flags["change"] is True
flags['change'] = False

assert diff_dict(empty_dict, dict1, flags) == {'-item1': None, '-item7': '-item7', '-item2': '-item2'}
assert flags["change"] is True
flags['change'] = False

assert diff_dict(dict1, empty_dict, flags) == {'+item1': None, '+item7': '+item7', '+item2': '+item2'}
assert flags["change"] is True
flags['change'] = False


@pytest.fixture
def dict_val_none() -> Dict:
return {"one": None}


def test_diff_dict_val_none(dict_val_none, empty_dict, flags):
assert diff_dict(dict_val_none, empty_dict, flags) == {"+one": None}
assert flags['change'] is True
flags["change"] = False

assert diff_dict(empty_dict, dict_val_none, flags) == {"-one": None}
assert flags['change'] is True
flags["change"] = False

assert diff_dict(None, dict_val_none, flags) == {"-one": None}
assert flags['change'] is True
flags["change"] = False

assert diff_dict(dict_val_none, None, flags) == {"+one": None}
assert flags['change'] is True
flags["change"] = False


@pytest.fixture
def dict2() -> Dict:
return {'item7': 'item7', 'item1': None, 'item3': 'item3'}


def test_diff_dict_partial_match(dict1, dict2, flags):
if flags["show_all"]:
assert diff_dict(dict1, dict2, flags) == \
{'item1': None, 'item7': 'item7', '+item2': '+item2', '-item3': '-item3'}
assert flags["change"] is True

flags["change"] = False
assert list(diff_dict(dict1, dict2, flags).keys()) == ['item1', 'item7', '+item2', '-item3']
assert flags["change"] is True
else:
assert diff_dict(dict1, dict2, flags) == {'+item2': '+item2', '-item3': '-item3'}
assert flags["change"] is True

flags["change"] = False
assert list(diff_dict(dict1, dict2, flags).keys()) == ['+item2', '-item3']
assert flags["change"] is True
Loading

0 comments on commit 9f1c05c

Please sign in to comment.