test_plugin.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. from __future__ import absolute_import
  2. from botocore.client import ClientError
  3. from exam import fixture
  4. from sentry.utils.compat.mock import patch
  5. from sentry.testutils import PluginTestCase
  6. from sentry.utils import json
  7. from sentry_plugins.amazon_sqs.plugin import AmazonSQSPlugin
  8. class AmazonSQSPluginTest(PluginTestCase):
  9. @fixture
  10. def plugin(self):
  11. return AmazonSQSPlugin()
  12. def test_conf_key(self):
  13. assert self.plugin.conf_key == "amazon-sqs"
  14. def test_entry_point(self):
  15. self.assertPluginInstalled("amazon_sqs", self.plugin)
  16. def run_test(self):
  17. self.plugin.set_option("access_key", "access-key", self.project)
  18. self.plugin.set_option("secret_key", "secret-key", self.project)
  19. self.plugin.set_option("region", "us-east-1", self.project)
  20. self.plugin.set_option(
  21. "queue_url", "https://sqs-us-east-1.amazonaws.com/12345678/myqueue", self.project
  22. )
  23. event = self.store_event(
  24. data={
  25. "sentry.interfaces.Exception": {"type": "ValueError", "value": "foo bar"},
  26. "sentry.interfaces.User": {"id": "1", "email": "foo@example.com"},
  27. "type": "error",
  28. "metadata": {"type": "ValueError", "value": "foo bar"},
  29. },
  30. project_id=self.project.id,
  31. )
  32. with self.options({"system.url-prefix": "http://example.com"}):
  33. self.plugin.post_process(event)
  34. return event
  35. @patch("boto3.client")
  36. def test_simple_notification(self, mock_client):
  37. event = self.run_test()
  38. mock_client.assert_called_once_with(
  39. service_name="sqs",
  40. region_name="us-east-1",
  41. aws_access_key_id="access-key",
  42. aws_secret_access_key="secret-key",
  43. )
  44. mock_client.return_value.send_message.assert_called_once_with(
  45. QueueUrl="https://sqs-us-east-1.amazonaws.com/12345678/myqueue",
  46. MessageBody=json.dumps(self.plugin.get_event_payload(event)),
  47. )
  48. @patch("sentry_plugins.amazon_sqs.plugin.logger")
  49. @patch("boto3.client")
  50. def test_token_error(self, mock_client, logger):
  51. mock_client.return_value.send_message.side_effect = ClientError(
  52. {"Error": {"Code": "Hello", "Message": "hello"}}, "SendMessage"
  53. )
  54. with self.assertRaises(ClientError):
  55. self.run_test()
  56. assert len(logger.info.call_args_list) == 1
  57. mock_client.return_value.send_message.side_effect = ClientError(
  58. {"Error": {"Code": "AccessDenied", "Message": "Hello"}}, "SendMessage"
  59. )
  60. self.run_test()
  61. assert len(logger.info.call_args_list) == 3
  62. assert (
  63. logger.info.call_args_list[2][0][0] == "sentry_plugins.amazon_sqs.access_token_invalid"
  64. )
  65. @patch("sentry_plugins.amazon_sqs.plugin.logger")
  66. @patch("boto3.client")
  67. def test_message_group_error(self, mock_client, logger):
  68. mock_client.return_value.send_message.side_effect = ClientError(
  69. {
  70. "Error": {
  71. "Code": "MissingParameter",
  72. "Message": "The request must contain the parameter MessageGroupId.",
  73. }
  74. },
  75. "SendMessage",
  76. )
  77. self.run_test()
  78. assert len(logger.info.call_args_list) == 2
  79. assert (
  80. logger.info.call_args_list[1][0][0]
  81. == "sentry_plugins.amazon_sqs.missing_message_group_id"
  82. )
  83. @patch("uuid.uuid4")
  84. @patch("boto3.client")
  85. def test_pass_message_group_id(self, mock_client, mock_uuid):
  86. class uuid(object):
  87. hex = "some-uuid"
  88. mock_uuid.return_value = uuid
  89. self.plugin.set_option("message_group_id", "my_group", self.project)
  90. event = self.run_test()
  91. mock_client.return_value.send_message.assert_called_once_with(
  92. QueueUrl="https://sqs-us-east-1.amazonaws.com/12345678/myqueue",
  93. MessageBody=json.dumps(self.plugin.get_event_payload(event)),
  94. MessageGroupId="my_group",
  95. MessageDeduplicationId="some-uuid",
  96. )
  97. @patch("boto3.client")
  98. def test_use_s3_bucket(self, mock_client):
  99. self.plugin.set_option("s3_bucket", "my_bucket", self.project)
  100. event = self.run_test()
  101. date = event.datetime.strftime("%Y-%m-%d")
  102. key = "{}/{}/{}".format(event.project.slug, date, event.event_id)
  103. mock_client.return_value.send_message.assert_called_once_with(
  104. QueueUrl="https://sqs-us-east-1.amazonaws.com/12345678/myqueue",
  105. MessageBody=json.dumps(
  106. {
  107. "s3Url": u"https://my_bucket.s3-us-east-1.amazonaws.com/{}".format(key),
  108. "eventID": event.event_id,
  109. }
  110. ),
  111. )
  112. mock_client.return_value.put_object.assert_called_once_with(
  113. Bucket="my_bucket", Body=json.dumps(self.plugin.get_event_payload(event)), Key=key
  114. )
  115. @patch("sentry_plugins.amazon_sqs.plugin.logger")
  116. @patch("boto3.client")
  117. def test_invalid_s3_bucket(self, mock_client, logger):
  118. self.plugin.set_option("s3_bucket", "bad_bucket", self.project)
  119. mock_client.return_value.put_object.side_effect = ClientError(
  120. {"Error": {"Code": "NoSuchBucket"}}, "PutObject",
  121. )
  122. self.run_test()
  123. assert len(logger.info.call_args_list) == 2
  124. assert logger.info.call_args_list[1][0][0] == "sentry_plugins.amazon_sqs.s3_bucket_invalid"