import json
import demistomock as demisto # noqa: F401
import pytest
from CommonServerPython import * # noqa: F401
from PCComputeHostComplianceIssuesButton import (
filter_compliance_issues,
process_and_output_compliance_issues,
run_prisma_cloud_compute_hosts_scan_list,
)
# Import the script you want to test
def util_load_json(path):
with open(path, encoding="utf-8") as f:
return json.loads(f.read())
compliance_issues: object = util_load_json("test_data/compliance_issues.json")
FILTERED_TEST_CASES = [
({"compliance_issues": compliance_issues, "compliance_ids": []}, compliance_issues),
(
{"compliance_issues": compliance_issues, "compliance_ids": "6112"},
[compliance_issues[0]],
),
(
{"compliance_issues": compliance_issues, "compliance_ids": "6116, 6117"},
[compliance_issues[1], compliance_issues[2]],
),
]
PROCESSED_TEST_CASES = [
(
{"compliance_issues": [compliance_issues[0]], "hostname": "test-hostname"},
[
{
"ComplianceID": "6112",
"Cause": "The directory /tmp should be mounted. File: /proc/mounts",
"Severity": "high",
"Title": "(CIS_Linux_2.0.0 - 1.1.2) Ensure /tmp is configured",
"Description": "The /tmp directory is a world-writable directory used for temporary storage by all users\nand "
"some applications.",
}
],
),
(
{
"compliance_issues": [
compliance_issues[0],
compliance_issues[1],
compliance_issues[2],
],
"hostname": "test-hostname",
},
[
{
"ComplianceID": "6112",
"Cause": "The directory /tmp should be mounted. File: /proc/mounts",
"Severity": "high",
"Title": "(CIS_Linux_2.0.0 - 1.1.2) Ensure /tmp is configured",
"Description": "The /tmp directory is a world-writable directory used for temporary storage by all users\nand "
"some "
"applications.",
},
{
"ComplianceID": "6116",
"Cause": "The directory /var should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.6) Ensure separate partition exists for /var",
"Description": "Description for compliance ID 6116",
},
{
"ComplianceID": "6117",
"Cause": "The directory /var/tmp should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.7) Ensure separate partition exists for /var/tmp",
"Description": "Description for compliance ID 6117",
},
],
),
(
{"compliance_issues": compliance_issues, "hostname": "test-hostname"},
[
{
"ComplianceID": "6112",
"Cause": "The directory /tmp should be mounted. File: /proc/mounts",
"Severity": "high",
"Title": "(CIS_Linux_2.0.0 - 1.1.2) Ensure /tmp is configured",
"Description": "The /tmp directory is a world-writable directory used for temporary storage by all users\nand "
"some applications.",
},
{
"ComplianceID": "6116",
"Cause": "The directory /var should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.6) Ensure separate partition exists for /var",
"Description": "Description for compliance ID 6116",
},
{
"ComplianceID": "6117",
"Cause": "The directory /var/tmp should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.7) Ensure separate partition exists for /var/tmp",
"Description": "Description for compliance ID 6117",
},
{
"ComplianceID": "61115",
"Cause": "The directory /var/log should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.11) Ensure separate partition exists for /var/log",
"Description": "Description for compliance ID 61115",
},
{
"ComplianceID": "61116",
"Cause": "The directory /var/log/audit should be mounted. File: /proc/mounts",
"Severity": "medium",
"Title": "(CIS_Linux_2.0.0 - 1.1.12) Ensure separate partition exists for /var/log/audit",
"Description": "Description for compliance ID 61116",
},
{
"ComplianceID": "602214",
"Cause": "The service systemd-timesyncd.service should be enabled",
"Severity": "low",
"Title": "(CIS_Linux_2.0.0 - 2.2.1.4) Ensure systemd-timesyncd is configured",
"Description": "Description for compliance ID 602214",
},
],
),
]
def test_run_prisma_cloud_compute_hosts_scan_list(mocker):
"""
Given:
A specific hostname.
Given The results from the command "prisma-cloud-compute-hosts-scan-list" for that hostname.
When:
Running run_prisma_cloud_compute_hosts_scan_list
Then:
Assert the returned output is the same as the given results for the given hostname.
"""
# Mock the executeCommand function
mocker.patch.object(
demisto,
"executeCommand",
return_value=[
{
"Type": EntryType.NOTE,
"Contents": [{"complianceIssues": compliance_issues}],
}
],
)
# Run the function
mocker.patch.object(demisto, "results")
returned_compliance_issues = run_prisma_cloud_compute_hosts_scan_list("test-hostname")
assert returned_compliance_issues == compliance_issues
@pytest.mark.parametrize("args, expected", FILTERED_TEST_CASES)
def test_filter_compliance_issues(args, expected):
"""
Given:
All results for a host.
When:
Running filter_compliance_issues
Then:
Assert the returned output matches the filtered results, based on the "FILTERED_TEST_CASES" object.
"""
filtered_results = filter_compliance_issues(args.get("compliance_issues"), args.get("compliance_ids"))
assert filtered_results == expected
@pytest.mark.parametrize("args, expected", PROCESSED_TEST_CASES)
def test_process_and_output_compliance_issues(args, expected):
"""
Given:
Filtered results for a host.
When:
Running process_and_output_compliance_issues
Then:
Assert the returned output matches the processed results, based on the "PROCESSED_TEST_CASES" object.
"""
processed_results = process_and_output_compliance_issues(args.get("compliance_issues"), args.get("hostname"))
assert processed_results.outputs["compliance_issues"] == expected