test_sentry_api_compat.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import json
  2. from typing import List, Dict
  3. from django.urls import reverse
  4. from rest_framework.test import APITestCase
  5. from model_bakery import baker
  6. from event_store.test_data.django_error_factory import template_error
  7. from event_store.test_data.js_error_factory import throw_error
  8. from issues.models import Event
  9. class SentryAPICompatTestCase(APITestCase):
  10. def setUp(self):
  11. self.user = baker.make("users.user")
  12. self.client.force_login(self.user)
  13. self.project = baker.make("projects.Project")
  14. key = self.project.projectkey_set.first().public_key
  15. self.event_store_url = (
  16. reverse("event_store", args=[self.project.id]) + "?sentry_key=" + key.hex
  17. )
  18. def assertCompareData(self, data1: Dict, data2: Dict, fields: List[str]):
  19. """ Compare data of two dict objects. Compare only provided fields list """
  20. for field in fields:
  21. self.assertEqual(
  22. data1[field], data2[field], f"Failed for field '{field}'",
  23. )
  24. def get_json_data(self, path: str):
  25. with open(path) as json_file:
  26. return json.load(json_file)
  27. def test_template_error(self):
  28. res = self.client.post(self.event_store_url, template_error, format="json")
  29. self.assertEqual(res.status_code, 200)
  30. event_id = res.data["id"]
  31. url = f"/api/0/projects/{self.project.organization.slug}/{self.project.slug}/events/{event_id}/"
  32. res = self.client.get(url)
  33. self.assertEqual(res.status_code, 200)
  34. issue = Event.objects.get(event_id=event_id).issue
  35. data = self.get_json_data(
  36. "event_store/test_data/django_template_error_event.json"
  37. )
  38. self.assertCompareData(res.data, data, ["culprit", "title"])
  39. url = reverse("issue-detail", kwargs={"pk": issue.pk})
  40. res = self.client.get(url)
  41. self.assertEqual(res.status_code, 200)
  42. data = self.get_json_data(
  43. "event_store/test_data/django_template_error_issue.json"
  44. )
  45. self.assertCompareData(res.data, data, ["title",])
  46. def test_throw_error(self):
  47. res = self.client.post(self.event_store_url, throw_error, format="json")
  48. self.assertEqual(res.status_code, 200)
  49. event_id = res.data["id"]
  50. url = f"/api/0/projects/{self.project.organization.slug}/{self.project.slug}/events/{event_id}/"
  51. res = self.client.get(url)
  52. self.assertEqual(res.status_code, 200)
  53. issue = Event.objects.get(event_id=event_id).issue
  54. data = self.get_json_data("event_store/test_data/js_throw_error_event.json")
  55. self.assertCompareData(res.data, data, ["title"])
  56. self.assertEqual(
  57. res.data["culprit"],
  58. "viewWrappedDebugError(http://localhost:4200/vendor.js)",
  59. "Not perfect match, should really be viewWrappedDebugError(vendor)",
  60. )
  61. url = reverse("issue-detail", kwargs={"pk": issue.pk})
  62. res = self.client.get(url)
  63. self.assertEqual(res.status_code, 200)
  64. data = self.get_json_data("event_store/test_data/js_throw_error_issue.json")
  65. self.assertCompareData(res.data, data, ["title"])