Files
2026-05-28 11:17:33 +02:00

324 lines
12 KiB
Python

from unittest.mock import MagicMock, patch
from tests.providers.googleworkspace.googleworkspace_fixtures import (
set_mocked_googleworkspace_provider,
)
class TestRulesService:
def test_fetch_fully_configured_rule(self):
"""Test fetching a system-defined alert rule with all 3 conditions met."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
mock_service = MagicMock()
mock_policies_list = MagicMock()
mock_policies_list.execute.return_value = {
"policies": [
{
"setting": {
"type": "settings/rule.system_defined_alerts",
"value": {
"displayName": "Suspicious login",
"description": "Google detected a suspicious sign-in.",
"action": {
"alertCenterAction": {
"recipients": [{"allSuperAdmins": True}],
"alertCenterConfig": {"severity": "LOW"},
}
},
"state": "ACTIVE",
},
}
},
]
}
mock_service.policies().list.return_value = mock_policies_list
mock_service.policies().list_next.return_value = None
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=mock_service,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
assert rules.policies_fetched is True
assert len(rules.system_defined_alerts) == 8
suspicious_login = next(
a
for a in rules.system_defined_alerts
if a.display_name == "Suspicious login"
)
assert suspicious_login.state == "ACTIVE"
assert suspicious_login.email_notifications_enabled is True
assert suspicious_login.all_super_admins is True
assert suspicious_login.severity == "LOW"
def test_fetch_rule_without_email_notifications(self):
"""Test a rule that is ACTIVE but has no email recipients configured."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
mock_service = MagicMock()
mock_policies_list = MagicMock()
mock_policies_list.execute.return_value = {
"policies": [
{
"setting": {
"type": "settings/rule.system_defined_alerts",
"value": {
"displayName": "Government-backed attacks",
"description": "Google believes a user is targeted.",
"action": {
"alertCenterAction": {
"alertCenterConfig": {"severity": "HIGH"}
}
},
"state": "ACTIVE",
},
}
},
]
}
mock_service.policies().list.return_value = mock_policies_list
mock_service.policies().list_next.return_value = None
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=mock_service,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
gov_attack = next(
a
for a in rules.system_defined_alerts
if a.display_name == "Government-backed attacks"
)
assert gov_attack.state == "ACTIVE"
assert gov_attack.email_notifications_enabled is False
assert gov_attack.all_super_admins is False
assert gov_attack.severity == "HIGH"
def test_empty_response_fills_defaults(self):
"""Test that all 8 rules get default values when API returns nothing."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
mock_service = MagicMock()
mock_policies_list = MagicMock()
mock_policies_list.execute.return_value = {"policies": []}
mock_service.policies().list.return_value = mock_policies_list
mock_service.policies().list_next.return_value = None
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=mock_service,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
assert rules.policies_fetched is True
assert len(rules.system_defined_alerts) == 8
# All defaults should have no severity (not returned by API)
for alert in rules.system_defined_alerts:
assert alert.severity is None
# INACTIVE defaults: no email notifications
password_changed = next(
a
for a in rules.system_defined_alerts
if a.display_name == "User's password changed"
)
assert password_changed.state == "INACTIVE"
assert password_changed.email_notifications_enabled is False
assert password_changed.all_super_admins is False
admin_privilege = next(
a
for a in rules.system_defined_alerts
if a.display_name == "User granted Admin privilege"
)
assert admin_privilege.state == "INACTIVE"
assert admin_privilege.email_notifications_enabled is False
assert admin_privilege.all_super_admins is False
# ACTIVE defaults: email notifications ON with all super admins
suspicious_login = next(
a
for a in rules.system_defined_alerts
if a.display_name == "Suspicious login"
)
assert suspicious_login.state == "ACTIVE"
assert suspicious_login.email_notifications_enabled is True
assert suspicious_login.all_super_admins is True
gov_attacks = next(
a
for a in rules.system_defined_alerts
if a.display_name == "Government-backed attacks"
)
assert gov_attacks.state == "ACTIVE"
assert gov_attacks.email_notifications_enabled is True
assert gov_attacks.all_super_admins is True
def test_api_error_sets_policies_fetched_false(self):
"""Test that API errors result in policies_fetched being False."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
mock_service = MagicMock()
mock_service.policies().list.side_effect = Exception("API Error")
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=mock_service,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
assert rules.policies_fetched is False
def test_build_service_returns_none(self):
"""Test early return when _build_service fails."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=None,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
assert rules.policies_fetched is False
assert len(rules.system_defined_alerts) == 0
def test_non_cis_rules_are_ignored(self):
"""Test that system-defined rules not in the 8 CIS rules are ignored."""
mock_provider = set_mocked_googleworkspace_provider()
mock_provider.audit_config = {}
mock_provider.fixer_config = {}
mock_session = MagicMock()
mock_session.credentials = MagicMock()
mock_provider.session = mock_session
mock_service = MagicMock()
mock_policies_list = MagicMock()
mock_policies_list.execute.return_value = {
"policies": [
{
"setting": {
"type": "settings/rule.system_defined_alerts",
"value": {
"displayName": "Device compromised",
"description": "A device has been compromised.",
"state": "ACTIVE",
},
}
},
]
}
mock_service.policies().list.return_value = mock_policies_list
mock_service.policies().list_next.return_value = None
with (
patch(
"prowler.providers.common.provider.Provider.get_global_provider",
return_value=mock_provider,
),
patch(
"prowler.providers.googleworkspace.services.rules.rules_service.GoogleWorkspaceService._build_service",
return_value=mock_service,
),
):
from prowler.providers.googleworkspace.services.rules.rules_service import (
Rules,
)
rules = Rules(mock_provider)
assert len(rules.system_defined_alerts) == 8
names = {a.display_name for a in rules.system_defined_alerts}
assert "Device compromised" not in names
def test_system_defined_alert_model(self):
"""Test SystemDefinedAlert Pydantic model defaults."""
from prowler.providers.googleworkspace.services.rules.rules_service import (
SystemDefinedAlert,
)
alert = SystemDefinedAlert(display_name="Test rule")
assert alert.state == "INACTIVE"
assert alert.severity is None
assert alert.email_notifications_enabled is False
assert alert.all_super_admins is False