oncall-engine/engine/apps/webhooks/tests/test_notify_user.py
Matias Bordese 576fecf6d3
feat: add personal webhook notification backend (#5426)
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>
2025-02-18 17:53:07 +00:00

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