Related to https://github.com/grafana/irm/issues/332 (see https://github.com/grafana/oncall/pull/5440 and https://github.com/grafana/oncall/pull/5446 for the related UI changes) --------- Co-authored-by: Matt Thorning <matt.thorning@grafana.com>
154 lines
5.1 KiB
Python
154 lines
5.1 KiB
Python
from unittest.mock import patch
|
|
|
|
import pytest
|
|
from django.conf import settings
|
|
|
|
from apps.base.models import UserNotificationPolicy, UserNotificationPolicyLogRecord
|
|
from apps.webhooks.models import Webhook
|
|
from apps.webhooks.tasks import notify_user_async
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notify_user_not_found(
|
|
make_organization,
|
|
make_user_for_organization,
|
|
make_alert_receive_channel,
|
|
make_alert_group,
|
|
make_user_notification_policy,
|
|
caplog,
|
|
):
|
|
organization = make_organization()
|
|
user = make_user_for_organization(organization)
|
|
alert_receive_channel = make_alert_receive_channel(organization)
|
|
alert_group = make_alert_group(alert_receive_channel)
|
|
|
|
notification_policy = make_user_notification_policy(
|
|
user,
|
|
UserNotificationPolicy.Step.NOTIFY,
|
|
notify_by=settings.PERSONAL_WEBHOOK_BACKEND_ID,
|
|
important=False,
|
|
)
|
|
|
|
with patch("apps.webhooks.tasks.execute_webhook") as mock_execute_webhook:
|
|
notify_user_async(42, alert_group.pk, notification_policy.pk)
|
|
|
|
assert mock_execute_webhook.apply_async.called is False
|
|
assert "User 42 does not exist" in caplog.text
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notify_user_alert_group_not_found(
|
|
make_organization,
|
|
make_user_for_organization,
|
|
make_user_notification_policy,
|
|
caplog,
|
|
):
|
|
organization = make_organization()
|
|
user = make_user_for_organization(organization)
|
|
|
|
notification_policy = make_user_notification_policy(
|
|
user,
|
|
UserNotificationPolicy.Step.NOTIFY,
|
|
notify_by=settings.PERSONAL_WEBHOOK_BACKEND_ID,
|
|
important=False,
|
|
)
|
|
|
|
with patch("apps.webhooks.tasks.execute_webhook") as mock_execute_webhook:
|
|
notify_user_async(user.pk, 42, notification_policy.pk)
|
|
|
|
assert mock_execute_webhook.apply_async.called is False
|
|
assert "Alert group 42 does not exist" in caplog.text
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notify_user_policy_not_found(
|
|
make_organization,
|
|
make_user_for_organization,
|
|
make_alert_receive_channel,
|
|
make_alert_group,
|
|
caplog,
|
|
):
|
|
organization = make_organization()
|
|
user = make_user_for_organization(organization)
|
|
alert_receive_channel = make_alert_receive_channel(organization)
|
|
alert_group = make_alert_group(alert_receive_channel)
|
|
|
|
with patch("apps.webhooks.tasks.execute_webhook") as mock_execute_webhook:
|
|
notify_user_async(user.pk, alert_group.pk, 42)
|
|
|
|
assert mock_execute_webhook.apply_async.called is False
|
|
assert "User notification policy 42 does not exist" in caplog.text
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notify_user_personal_webhook_not_set(
|
|
make_organization,
|
|
make_user_for_organization,
|
|
make_alert_receive_channel,
|
|
make_alert_group,
|
|
make_user_notification_policy,
|
|
caplog,
|
|
):
|
|
organization = make_organization()
|
|
user = make_user_for_organization(organization)
|
|
alert_receive_channel = make_alert_receive_channel(organization)
|
|
alert_group = make_alert_group(alert_receive_channel)
|
|
|
|
notification_policy = make_user_notification_policy(
|
|
user,
|
|
UserNotificationPolicy.Step.NOTIFY,
|
|
notify_by=settings.PERSONAL_WEBHOOK_BACKEND_ID,
|
|
important=False,
|
|
)
|
|
|
|
with patch("apps.webhooks.tasks.execute_webhook") as mock_execute_webhook:
|
|
notify_user_async(user.pk, alert_group.pk, notification_policy.pk)
|
|
|
|
assert mock_execute_webhook.apply_async.called is False
|
|
assert f"Personal webhook is not set for user {user.pk}" in caplog.text
|
|
log_record = notification_policy.personal_log_records.last()
|
|
assert log_record.type == UserNotificationPolicyLogRecord.TYPE_PERSONAL_NOTIFICATION_FAILED
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_notify_user_ok(
|
|
make_organization,
|
|
make_user_for_organization,
|
|
make_alert_receive_channel,
|
|
make_alert_group,
|
|
make_user_notification_policy,
|
|
make_custom_webhook,
|
|
make_personal_notification_webhook,
|
|
):
|
|
organization = make_organization()
|
|
user = make_user_for_organization(organization)
|
|
alert_receive_channel = make_alert_receive_channel(organization)
|
|
alert_group = make_alert_group(alert_receive_channel)
|
|
|
|
# set personal webhook
|
|
webhook = make_custom_webhook(
|
|
organization=organization,
|
|
trigger_type=Webhook.TRIGGER_PERSONAL_NOTIFICATION,
|
|
)
|
|
make_personal_notification_webhook(user=user, webhook=webhook)
|
|
|
|
notification_policy = make_user_notification_policy(
|
|
user,
|
|
UserNotificationPolicy.Step.NOTIFY,
|
|
notify_by=settings.PERSONAL_WEBHOOK_BACKEND_ID,
|
|
important=False,
|
|
)
|
|
|
|
with patch("apps.webhooks.tasks.execute_webhook") as mock_execute_webhook:
|
|
notify_user_async(user.pk, alert_group.pk, notification_policy.pk)
|
|
|
|
mock_execute_webhook.apply_async.assert_called_once_with(
|
|
(user.personal_webhook.webhook.pk, alert_group.pk, user.pk, notification_policy.pk),
|
|
kwargs={"trigger_type": Webhook.TRIGGER_PERSONAL_NOTIFICATION},
|
|
)
|
|
|
|
log_record = notification_policy.personal_log_records.last()
|
|
assert log_record.type == UserNotificationPolicyLogRecord.TYPE_PERSONAL_NOTIFICATION_SUCCESS
|
|
|
|
|
|
# tests: user does not exist, ag does not exist, policy does not exist; no webhook; webhook triggered
|