test_plugin.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from __future__ import absolute_import
  2. import responses
  3. from exam import fixture
  4. from sentry.models import Rule
  5. from sentry.plugins.base import Notification
  6. from sentry.testutils import PluginTestCase
  7. from sentry.utils import json
  8. from sentry_plugins.victorops.plugin import VictorOpsPlugin
  9. SUCCESS = """{
  10. "result":"success",
  11. "entity_id":"86dc4115-72d3-4219-9d8e-44939c1c409d"
  12. }"""
  13. class UnicodeTestInterface(object):
  14. def __init__(self, title, body):
  15. self.title = title
  16. self.body = body
  17. def to_string(self, event):
  18. return self.body
  19. def get_title(self):
  20. return self.title
  21. class VictorOpsPluginTest(PluginTestCase):
  22. @fixture
  23. def plugin(self):
  24. return VictorOpsPlugin()
  25. def test_conf_key(self):
  26. assert self.plugin.conf_key == "victorops"
  27. def test_entry_point(self):
  28. self.assertPluginInstalled("victorops", self.plugin)
  29. def test_is_configured(self):
  30. assert self.plugin.is_configured(self.project) is False
  31. self.plugin.set_option("api_key", "abcdef", self.project)
  32. assert self.plugin.is_configured(self.project) is True
  33. @responses.activate
  34. def test_simple_notification(self):
  35. responses.add(
  36. "POST",
  37. "https://alert.victorops.com/integrations/generic/20131114/alert/secret-api-key/everyone",
  38. body=SUCCESS,
  39. )
  40. self.plugin.set_option("api_key", "secret-api-key", self.project)
  41. self.plugin.set_option("routing_key", "everyone", self.project)
  42. event = self.store_event(
  43. data={
  44. "message": "Hello world",
  45. "level": "warning",
  46. "culprit": "foo.bar",
  47. "platform": "python",
  48. "stacktrace": {
  49. "frames": [
  50. {
  51. "filename": "sentry/models/foo.py",
  52. "context_line": " string_max_length=self.string_max_length)",
  53. "function": "build_msg",
  54. "lineno": 29,
  55. }
  56. ]
  57. },
  58. },
  59. project_id=self.project.id,
  60. )
  61. group = event.group
  62. rule = Rule.objects.create(project=self.project, label="my rule")
  63. notification = Notification(event=event, rule=rule)
  64. with self.options({"system.url-prefix": "http://example.com"}):
  65. self.plugin.notify(notification)
  66. request = responses.calls[0].request
  67. payload = json.loads(request.body)
  68. assert {
  69. "message_type": "WARNING",
  70. "entity_id": group.id,
  71. "entity_display_name": "Hello world",
  72. "monitoring_tool": "sentry",
  73. "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',
  74. "timestamp": int(event.datetime.strftime("%s")),
  75. "issue_url": "http://example.com/organizations/baz/issues/%s/" % group.id,
  76. "issue_id": group.id,
  77. "project_id": group.project.id,
  78. } == payload
  79. def test_build_description_unicode(self):
  80. event = self.store_event(
  81. data={"message": u"abcd\xde\xb4", "culprit": "foo.bar", "level": "error"},
  82. project_id=self.project.id,
  83. )
  84. event.interfaces = {
  85. u"Message": UnicodeTestInterface(u"abcd\xde\xb4", u"\xdc\xea\x80\x80abcd\xde\xb4")
  86. }
  87. description = self.plugin.build_description(event)
  88. assert description == u"abcd\xde\xb4\n-----------\n\n\xdc\xea\x80\x80abcd\xde\xb4"