test_plugin.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from functools import cached_property
  2. import orjson
  3. import responses
  4. from django.urls import reverse
  5. from sentry.testutils.cases import PluginTestCase
  6. from sentry_plugins.sessionstack.plugin import SessionStackPlugin
  7. EXPECTED_SESSION_URL = (
  8. "https://app.sessionstack.com/player/#/sessions/588778a6c5762c1d566653ff"
  9. "?source=sentry&access_token=example-access-token"
  10. )
  11. ACCESS_TOKENS_URL = (
  12. "https://api.sessionstack.com/v1/websites/0/sessions/" "588778a6c5762c1d566653ff/access_tokens"
  13. )
  14. class SessionStackPluginTest(PluginTestCase):
  15. @cached_property
  16. def plugin(self):
  17. return SessionStackPlugin()
  18. def test_conf_key(self):
  19. assert self.plugin.conf_key == "sessionstack"
  20. def test_entry_point(self):
  21. self.assertPluginInstalled("sessionstack", self.plugin)
  22. self.assertAppInstalled("sessionstack", "sentry_plugins.sessionstack")
  23. @responses.activate
  24. def test_config_validation(self):
  25. responses.add(responses.GET, "https://api.sessionstack.com/v1/websites/0")
  26. config = {
  27. "account_email": "user@example.com",
  28. "api_token": "example-api-token",
  29. "website_id": 0,
  30. }
  31. self.plugin.validate_config(self.project, config)
  32. @responses.activate
  33. def test_event_preprocessing(self):
  34. responses.add(
  35. responses.GET,
  36. ACCESS_TOKENS_URL,
  37. json={"data": [{"name": "Sentry", "access_token": "example-access-token"}]},
  38. )
  39. responses.add(
  40. responses.POST,
  41. ACCESS_TOKENS_URL,
  42. json={"data": [{"name": "Sentry", "access_token": "example-access-token"}]},
  43. )
  44. self.plugin.enable(self.project)
  45. self.plugin.set_option("account_email", "user@example.com", self.project)
  46. self.plugin.set_option("api_token", "example-api-token", self.project)
  47. self.plugin.set_option("website_id", 0, self.project)
  48. event = {
  49. "project": self.project.id,
  50. "contexts": {
  51. "sessionstack": {"session_id": "588778a6c5762c1d566653ff", "type": "sessionstack"}
  52. },
  53. "platform": "javascript",
  54. }
  55. event_preprocessors = self.plugin.get_event_preprocessors(event)
  56. add_sessionstack_context = event_preprocessors[0]
  57. processed_event = add_sessionstack_context(event)
  58. event_contexts = processed_event.get("contexts")
  59. sessionstack_context = event_contexts.get("sessionstack")
  60. session_url = sessionstack_context.get("session_url")
  61. assert session_url == EXPECTED_SESSION_URL
  62. def test_no_secrets(self):
  63. self.login_as(self.user)
  64. self.plugin.set_option("api_token", "example-api-token", self.project)
  65. url = reverse(
  66. "sentry-api-0-project-plugin-details",
  67. args=[self.organization.slug, self.project.slug, "sessionstack"],
  68. )
  69. res = self.client.get(url)
  70. config = orjson.loads(res.content)["config"]
  71. api_token_config = [item for item in config if item["name"] == "api_token"][0]
  72. assert api_token_config.get("type") == "secret"
  73. assert api_token_config.get("value") is None