Skip to content

Commit 045b32a

Browse files
authored
ref(tests): Remove setUp function (#101796)
Last week when I was debugging tests for #101720 it was confusing to find events and groups that had nothing to do with the tests I was working on. This refactor moves the majority of the logic from the setUp function to the first test since it's where its needed.
1 parent 45381d5 commit 045b32a

File tree

1 file changed

+86
-70
lines changed

1 file changed

+86
-70
lines changed

tests/sentry/deletions/test_group.py

Lines changed: 86 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
import random
33
from datetime import datetime, timedelta
44
from time import time
5+
from typing import Any
56
from unittest import mock
67
from uuid import uuid4
78

89
from snuba_sdk import Column, Condition, Entity, Function, Op, Query, Request
910

1011
from sentry import deletions, nodestore
11-
from sentry.deletions.defaults.group import ErrorEventsDeletionTask
1212
from sentry.deletions.tasks.groups import delete_groups_for_project
1313
from sentry.issues.grouptype import FeedbackGroup, GroupCategory
1414
from sentry.issues.issue_occurrence import IssueOccurrence
@@ -31,93 +31,102 @@
3131

3232

3333
class DeleteGroupTest(TestCase, SnubaTestCase):
34-
def setUp(self) -> None:
35-
super().setUp()
36-
one_minute = before_now(minutes=1).isoformat()
37-
group1_data = {"timestamp": one_minute, "fingerprint": ["group1"]}
38-
group2_data = {"timestamp": one_minute, "fingerprint": ["group2"]}
39-
40-
# Group 1 events
41-
self.event = self.store_event(
42-
data=group1_data | {"tags": {"foo": "bar"}}, project_id=self.project.id
43-
)
44-
self.event_id = self.event.event_id
45-
self.node_id = Event.generate_node_id(self.project.id, self.event_id)
46-
group = self.event.group
47-
self.event2 = self.store_event(data=group1_data, project_id=self.project.id)
48-
self.node_id2 = Event.generate_node_id(self.project.id, self.event2.event_id)
4934

50-
# Group 2 event
51-
self.keep_event = self.store_event(data=group2_data, project_id=self.project.id)
52-
self.keep_node_id = Event.generate_node_id(self.project.id, self.keep_event.event_id)
35+
def _generate_data(self, fingerprint: str | None = None) -> dict[str, Any]:
36+
return {
37+
"fingerprint": [fingerprint or uuid4().hex],
38+
"timestamp": before_now(minutes=1).isoformat(),
39+
}
40+
41+
def _get_node_id(self, event: Event) -> str:
42+
return Event.generate_node_id(event.project_id, event.event_id)
5343

44+
def _create_event_with_many_group_children(self) -> Event:
45+
event = self.store_event(
46+
data=self._generate_data(fingerprint="group1"),
47+
project_id=self.project.id,
48+
)
5449
UserReport.objects.create(
55-
group_id=group.id, project_id=self.event.project_id, name="With group id"
50+
group_id=event.group.id, project_id=event.project_id, name="With group id"
5651
)
5752
UserReport.objects.create(
58-
event_id=self.event.event_id, project_id=self.event.project_id, name="With event id"
53+
event_id=event.event_id, project_id=event.project_id, name="With event id"
5954
)
6055
EventAttachment.objects.create(
61-
event_id=self.event.event_id,
62-
project_id=self.event.project_id,
56+
event_id=event.event_id,
57+
project_id=event.project_id,
6358
name="hello.png",
6459
content_type="image/png",
6560
)
66-
GroupAssignee.objects.create(group=group, project=self.project, user_id=self.user.id)
67-
GroupHash.objects.create(project=self.project, group=group, hash=uuid4().hex)
68-
GroupMeta.objects.create(group=group, key="foo", value="bar")
69-
GroupRedirect.objects.create(group_id=group.id, previous_group_id=1)
61+
GroupAssignee.objects.create(group=event.group, project=self.project, user_id=self.user.id)
62+
GroupHash.objects.create(project=self.project, group=event.group, hash=uuid4().hex)
63+
GroupMeta.objects.create(group=event.group, key="foo", value="bar")
64+
GroupRedirect.objects.create(group_id=event.group.id, previous_group_id=1)
7065

71-
def test_simple(self) -> None:
72-
ErrorEventsDeletionTask.DEFAULT_CHUNK_SIZE = 1 # test chunking logic
73-
group = self.event.group
74-
assert nodestore.backend.get(self.node_id)
75-
assert nodestore.backend.get(self.node_id2)
76-
assert nodestore.backend.get(self.keep_node_id)
66+
return event
67+
68+
def test_delete_group_with_many_related_children(self) -> None:
69+
event = self._create_event_with_many_group_children()
70+
assert event.group is not None
71+
72+
event2 = self.store_event(
73+
data=self._generate_data(fingerprint="group1"), project_id=self.project.id
74+
)
75+
assert event2.group is not None
76+
77+
assert nodestore.backend.get(self._get_node_id(event))
78+
assert nodestore.backend.get(self._get_node_id(event2))
7779

7880
with self.tasks():
7981
delete_groups_for_project(
80-
object_ids=[group.id], transaction_id=uuid4().hex, project_id=self.project.id
82+
object_ids=[event.group.id], transaction_id=uuid4().hex, project_id=self.project.id
8183
)
8284

83-
assert not UserReport.objects.filter(group_id=group.id).exists()
84-
assert not UserReport.objects.filter(event_id=self.event.event_id).exists()
85-
assert not EventAttachment.objects.filter(event_id=self.event.event_id).exists()
85+
assert not UserReport.objects.filter(group_id=event.group.id).exists()
86+
assert not UserReport.objects.filter(event_id=event.event_id).exists()
87+
assert not EventAttachment.objects.filter(event_id=event.event_id).exists()
8688

87-
assert not GroupRedirect.objects.filter(group_id=group.id).exists()
88-
assert not GroupHash.objects.filter(group_id=group.id).exists()
89-
assert not Group.objects.filter(id=group.id).exists()
90-
assert not nodestore.backend.get(self.node_id)
91-
assert not nodestore.backend.get(self.node_id2)
92-
assert nodestore.backend.get(self.keep_node_id), "Does not remove from second group"
93-
assert Group.objects.filter(id=self.keep_event.group_id).exists()
89+
assert not GroupRedirect.objects.filter(group_id=event.group.id).exists()
90+
assert not GroupHash.objects.filter(group_id=event.group.id).exists()
91+
assert not Group.objects.filter(id=event.group.id).exists()
92+
assert not nodestore.backend.get(self._get_node_id(event))
93+
assert not nodestore.backend.get(self._get_node_id(event2))
9494

95-
def test_simple_multiple_groups(self) -> None:
95+
def test_multiple_groups(self) -> None:
96+
event = self.store_event(
97+
data=self._generate_data(fingerprint="group1"),
98+
project_id=self.project.id,
99+
)
100+
assert event.group is not None
101+
keep_event = self.store_event(
102+
data=self._generate_data(fingerprint="group2"),
103+
project_id=self.project.id,
104+
)
105+
assert keep_event.group is not None
96106
other_event = self.store_event(
97-
data={"timestamp": before_now(minutes=1).isoformat(), "fingerprint": ["group3"]},
107+
data=self._generate_data(fingerprint="group3"),
98108
project_id=self.project.id,
99109
)
100-
other_node_id = Event.generate_node_id(self.project.id, other_event.event_id)
110+
assert other_event.group is not None
101111

102-
group = self.event.group
103112
with self.tasks():
104113
delete_groups_for_project(
105-
object_ids=[group.id, other_event.group_id],
114+
object_ids=[event.group.id, other_event.group.id],
106115
transaction_id=uuid4().hex,
107116
project_id=self.project.id,
108117
)
109118

110-
assert not Group.objects.filter(id=group.id).exists()
119+
assert not Group.objects.filter(id=event.group.id).exists()
111120
assert not Group.objects.filter(id=other_event.group_id).exists()
112-
assert not nodestore.backend.get(self.node_id)
113-
assert not nodestore.backend.get(other_node_id)
121+
assert not nodestore.backend.get(self._get_node_id(event))
122+
assert not nodestore.backend.get(self._get_node_id(other_event))
114123

115-
assert Group.objects.filter(id=self.keep_event.group_id).exists()
116-
assert nodestore.backend.get(self.keep_node_id)
124+
assert Group.objects.filter(id=keep_event.group.id).exists()
125+
assert nodestore.backend.get(self._get_node_id(keep_event))
117126

118127
def test_grouphistory_relation(self) -> None:
119128
other_event = self.store_event(
120-
data={"timestamp": before_now(minutes=1).isoformat(), "fingerprint": ["group3"]},
129+
data=self._generate_data(fingerprint="other_group"),
121130
project_id=self.project.id,
122131
)
123132
other_group = other_event.group
@@ -172,39 +181,45 @@ def test_delete_groups_delete_grouping_records_by_hash(
172181
self, mock_delete_seer_grouping_records_by_hash_apply_async: mock.Mock
173182
) -> None:
174183
self.project.update_option("sentry:similarity_backfill_completed", int(time()))
184+
event = self.store_event(
185+
data=self._generate_data(fingerprint="group1"),
186+
project_id=self.project.id,
187+
)
188+
assert event.group
189+
keep_event = self.store_event(
190+
data=self._generate_data(fingerprint="group2"),
191+
project_id=self.project.id,
192+
)
193+
assert keep_event.group
175194
other_event = self.store_event(
176-
data={
177-
"timestamp": before_now(minutes=1).isoformat(),
178-
"fingerprint": ["group3"],
179-
},
195+
data=self._generate_data(fingerprint="group3"),
180196
project_id=self.project.id,
181197
)
182-
other_node_id = Event.generate_node_id(self.project.id, other_event.event_id)
183198

184199
hashes = [
185200
grouphash.hash
186201
for grouphash in GroupHash.objects.filter(
187-
project_id=self.project.id, group_id__in=[self.event.group.id, other_event.group_id]
202+
project_id=self.project.id, group_id__in=[event.group.id, other_event.group_id]
188203
)
189204
]
190-
group = self.event.group
205+
191206
with self.tasks():
192207
delete_groups_for_project(
193-
object_ids=[group.id, other_event.group_id],
208+
object_ids=[event.group.id, other_event.group_id],
194209
transaction_id=uuid4().hex,
195210
project_id=self.project.id,
196211
)
197212

198-
assert not Group.objects.filter(id=group.id).exists()
213+
assert not Group.objects.filter(id=event.group.id).exists()
199214
assert not Group.objects.filter(id=other_event.group_id).exists()
200-
assert not nodestore.backend.get(self.node_id)
201-
assert not nodestore.backend.get(other_node_id)
215+
assert not nodestore.backend.get(self._get_node_id(event))
216+
assert not nodestore.backend.get(self._get_node_id(other_event))
202217

203-
assert Group.objects.filter(id=self.keep_event.group_id).exists()
204-
assert nodestore.backend.get(self.keep_node_id)
218+
assert Group.objects.filter(id=keep_event.group_id).exists()
219+
assert nodestore.backend.get(self._get_node_id(keep_event))
205220

206221
assert mock_delete_seer_grouping_records_by_hash_apply_async.call_args[1] == {
207-
"args": [group.project.id, hashes, 0]
222+
"args": [event.project.id, hashes, 0]
208223
}
209224

210225
@mock.patch(
@@ -291,13 +306,14 @@ def test_delete_grouphashes_and_metadata(self) -> None:
291306
project_id=self.project.id,
292307
)
293308
grouphash_b = GroupHash.objects.get(hash=event_b.get_primary_hash())
294-
# assert grouphash_b.metadata is not None
295309
assert grouphash_b.metadata is not None
296310
metadata_b_id = grouphash_b.metadata.id
297311

298312
# Verify that seer matched event_b to event_a's hash
299313
assert event_a.group_id == event_b.group_id
314+
300315
# Make sure it has not changed
316+
grouphash_a.refresh_from_db()
301317
assert grouphash_a.metadata is not None
302318
assert grouphash_a.metadata.seer_matched_grouphash is None
303319
assert grouphash_b.metadata is not None

0 commit comments

Comments
 (0)