GenerateAsBuilt

Generate an as built document, as HTML, based on the running XSOAR instance. Requires an instance of the Demisto API integration configured.

python · Common Scripts

Details

IDGenerateAsBuilt
Languagepython
From Version6.0.0
Docker Imagedemisto/teams:1.0.0.10133006

README

Troubleshooting

Multi-tenant environments should be configured with the Cortex Rest API instance when using this
automation. Make sure the Use tenant parameter (in the Cortex Rest API integration) is checked
to ensure that API calls are made to the current tenant instead of the master tenant.

import demistomock as demisto
import pytest
from GenerateAsBuilt import SortedTableData, TableData


def test_as_html():
    """
    Given:
        - a list of dicts
    When:
        - calling as_html
    Then:
        - validate the html is as expected
    """
    test_data = [{"name": "test", "blah": "test2"}]
    o = TableData(test_data, "Test table")
    r = o.as_html(["name", "blah"])
    assert "<th>name</th>" in r
    assert "<td>test</td>" in r


def test_sort_table():
    """
    Given:
        - a list of dicts
    When:
        - calling sort_table
    Then:
        - validate the list is sorted by the given key
    """
    test_data = [{"name": "btest", "blah": "test2"}, {"name": "Ctest", "blah": "test2"}, {"name": "atest", "blah": "test2"}]
    o = SortedTableData(test_data, "Test table", "name")
    assert o.data[0].get("name") == "atest"
    assert o.data[1].get("name") == "btest"


def test_post_api_request(mocker):
    """
    Given:
        - valid api path and body arguments
    When:
        - calling post_api_request
    Then:
        - validate the response is as expected
    """
    from GenerateAsBuilt import post_api_request

    mocker.patch.object(demisto, "executeCommand", return_value=[{"Contents": {"response": "ok"}}])
    assert post_api_request("/incidents/search", {}) == "ok"


@pytest.mark.parametrize(
    "res, expected", [([{"Contents": {"response": ["ok"]}}], ["ok"]), ([{"Contents": {"response": None}}], None)]
)
def test_get_api_request(mocker, res, expected):
    """
    Given:
        - valid api path
    When:
        - calling get_api_request
    Then:
        - validate the response is as expected
    """
    from GenerateAsBuilt import get_api_request

    mocker.patch.object(demisto, "executeCommand", return_value=res)
    assert get_api_request("/incidents/search") == expected


def test_get_all_incidents(mocker):
    """
    Given:
        - available incidents
    When:
        - calling get_all_incidents
    Then:
        - all available incidents are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import get_all_incidents

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"data": "ok"})
    assert get_all_incidents() == "ok"


def test_get_open_incidents(mocker):
    """
    Given:
        - open incidents
    When:
        - calling get_open_incidents
    Then:
        - all open incidents are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import SingleFieldData, get_open_incidents

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"total": 1000})
    expected = SingleFieldData(f"Open Incidents {7} days", 1000)
    res = get_open_incidents()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_closed_incidents(mocker):
    """
    Given:
        - closed incidents
    When:
        - calling get_closed_incidents
    Then:
        - all closed incidents are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import SingleFieldData, get_closed_incidents

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"total": 1000})
    expected = SingleFieldData(f"Closed Incidents {7} days", 1000)
    res = get_closed_incidents()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_enabled_integrations(mocker):
    """
    Given:
        - enabled integrations
    When:
        - calling get_enabled_integrations
    Then:
        - all enabled integrations are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import SortedTableData, get_enabled_integrations

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"instances": [{"enabled": True, "name": "test"}]})
    expected = SortedTableData([{"enabled": True, "name": "test"}], "Enabled Instances", "name")
    res = get_enabled_integrations(1)
    assert res.name == expected.name
    assert res.data == expected.data


@pytest.mark.parametrize("get_api_request_returned_value", [None, [{"enabled": True, "name": "test"}]])
def test_get_installed_packs(mocker, get_api_request_returned_value):
    """
    Given:
        - installed packs
    When:
        - calling get_installed_packs
    Then:
        - all installed packs are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import SortedTableData, get_installed_packs

    mocker.patch.object(GenerateAsBuilt, "get_api_request", return_value=get_api_request_returned_value)

    result = get_installed_packs()
    if result:
        expected = SortedTableData([{"enabled": True, "name": "test"}], "Installed Content Packs", "name")
        assert result.name == expected.name
        assert result.data == expected.data


def test_get_custom_playbooks(mocker):
    """
    Given:
        - custom playbooks
    When:
        - calling get_custom_playbooks
    Then:
        - all custom playbooks are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import SortedTableData, get_custom_playbooks

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"playbooks": [{"name": "test"}]})
    expected = SortedTableData([{"name": "test", "TotalTasks": 0}], "Custom Playbooks", "name")
    res = get_custom_playbooks()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_custom_reports(mocker):
    """
    Given:
        - custom reports
    When:
        - calling get_custom_reports
    Then:
        - all custom reports are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_custom_reports

    mocker.patch.object(GenerateAsBuilt, "get_api_request", return_value=[{"name": "test"}])
    expected = TableData([{"name": "test"}], "Custom Reports")
    res = get_custom_reports()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_custom_dashboards(mocker):
    """
    Given:
        - custom dashboards
    When:
        - calling get_custom_dashboards
    Then:
        - all custom dashboards are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_custom_dashboards

    mocker.patch.object(GenerateAsBuilt, "get_api_request", return_value={"dashboard": {"name": "test"}})
    expected = TableData([{"name": "test"}], "Custom dashboards")
    res = get_custom_dashboards()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_all_playbooks(mocker):
    """
    Given:
        - available playbooks
    When:
        - calling get_all_playbooks
    Then:
        - all available playbooks are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_all_playbooks

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"playbooks": [{"name": "test"}]})
    expected = TableData([{"name": "test", "TotalTasks": 0}], "All Playbooks")
    res = get_all_playbooks()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_playbook_stats(mocker):
    """
    Given:
        - available playbooks
    When:
        - calling get_playbook_stats
    Then:
        - all available playbooks stats are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_playbook_stats

    mocker.patch.object(
        GenerateAsBuilt, "get_all_incidents", return_value=[{"name": "test", "TotalTasks": 0, "playbookId": "000001"}]
    )

    expected = TableData([{"playbook": "000001", "incidents": 1}], "Playbook Stats")
    res = get_playbook_stats(SortedTableData([{"name": "test", "TotalTasks": 0}], "Custom Playbooks", "name"))

    assert res.name == expected.name
    assert res.data == expected.data


def test_get_playbook_dependencies(mocker):
    """
    Given:
        - available playbooks
    When:
        - calling get_playbook_dependencies
    Then:
        - all available playbooks dependencies are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_playbook_dependencies

    mocker.patch.object(
        GenerateAsBuilt,
        "get_all_playbooks",
        return_value=TableData([{"name": "test", "TotalTasks": 0, "id": "000001"}], "All Playbooks"),
    )
    mocker.patch.object(
        GenerateAsBuilt,
        "post_api_request",
        return_value={"existing": {"playbook": {"000001": [{"ok": "ok", "type": "type", "name": "name"}]}}},
    )

    res = get_playbook_dependencies("test")
    assert res.get("type").name == "types"
    assert res.get("type").data == [{"type": "type", "name": "name", "pack": "Custom"}]


def test_get_custom_automations(mocker):
    """
    Given:
        - custom automations
    When:
        - calling get_custom_automations
    Then:
        - all custom automations are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_custom_automations

    mocker.patch.object(GenerateAsBuilt, "post_api_request", return_value={"scripts": [{"name": "test"}]})
    expected = TableData([{"name": "test"}], "Custom Automations")
    res = get_custom_automations()
    assert res.name == expected.name
    assert res.data == expected.data


def test_get_system_config(mocker):
    """
    Given:
        - system configuration settings
    When:
        - calling get_system_config
    Then:
        - all system configurations are returned
    """
    import GenerateAsBuilt
    from GenerateAsBuilt import TableData, get_system_config

    mocker.patch.object(GenerateAsBuilt, "get_api_request", return_value={"config": [{"name": "test"}]})
    expected = TableData([{"name": "test"}], "System Configuration")
    res = get_system_config()
    assert res.name == expected.name