test_plugin.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from __future__ import absolute_import
  2. import responses
  3. import six
  4. from exam import fixture
  5. from django.core.urlresolvers import reverse
  6. from sentry.models import Rule
  7. from sentry.plugins.base import Notification
  8. from sentry.testutils import PluginTestCase
  9. from sentry.utils import json
  10. from sentry_plugins.pagerduty.plugin import PagerDutyPlugin
  11. INVALID_METHOD = (
  12. '{"status":"invalid method","message":"You must use HTTP POST to submit your event"}'
  13. )
  14. SUCCESS = """{
  15. "status": "success",
  16. "message": "Event processed",
  17. "incident_key": "73af7a305bd7012d7c06002500d5d1a6"
  18. }"""
  19. class PagerDutyPluginTest(PluginTestCase):
  20. @fixture
  21. def plugin(self):
  22. return PagerDutyPlugin()
  23. def test_conf_key(self):
  24. assert self.plugin.conf_key == "pagerduty"
  25. def test_entry_point(self):
  26. self.assertPluginInstalled("pagerduty", self.plugin)
  27. def test_is_configured(self):
  28. assert self.plugin.is_configured(self.project) is False
  29. self.plugin.set_option("service_key", "abcdef", self.project)
  30. assert self.plugin.is_configured(self.project) is True
  31. @responses.activate
  32. def test_simple_notification(self):
  33. responses.add(
  34. "GET",
  35. "https://events.pagerduty.com/generic/2010-04-15/create_event.json",
  36. body=INVALID_METHOD,
  37. )
  38. responses.add(
  39. "POST",
  40. "https://events.pagerduty.com/generic/2010-04-15/create_event.json",
  41. body=SUCCESS,
  42. )
  43. self.plugin.set_option("service_key", "abcdef", self.project)
  44. event = self.store_event(
  45. data={
  46. "message": "Hello world",
  47. "level": "warning",
  48. "platform": "python",
  49. "culprit": "foo.bar",
  50. },
  51. project_id=self.project.id,
  52. )
  53. group = event.group
  54. rule = Rule.objects.create(project=self.project, label="my rule")
  55. notification = Notification(event=event, rule=rule)
  56. with self.options({"system.url-prefix": "http://example.com"}):
  57. self.plugin.notify(notification)
  58. request = responses.calls[0].request
  59. payload = json.loads(request.body)
  60. assert payload == {
  61. "client_url": "http://example.com",
  62. "event_type": "trigger",
  63. "contexts": [
  64. {
  65. "text": "Issue Details",
  66. "href": "http://example.com/organizations/baz/issues/{}/?referrer=pagerduty_plugin".format(
  67. group.id
  68. ),
  69. "type": "link",
  70. }
  71. ],
  72. "incident_key": six.text_type(group.id),
  73. "client": "sentry",
  74. "details": {
  75. "project": self.project.name,
  76. "release": None,
  77. "url": "http://example.com/organizations/baz/issues/{}/?referrer=pagerduty_plugin".format(
  78. group.id
  79. ),
  80. "culprit": group.culprit,
  81. "platform": "python",
  82. "event_id": event.event_id,
  83. "tags": {"level": "warning"},
  84. "datetime": event.datetime.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
  85. },
  86. "service_key": "abcdef",
  87. "description": event.message,
  88. }
  89. def test_no_secrets(self):
  90. self.user = self.create_user("foo@example.com")
  91. self.org = self.create_organization(owner=self.user, name="Rowdy Tiger")
  92. self.team = self.create_team(organization=self.org, name="Mariachi Band")
  93. self.project = self.create_project(organization=self.org, teams=[self.team], name="Bengal")
  94. self.login_as(self.user)
  95. self.plugin.set_option("service_key", "abcdef", self.project)
  96. url = reverse(
  97. "sentry-api-0-project-plugin-details",
  98. args=[self.org.slug, self.project.slug, "pagerduty"],
  99. )
  100. res = self.client.get(url)
  101. config = json.loads(res.content)["config"]
  102. key_config = [item for item in config if item["name"] == "service_key"][0]
  103. assert key_config.get("type") == "secret"
  104. assert key_config.get("value") is None
  105. assert key_config.get("hasSavedValue") is True
  106. assert key_config.get("prefix") == "abcd"