mirror of
https://github.com/zulip/zulip.git
synced 2025-11-07 15:33:30 +00:00
Note that Freshdesk allows custom templating for outgoing payloads in their webhook UI. Therefore, the payloads added in this commit did not have to be official payloads from Freshdesk.
111 lines
5.2 KiB
Python
111 lines
5.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from mock import MagicMock, patch
|
|
|
|
from zerver.lib.test_classes import WebhookTestCase
|
|
|
|
class FreshdeskHookTests(WebhookTestCase):
|
|
STREAM_NAME = 'freshdesk'
|
|
URL_TEMPLATE = u"/api/v1/external/freshdesk?stream={stream}"
|
|
|
|
def test_ticket_creation(self) -> None:
|
|
"""
|
|
Messages are generated on ticket creation through Freshdesk's
|
|
"Dispatch'r" service.
|
|
"""
|
|
expected_subject = u"#11: Test ticket subject ☃"
|
|
expected_message = u"""Requester ☃ Bob <requester-bob@example.com> created [ticket #11](http://test1234zzz.freshdesk.com/helpdesk/tickets/11):
|
|
|
|
~~~ quote
|
|
Test ticket description ☃.
|
|
~~~
|
|
|
|
Type: **Incident**
|
|
Priority: **High**
|
|
Status: **Pending**"""
|
|
self.api_stream_message(self.TEST_USER_EMAIL, 'ticket_created', expected_subject, expected_message,
|
|
content_type="application/x-www-form-urlencoded")
|
|
|
|
def test_status_change(self) -> None:
|
|
"""
|
|
Messages are generated when a ticket's status changes through
|
|
Freshdesk's "Observer" service.
|
|
"""
|
|
expected_subject = u"#11: Test ticket subject ☃"
|
|
expected_message = """Requester Bob <requester-bob@example.com> updated [ticket #11](http://test1234zzz.freshdesk.com/helpdesk/tickets/11):
|
|
|
|
Status: **Resolved** => **Waiting on Customer**"""
|
|
self.api_stream_message(self.TEST_USER_EMAIL, 'status_changed', expected_subject, expected_message,
|
|
content_type="application/x-www-form-urlencoded")
|
|
|
|
def test_status_change_fixture_without_required_key(self) -> None:
|
|
"""
|
|
A fixture without the requisite keys should raise JsonableError.
|
|
"""
|
|
self.url = self.build_webhook_url()
|
|
payload = self.get_body('status_changed_fixture_with_missing_key')
|
|
kwargs = {
|
|
'HTTP_AUTHORIZATION': self.encode_credentials(self.TEST_USER_EMAIL),
|
|
'content_type': 'application/x-www-form-urlencoded',
|
|
}
|
|
result = self.client_post(self.url, payload, **kwargs)
|
|
self.assert_json_error(result, 'Missing key triggered_event in JSON')
|
|
|
|
def test_priority_change(self) -> None:
|
|
"""
|
|
Messages are generated when a ticket's priority changes through
|
|
Freshdesk's "Observer" service.
|
|
"""
|
|
expected_subject = u"#11: Test ticket subject"
|
|
expected_message = """Requester Bob <requester-bob@example.com> updated [ticket #11](http://test1234zzz.freshdesk.com/helpdesk/tickets/11):
|
|
|
|
Priority: **High** => **Low**"""
|
|
self.api_stream_message(self.TEST_USER_EMAIL, 'priority_changed', expected_subject, expected_message,
|
|
content_type="application/x-www-form-urlencoded")
|
|
|
|
@patch('zerver.lib.webhooks.common.check_send_webhook_message')
|
|
def test_unknown_event_payload_ignore(
|
|
self, check_send_webhook_message_mock: MagicMock) -> None:
|
|
"""
|
|
Ignore unknown event payloads.
|
|
"""
|
|
self.url = self.build_webhook_url()
|
|
payload = self.get_body('unknown_payload')
|
|
kwargs = {
|
|
'HTTP_AUTHORIZATION': self.encode_credentials(self.TEST_USER_EMAIL),
|
|
'content_type': 'application/x-www-form-urlencoded',
|
|
}
|
|
result = self.client_post(self.url, payload, **kwargs)
|
|
self.assertFalse(check_send_webhook_message_mock.called)
|
|
self.assert_json_success(result)
|
|
|
|
def note_change(self, fixture: str, note_type: str) -> None:
|
|
"""
|
|
Messages are generated when a note gets added to a ticket through
|
|
Freshdesk's "Observer" service.
|
|
"""
|
|
expected_subject = u"#11: Test ticket subject"
|
|
expected_message = """Requester Bob <requester-bob@example.com> added a {} note to [ticket #11](http://test1234zzz.freshdesk.com/helpdesk/tickets/11).""".format(note_type)
|
|
self.api_stream_message(self.TEST_USER_EMAIL, fixture, expected_subject, expected_message,
|
|
content_type="application/x-www-form-urlencoded")
|
|
|
|
def test_private_note_change(self) -> None:
|
|
self.note_change("private_note", "private")
|
|
|
|
def test_public_note_change(self) -> None:
|
|
self.note_change("public_note", "public")
|
|
|
|
def test_inline_image(self) -> None:
|
|
"""
|
|
Freshdesk sends us descriptions as HTML, so we have to make the
|
|
descriptions Zulip markdown-friendly while still doing our best to
|
|
preserve links and images.
|
|
"""
|
|
expected_subject = u"#12: Not enough ☃ guinea pigs"
|
|
expected_message = u"Requester \u2603 Bob <requester-bob@example.com> created [ticket #12](http://test1234zzz.freshdesk.com/helpdesk/tickets/12):\n\n~~~ quote\nThere are too many cat pictures on the internet \u2603. We need more guinea pigs. Exhibit 1:\n\n \n\n\n[guinea_pig.png](http://cdn.freshdesk.com/data/helpdesk/attachments/production/12744808/original/guinea_pig.png)\n~~~\n\nType: **Problem**\nPriority: **Urgent**\nStatus: **Open**"
|
|
self.api_stream_message(self.TEST_USER_EMAIL, "inline_images", expected_subject, expected_message,
|
|
content_type="application/x-www-form-urlencoded")
|
|
|
|
def get_body(self, fixture_name: str) -> str:
|
|
return self.webhook_fixture_data("freshdesk", fixture_name, file_type="json")
|