from typing import Any
import demistomock as demisto
import pytest
from CommonServerPython import * # noqa: F401
def equals_object(obj1, obj2) -> 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 _i1, 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 GetIndicator:
def __init__(self, indicators: list[str]):
self.__indicators = indicators
def get_indicator(self, cmd: str, params: dict[str, Any]) -> list:
indicator = params.get("value")
if indicator in self.__indicators:
return [{"value": indicator}]
return []
@pytest.mark.parametrize(
argnames="encoded_indicators, existing_indicators, encoding, expected_results",
argvalues=[
(
["1.2.3.4"],
["1.2.3.4"],
"none",
[
{
"Indicator": "1.2.3.4",
"EncodedIndicator": "1.2.3.4",
"Exists": True,
}
],
),
(
["MS4yLjMuNA=="],
["1.2.3.4"],
"base64",
[
{
"Indicator": "1.2.3.4",
"EncodedIndicator": "MS4yLjMuNA==",
"Exists": True,
}
],
),
(
["%2C"],
[","],
"url-encoding",
[
{
"Indicator": ",",
"EncodedIndicator": "%2C",
"Exists": True,
}
],
),
(
"1.2.3.4, %2C, www.paloaltonetworks.com",
["1.2.3.4"],
"url-encoding",
[
{
"Indicator": "1.2.3.4",
"EncodedIndicator": "1.2.3.4",
"Exists": True,
},
{
"Indicator": ",",
"EncodedIndicator": "%2C",
"Exists": False,
},
{
"Indicator": "www.paloaltonetworks.com",
"EncodedIndicator": "www.paloaltonetworks.com",
"Exists": False,
},
],
),
(
"%61%61%61, aaa",
["aaa"],
"url-encoding",
[
{
"Indicator": "aaa",
"EncodedIndicator": "aaa",
"Exists": True,
}
],
),
(
"aaa, %61%61%61",
["aaa"],
"url-encoding",
[
{
"Indicator": "aaa",
"EncodedIndicator": "%61%61%61",
"Exists": True,
}
],
),
(
["1.2.3.4"],
[],
"none",
[
{
"Indicator": "1.2.3.4",
"EncodedIndicator": "1.2.3.4",
"Exists": False,
}
],
),
],
)
def test_check_indicators(mocker, encoded_indicators, existing_indicators, encoding, expected_results):
"""
Given:
Indicators to check and expected results
When:
Running script to check indictors.
Then:
Validate the right output returns.
"""
from CheckIndicatorValue import check_indicators
mocker.patch("CheckIndicatorValue.execute_command", side_effect=GetIndicator(existing_indicators).get_indicator)
results = check_indicators(argToList(encoded_indicators), encoding)
assert results == expected_results
def test_main(mocker):
"""
Given:
an indicator that exist in the DB.
When:
Running script to check an indictor.
Then:
Validate the right output returns.
"""
from CheckIndicatorValue import main
encoded_indicator = "1.2.3.4"
decoded_indicator = "1.2.3.4"
mocker.patch.object(
demisto,
"args",
return_value={
"indicator": encoded_indicator,
"encoding": "none",
},
)
mocker.patch("CheckIndicatorValue.execute_command", return_value=[{"value": f"{decoded_indicator}"}])
return_results = mocker.patch("CheckIndicatorValue.return_results")
main()
assert return_results.call_count == 1
results = return_results.call_args[0][0].to_context()
assert equals_object(
results["EntryContext"],
{
"CheckIndicatorValue(val.Indicator && val.Indicator == obj.Indicator)": [
{"Indicator": decoded_indicator, "EncodedIndicator": encoded_indicator, "Exists": True}
]
},
)