import re import json import fnmatch import pytest from typing import Any import EvaluateContextValue import demistomock as demisto def equals_object(obj1: Any, obj2: Any) -> bool: if type(obj1) is not type(obj2): return False elif isinstance(obj1, dict): for k1, v1 in obj1.items(): if k1 not in obj2: return False if not equals_object(v1, obj2[k1]): return False return not (set(obj1.keys()) ^ set(obj2.keys())) elif isinstance(obj1, list): # Compare lists (ignore order) list2 = list(obj2) for _, v1 in enumerate(obj1): for i2, v2 in enumerate(list2): if equals_object(v1, v2): list2.pop(i2) break else: return False return not list2 else: return obj1 == obj2 class TestEvaluateContextValue: def __side_effect_demisto_dt( self, obj: dict[str, Any], dt: str, ) -> Any: if dt in (".", ".=val"): return obj return demisto.get(obj, dt) def __side_effect_demisto_error(self, err): pass def __return_error( self, message: str, error: str = "", outputs: Any = None, ) -> Any: raise RuntimeError(message) def test_main(self, mocker): mocker.patch.object(demisto, "dt", side_effect=self.__side_effect_demisto_dt) mocker.patch.object(demisto, "error", side_effect=self.__side_effect_demisto_error) with open("./test_data/main.json") as f: test_cases = json.load(f) for case in test_cases: if not isinstance(case, dict): continue mocker.patch.object(demisto, "context", return_value=case.get("context") or {}) mocker.patch.object(demisto, "args", return_value=case.get("args") or {}) mocker.patch.object(EvaluateContextValue, "return_results") mocker.patch.object(EvaluateContextValue, "return_error", side_effect=self.__return_error) if errors := case.get("errors"): with pytest.raises(Exception) as e: EvaluateContextValue.main() assert any(re.match(fnmatch.translate(m), str(e.value)) for m in errors) else: EvaluateContextValue.main() assert EvaluateContextValue.return_results.call_count == 1 command_results = EvaluateContextValue.return_results.call_args[0][0] results_context = command_results.to_context() entry_context = results_context.get("EntryContext") results = entry_context.get("EvaluateContextValue(val.id && val.id == obj.id)") expected = case["results"] assert equals_object(results, expected)