123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- from functools import cached_property
- import orjson
- import responses
- from sentry.interfaces.base import Interface
- from sentry.models.rule import Rule
- from sentry.plugins.base import Notification
- from sentry.testutils.cases import PluginTestCase
- from sentry_plugins.victorops.plugin import VictorOpsPlugin
- SUCCESS = """{
- "result":"success",
- "entity_id":"86dc4115-72d3-4219-9d8e-44939c1c409d"
- }"""
- class UnicodeTestInterface(Interface):
- def to_string(self, event) -> str:
- return self.body
- def get_title(self):
- return self.title
- class VictorOpsPluginTest(PluginTestCase):
- @cached_property
- def plugin(self):
- return VictorOpsPlugin()
- def test_conf_key(self):
- assert self.plugin.conf_key == "victorops"
- def test_entry_point(self):
- self.assertPluginInstalled("victorops", self.plugin)
- def test_is_configured(self):
- assert self.plugin.is_configured(self.project) is False
- self.plugin.set_option("api_key", "abcdef", self.project)
- assert self.plugin.is_configured(self.project) is True
- @responses.activate
- def test_simple_notification(self):
- responses.add(
- "POST",
- "https://alert.victorops.com/integrations/generic/20131114/alert/secret-api-key/everyone",
- body=SUCCESS,
- )
- self.plugin.set_option("api_key", "secret-api-key", self.project)
- self.plugin.set_option("routing_key", "everyone", self.project)
- event = self.store_event(
- data={
- "message": "Hello world",
- "level": "warning",
- "culprit": "foo.bar",
- "platform": "python",
- "stacktrace": {
- "frames": [
- {
- "filename": "sentry/models/foo.py",
- "context_line": " string_max_length=self.string_max_length)",
- "function": "build_msg",
- "lineno": 29,
- }
- ]
- },
- },
- project_id=self.project.id,
- )
- assert event.group is not None
- group = event.group
- rule = Rule.objects.create(project=self.project, label="my rule")
- notification = Notification(event=event, rule=rule)
- self.plugin.notify(notification)
- request = responses.calls[0].request
- payload = orjson.loads(request.body)
- assert {
- "message_type": "WARNING",
- "entity_id": group.id,
- "entity_display_name": "Hello world",
- "monitoring_tool": "sentry",
- "state_message": 'Stacktrace\n-----------\n\nStacktrace (most recent call last):\n\n File "sentry/models/foo.py", line 29, in build_msg\n string_max_length=self.string_max_length)\n\nMessage\n-----------\n\nHello world',
- "timestamp": int(event.datetime.strftime("%s")),
- "issue_url": group.get_absolute_url(),
- "issue_id": group.id,
- "project_id": group.project.id,
- } == payload
- def test_build_description_unicode(self):
- event = self.store_event(
- data={"message": "abcd\xde\xb4", "culprit": "foo.bar", "level": "error"},
- project_id=self.project.id,
- )
- event.interfaces = {
- "Message": UnicodeTestInterface(
- title="abcd\xde\xb4", body="\xdc\xea\x80\x80abcd\xde\xb4"
- )
- }
- description = self.plugin.build_description(event)
- assert description == "abcd\xde\xb4\n-----------\n\n\xdc\xea\x80\x80abcd\xde\xb4"
|