test_project.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. from sentry import eventstore
  2. from sentry.incidents.models import AlertRule, Incident
  3. from sentry.models.commit import Commit
  4. from sentry.models.commitauthor import CommitAuthor
  5. from sentry.models.debugfile import ProjectDebugFile
  6. from sentry.models.environment import Environment, EnvironmentProject
  7. from sentry.models.eventattachment import EventAttachment
  8. from sentry.models.files.file import File
  9. from sentry.models.group import Group
  10. from sentry.models.groupassignee import GroupAssignee
  11. from sentry.models.groupmeta import GroupMeta
  12. from sentry.models.groupresolution import GroupResolution
  13. from sentry.models.groupseen import GroupSeen
  14. from sentry.models.project import Project
  15. from sentry.models.release import Release
  16. from sentry.models.releasecommit import ReleaseCommit
  17. from sentry.models.repository import Repository
  18. from sentry.models.rulesnooze import RuleSnooze
  19. from sentry.models.servicehook import ServiceHook
  20. from sentry.monitors.models import (
  21. CheckInStatus,
  22. Monitor,
  23. MonitorCheckIn,
  24. MonitorEnvironment,
  25. MonitorType,
  26. ScheduleType,
  27. )
  28. from sentry.tasks.deletion.scheduled import run_scheduled_deletions
  29. from sentry.testutils.cases import APITestCase, TransactionTestCase
  30. from sentry.testutils.helpers.datetime import before_now, iso_format
  31. from sentry.testutils.hybrid_cloud import HybridCloudTestMixin
  32. from sentry.testutils.silo import region_silo_test
  33. from sentry.testutils.skips import requires_snuba
  34. pytestmark = [requires_snuba]
  35. @region_silo_test(stable=True)
  36. class DeleteProjectTest(APITestCase, TransactionTestCase, HybridCloudTestMixin):
  37. def test_simple(self):
  38. project = self.create_project(name="test")
  39. event = self.store_event(data={}, project_id=project.id)
  40. group = event.group
  41. GroupAssignee.objects.create(group=group, project=project, user_id=self.user.id)
  42. GroupMeta.objects.create(group=group, key="foo", value="bar")
  43. release = Release.objects.create(version="a" * 32, organization_id=project.organization_id)
  44. release.add_project(project)
  45. GroupResolution.objects.create(group=group, release=release)
  46. env = Environment.objects.create(organization_id=project.organization_id, name="foo")
  47. env.add_project(project)
  48. repo = Repository.objects.create(organization_id=project.organization_id, name=project.name)
  49. commit_author = CommitAuthor.objects.create(
  50. organization_id=project.organization_id, name="foo", email="foo@example.com"
  51. )
  52. commit = Commit.objects.create(
  53. repository_id=repo.id,
  54. organization_id=project.organization_id,
  55. author=commit_author,
  56. key="a" * 40,
  57. )
  58. ReleaseCommit.objects.create(
  59. organization_id=project.organization_id,
  60. project_id=project.id,
  61. release=release,
  62. commit=commit,
  63. order=0,
  64. )
  65. file = File.objects.create(name="debug-file", type="project.dif")
  66. dif = ProjectDebugFile.objects.create(
  67. file=file,
  68. debug_id="uuid",
  69. code_id="codeid",
  70. cpu_name="cpu",
  71. object_name="object",
  72. project_id=project.id,
  73. )
  74. file_attachment = File.objects.create(name="hello.png", type="image/png")
  75. EventAttachment.objects.create(
  76. event_id=event.event_id,
  77. project_id=event.project_id,
  78. file_id=file_attachment.id,
  79. type=file_attachment.type,
  80. name="hello.png",
  81. )
  82. hook = self.create_service_hook(
  83. actor=self.user,
  84. org=project.organization,
  85. project=project,
  86. url="https://example.com/webhook",
  87. )
  88. metric_alert_rule = self.create_alert_rule(
  89. organization=project.organization, projects=[project]
  90. )
  91. monitor = Monitor.objects.create(
  92. organization_id=project.organization.id,
  93. project_id=project.id,
  94. type=MonitorType.CRON_JOB,
  95. config={"schedule": "* * * * *", "schedule_type": ScheduleType.CRONTAB},
  96. )
  97. monitor_env = MonitorEnvironment.objects.create(
  98. monitor=monitor,
  99. environment=env,
  100. )
  101. checkin = MonitorCheckIn.objects.create(
  102. monitor=monitor,
  103. monitor_environment=monitor_env,
  104. project_id=project.id,
  105. date_added=monitor.date_added,
  106. status=CheckInStatus.OK,
  107. )
  108. incident = self.create_incident(
  109. organization=project.organization,
  110. projects=[project],
  111. alert_rule=metric_alert_rule,
  112. title="Something bad happened",
  113. )
  114. rule_snooze = self.snooze_rule(user_id=self.user.id, alert_rule=metric_alert_rule)
  115. self.ScheduledDeletion.schedule(instance=project, days=0)
  116. with self.tasks():
  117. run_scheduled_deletions()
  118. assert not Project.objects.filter(id=project.id).exists()
  119. assert not EnvironmentProject.objects.filter(
  120. project_id=project.id, environment_id=env.id
  121. ).exists()
  122. assert Environment.objects.filter(id=env.id).exists()
  123. assert not Group.objects.filter(project_id=project.id).exists()
  124. assert not EventAttachment.objects.filter(project_id=project.id).exists()
  125. assert Release.objects.filter(id=release.id).exists()
  126. assert ReleaseCommit.objects.filter(release_id=release.id).exists()
  127. assert Commit.objects.filter(id=commit.id).exists()
  128. assert not ProjectDebugFile.objects.filter(id=dif.id).exists()
  129. assert not File.objects.filter(id=file.id).exists()
  130. assert not ServiceHook.objects.filter(id=hook.id).exists()
  131. assert not Monitor.objects.filter(id=monitor.id).exists()
  132. assert not MonitorEnvironment.objects.filter(id=monitor_env.id).exists()
  133. assert not MonitorCheckIn.objects.filter(id=checkin.id).exists()
  134. incident.refresh_from_db()
  135. assert len(incident.projects.all()) == 0, "Project relation should be removed"
  136. assert Incident.objects.filter(id=incident.id).exists()
  137. assert AlertRule.objects.filter(id=metric_alert_rule.id).exists()
  138. assert RuleSnooze.objects.filter(id=rule_snooze.id).exists()
  139. def test_delete_error_events(self):
  140. keeper = self.create_project(name="keeper")
  141. project = self.create_project(name="test")
  142. event = self.store_event(
  143. data={
  144. "timestamp": iso_format(before_now(minutes=1)),
  145. "message": "oh no",
  146. },
  147. project_id=project.id,
  148. )
  149. assert event.group is not None
  150. group = event.group
  151. group_seen = GroupSeen.objects.create(group=group, project=project, user_id=self.user.id)
  152. self.ScheduledDeletion.schedule(instance=project, days=0)
  153. with self.tasks():
  154. run_scheduled_deletions()
  155. assert not Project.objects.filter(id=project.id).exists()
  156. assert not GroupSeen.objects.filter(id=group_seen.id).exists()
  157. assert not Group.objects.filter(id=group.id).exists()
  158. conditions = eventstore.Filter(project_ids=[project.id, keeper.id], group_ids=[group.id])
  159. events = eventstore.backend.get_events(
  160. conditions, tenant_ids={"organization_id": 123, "referrer": "r"}
  161. )
  162. assert len(events) == 0