test_project_replay_details.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import datetime
  2. from uuid import uuid4
  3. from django.urls import reverse
  4. from sentry.replays.testutils import assert_expected_response, mock_expected_response, mock_replay
  5. from sentry.testutils import APITestCase, ReplaysSnubaTestCase
  6. REPLAYS_FEATURES = {"organizations:session-replay": True}
  7. class OrganizationReplayDetailsTest(APITestCase, ReplaysSnubaTestCase):
  8. endpoint = "sentry-api-0-project-replay-details"
  9. def setUp(self):
  10. super().setUp()
  11. self.login_as(user=self.user)
  12. self.replay_id = uuid4().hex
  13. self.url = reverse(
  14. self.endpoint, args=(self.organization.slug, self.project.slug, self.replay_id)
  15. )
  16. def test_feature_flag_disabled(self):
  17. response = self.client.get(self.url)
  18. assert response.status_code == 404
  19. def test_no_replay_found(self):
  20. with self.feature(REPLAYS_FEATURES):
  21. response = self.client.get(self.url)
  22. assert response.status_code == 404
  23. def test_get_one_replay(self):
  24. """Test only one replay returned."""
  25. replay1_id = self.replay_id
  26. replay2_id = uuid4().hex
  27. seq1_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=10)
  28. seq2_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=5)
  29. self.store_replays(mock_replay(seq1_timestamp, self.project.id, replay1_id))
  30. self.store_replays(mock_replay(seq2_timestamp, self.project.id, replay1_id))
  31. self.store_replays(mock_replay(seq1_timestamp, self.project.id, replay2_id))
  32. self.store_replays(mock_replay(seq2_timestamp, self.project.id, replay2_id))
  33. with self.feature(REPLAYS_FEATURES):
  34. # Replay 1.
  35. response = self.client.get(self.url)
  36. assert response.status_code == 200
  37. response_data = response.json()
  38. assert "data" in response_data
  39. assert response_data["data"]["id"] == replay1_id
  40. # Replay 2.
  41. response = self.client.get(
  42. reverse(self.endpoint, args=(self.organization.slug, self.project.slug, replay2_id))
  43. )
  44. assert response.status_code == 200
  45. response_data = response.json()
  46. assert "data" in response_data
  47. assert response_data["data"]["id"] == replay2_id
  48. def test_get_replay_schema(self):
  49. """Test replay schema is well-formed."""
  50. replay1_id = self.replay_id
  51. replay2_id = uuid4().hex
  52. seq1_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=25)
  53. seq2_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=7)
  54. seq3_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=4)
  55. trace_id_1 = uuid4().hex
  56. trace_id_2 = uuid4().hex
  57. # Assert values from this non-returned replay do not pollute the returned
  58. # replay.
  59. self.store_replays(mock_replay(seq1_timestamp, self.project.id, replay2_id))
  60. self.store_replays(mock_replay(seq3_timestamp, self.project.id, replay2_id))
  61. self.store_replays(
  62. mock_replay(
  63. seq1_timestamp,
  64. self.project.id,
  65. replay1_id,
  66. trace_ids=[trace_id_1],
  67. urls=["http://localhost:3000/"],
  68. )
  69. )
  70. self.store_replays(
  71. mock_replay(
  72. seq2_timestamp,
  73. self.project.id,
  74. replay1_id,
  75. segment_id=1,
  76. trace_ids=[trace_id_2],
  77. urls=["http://www.sentry.io/"],
  78. )
  79. )
  80. self.store_replays(
  81. mock_replay(
  82. seq3_timestamp,
  83. self.project.id,
  84. replay1_id,
  85. segment_id=2,
  86. trace_ids=[trace_id_2],
  87. urls=["http://localhost:3000/"],
  88. )
  89. )
  90. with self.feature(REPLAYS_FEATURES):
  91. response = self.client.get(self.url)
  92. assert response.status_code == 200
  93. response_data = response.json()
  94. assert "data" in response_data
  95. expected_response = mock_expected_response(
  96. self.project.id,
  97. replay1_id,
  98. seq1_timestamp,
  99. seq3_timestamp,
  100. trace_ids=[
  101. trace_id_1,
  102. trace_id_2,
  103. ],
  104. urls=[
  105. "http://localhost:3000/",
  106. "http://www.sentry.io/",
  107. "http://localhost:3000/",
  108. ],
  109. count_segments=3,
  110. )
  111. assert_expected_response(response_data["data"], expected_response)