import demistomock as demisto # noqa: F401
from CommonServerPython import entryTypes, CommandResults # noqa: F401
import DSPMCheckAndSetErrorEntries
import pytest
ERROR_ENTRY_1 = [{"Contents": "This is the error message 1", "Type": entryTypes["error"]}]
ERROR_ENTRY_2 = [{"Contents": "This is the error message 2", "Type": entryTypes["error"]}]
STD_ENTRY = [{"Contents": "This is the standard message", "Type": 0}]
ERROR_ENTRIES = [ERROR_ENTRY_1, ERROR_ENTRY_2, STD_ENTRY]
WITHOUT_ERROR_ENTRIES = [STD_ENTRY, STD_ENTRY, STD_ENTRY]
UNSUPPORTED_CMD_ERROR_ENTRY = {
"Contents": DSPMCheckAndSetErrorEntries.UNSUPPORTED_COMMAND_MSG,
"Type": entryTypes["error"],
}
def prepare_mocks(mocker, is_xsiam_or_xsoar_saas, args):
mocker.patch.object(demisto, "args", return_value=args)
mocker.patch.object(DSPMCheckAndSetErrorEntries, "is_xsiam_or_xsoar_saas", return_value=is_xsiam_or_xsoar_saas)
mocker.patch.object(
demisto,
"executeCommand",
return_value=ERROR_ENTRIES if is_xsiam_or_xsoar_saas else None,
side_effect=None if is_xsiam_or_xsoar_saas else ERROR_ENTRIES,
)
@pytest.mark.parametrize("is_xsiam_or_xsoar_saas", [True, False])
def test_main_with_explicitly_passed_argument_as_list(mocker, is_xsiam_or_xsoar_saas):
"""
Tests the full flow of the script
Given:
- Entries data
When:
- Two are for error entries and one is for a standard entry
- Entry ids are explicitly passed as an argument
- Passed argument is a list
Then:
- Verify the two error entries' contents are returned
"""
prepare_mocks(
mocker,
is_xsiam_or_xsoar_saas,
args={"entry_id": ["err_entry_id_1", "err_entry_id_2", "std_entry_id_1"]},
)
demisto_args = mocker.spy(demisto, "args")
demisto_results = mocker.spy(demisto, "results")
DSPMCheckAndSetErrorEntries.main()
demisto_args.assert_called_once()
# Set yes or no based on the presence of errors
expected_error_msgs = ["This is the error message 1", "This is the error message 2"]
error_status = "yes" if expected_error_msgs else "no"
if expected_error_msgs:
mocker.patch.object(demisto, "setContext", return_value={"OnError.Message": expected_error_msgs})
demisto_results.assert_called_once_with(error_status)
def test_get_entries_by_ids_raises_value_error(mocker):
"""
Given:
- Entry IDs
- Platform is XSOAR SAAS
When:
- Calling get_entries() method
- `getEntriesByIDs` returns an error entry
Then:
- Verify the method complete as expected.
- Verify executeCommand is called once for `getEntriesByIDs` and 3 times for `getEntry`.
"""
entry_ids = ["err_entry_id_1", "err_entry_id_2", "std_entry_id_1"]
mocker.patch.object(DSPMCheckAndSetErrorEntries, "is_xsiam_or_xsoar_saas", return_value=True)
mocker.patch.object(
demisto,
"executeCommand",
side_effect=[UNSUPPORTED_CMD_ERROR_ENTRY] + ERROR_ENTRIES,
)
assert DSPMCheckAndSetErrorEntries.get_entries(entry_ids) == ERROR_ENTRIES
assert demisto.executeCommand.call_count == 1 + len(entry_ids)
def test_get_errors_with_error_entries():
"""
Given:
- Entries data
When:
- One or more of the entries' types are error type
Then:
- Verify the error entries' contents are returned
"""
error_messages = DSPMCheckAndSetErrorEntries.get_errors(ERROR_ENTRIES)
assert len(error_messages) == 2
assert error_messages[0] == "This is the error message 1"
assert error_messages[1] == "This is the error message 2"
def test_get_errors_without_error_entries():
"""
Given:
- Entries data
When:
- None of the entries' types are error type
Then:
- Verify that no error messages are returned
"""
error_messages = DSPMCheckAndSetErrorEntries.get_errors(WITHOUT_ERROR_ENTRIES)
assert len(error_messages) == 0