test_plugin.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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 six.moves.urllib.parse import parse_qs
  9. from sentry_plugins.slack.plugin import SlackPlugin
  10. class SlackPluginTest(PluginTestCase):
  11. @fixture
  12. def plugin(self):
  13. return SlackPlugin()
  14. def test_conf_key(self):
  15. assert self.plugin.conf_key == "slack"
  16. def test_entry_point(self):
  17. self.assertPluginInstalled("slack", self.plugin)
  18. @responses.activate
  19. def test_simple_notification(self):
  20. responses.add("POST", "http://example.com/slack")
  21. self.plugin.set_option("webhook", "http://example.com/slack", self.project)
  22. event = self.store_event(
  23. data={"message": "Hello world", "level": "warning", "culprit": "foo.bar"},
  24. project_id=self.project.id,
  25. )
  26. group = event.group
  27. rule = Rule.objects.create(project=self.project, label="my rule")
  28. notification = Notification(event=event, rule=rule)
  29. with self.options({"system.url-prefix": "http://example.com"}):
  30. self.plugin.notify(notification)
  31. request = responses.calls[0].request
  32. payload = json.loads(parse_qs(request.body)["payload"][0])
  33. assert payload == {
  34. "username": "Sentry",
  35. "attachments": [
  36. {
  37. "color": "#f18500",
  38. "fields": [
  39. {"short": False, "value": "foo.bar", "title": "Culprit"},
  40. {"short": True, "value": "bar", "title": "Project"},
  41. ],
  42. "fallback": "[bar] Hello world",
  43. "title": "Hello world",
  44. "title_link": "http://example.com/organizations/baz/issues/%s/?referrer=slack"
  45. % group.id,
  46. }
  47. ],
  48. }
  49. @responses.activate
  50. def test_notification_without_culprit(self):
  51. responses.add("POST", "http://example.com/slack")
  52. self.plugin.set_option("webhook", "http://example.com/slack", self.project)
  53. self.plugin.set_option("exclude_culprit", True, self.project)
  54. event = self.store_event(
  55. data={"message": "Hello world", "level": "warning"}, project_id=self.project.id
  56. )
  57. group = event.group
  58. rule = Rule.objects.create(project=self.project, label="my rule")
  59. notification = Notification(event=event, rule=rule)
  60. with self.options({"system.url-prefix": "http://example.com"}):
  61. self.plugin.notify(notification)
  62. request = responses.calls[0].request
  63. payload = json.loads(parse_qs(request.body)["payload"][0])
  64. assert payload == {
  65. "username": "Sentry",
  66. "attachments": [
  67. {
  68. "color": "#f18500",
  69. "fields": [{"short": True, "value": "bar", "title": "Project"}],
  70. "fallback": "[bar] Hello world",
  71. "title": "Hello world",
  72. "title_link": "http://example.com/organizations/baz/issues/%s/?referrer=slack"
  73. % group.id,
  74. }
  75. ],
  76. }
  77. @responses.activate
  78. def test_notification_without_project(self):
  79. responses.add("POST", "http://example.com/slack")
  80. self.plugin.set_option("webhook", "http://example.com/slack", self.project)
  81. self.plugin.set_option("exclude_project", True, self.project)
  82. event = self.store_event(
  83. data={"message": "Hello world", "level": "warning", "culprit": "foo.bar"},
  84. project_id=self.project.id,
  85. )
  86. group = event.group
  87. rule = Rule.objects.create(project=self.project, label="my rule")
  88. notification = Notification(event=event, rule=rule)
  89. with self.options({"system.url-prefix": "http://example.com"}):
  90. self.plugin.notify(notification)
  91. request = responses.calls[0].request
  92. payload = json.loads(parse_qs(request.body)["payload"][0])
  93. assert payload == {
  94. "username": "Sentry",
  95. "attachments": [
  96. {
  97. "color": "#f18500",
  98. "fields": [{"short": False, "value": "foo.bar", "title": "Culprit"}],
  99. "fallback": "[bar] Hello world",
  100. "title": "Hello world",
  101. "title_link": "http://example.com/organizations/baz/issues/%s/?referrer=slack"
  102. % group.id,
  103. }
  104. ],
  105. }