Skip to content

Commit 9e1f037

Browse files
asottile-sentryandrewshie-sentry
authored andcommitted
ref: avoid very old fixed dates in test_organization_stats_summary (#90737)
this is currently the number one flaky test at sentry -- for some reason it only seems to fail from a blank database with a particular number of tests ahead of it (some timing issue? some periodic data cleanup task? unclear to me at least). by modernizing the dates it seems to avoid that issue <!-- Describe your PR here. -->
1 parent 9d86a4d commit 9e1f037

File tree

1 file changed

+52
-41
lines changed

1 file changed

+52
-41
lines changed

tests/snuba/api/endpoints/test_organization_stats_summary.py

Lines changed: 52 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
from __future__ import annotations
22

33
import functools
4-
from datetime import datetime, timedelta, timezone
4+
from datetime import UTC, datetime, timedelta
55
from typing import Any
66

77
from django.urls import reverse
88

99
from sentry.constants import DataCategory
1010
from sentry.testutils.cases import APITestCase, OutcomesSnubaTest
1111
from sentry.testutils.helpers.datetime import freeze_time
12+
from sentry.utils.dates import floor_to_utc_day
1213
from sentry.utils.outcomes import Outcome
1314

1415

16+
def _iso_z(dt: datetime) -> str:
17+
assert dt.tzinfo == UTC
18+
return f"{dt.isoformat().removesuffix('+00:00')}Z"
19+
20+
1521
class OrganizationStatsSummaryTest(APITestCase, OutcomesSnubaTest):
22+
_now = datetime.now(UTC).replace(hour=12, minute=27, second=28, microsecond=0)
23+
1624
def setUp(self):
1725
super().setUp()
18-
self.now = datetime(2021, 3, 14, 12, 27, 28, tzinfo=timezone.utc)
1926

2027
self.login_as(user=self.user)
2128

@@ -45,7 +52,7 @@ def setUp(self):
4552
self.store_outcomes(
4653
{
4754
"org_id": self.org.id,
48-
"timestamp": self.now - timedelta(hours=1),
55+
"timestamp": self._now - timedelta(hours=1),
4956
"project_id": self.project.id,
5057
"outcome": Outcome.ACCEPTED,
5158
"reason": "none",
@@ -57,7 +64,7 @@ def setUp(self):
5764
self.store_outcomes(
5865
{
5966
"org_id": self.org.id,
60-
"timestamp": self.now - timedelta(hours=1),
67+
"timestamp": self._now - timedelta(hours=1),
6168
"project_id": self.project.id,
6269
"outcome": Outcome.ACCEPTED,
6370
"reason": "none",
@@ -69,7 +76,7 @@ def setUp(self):
6976
self.store_outcomes(
7077
{
7178
"org_id": self.org.id,
72-
"timestamp": self.now - timedelta(hours=1),
79+
"timestamp": self._now - timedelta(hours=1),
7380
"project_id": self.project.id,
7481
"outcome": Outcome.RATE_LIMITED,
7582
"reason": "smart_rate_limit",
@@ -80,7 +87,7 @@ def setUp(self):
8087
self.store_outcomes(
8188
{
8289
"org_id": self.org.id,
83-
"timestamp": self.now - timedelta(hours=1),
90+
"timestamp": self._now - timedelta(hours=1),
8491
"project_id": self.project2.id,
8592
"outcome": Outcome.RATE_LIMITED,
8693
"reason": "smart_rate_limit",
@@ -142,27 +149,31 @@ def test_unknown_field(self):
142149

143150
def test_no_end_param(self):
144151
response = self.do_request(
145-
{"field": ["sum(quantity)"], "interval": "1d", "start": "2021-03-14T00:00:00Z"}
152+
{
153+
"field": ["sum(quantity)"],
154+
"interval": "1d",
155+
"start": floor_to_utc_day(self._now).isoformat(),
156+
}
146157
)
147158

148159
assert response.status_code == 400, response.content
149160
assert response.data == {"detail": "start and end are both required"}
150161

151-
@freeze_time(datetime(2021, 3, 14, 12, 27, 28, tzinfo=timezone.utc))
162+
@freeze_time(_now)
152163
def test_future_request(self):
153164
response = self.do_request(
154165
{
155166
"field": ["sum(quantity)"],
156167
"interval": "1h",
157168
"category": ["error"],
158-
"start": "2021-03-14T15:30:00",
159-
"end": "2021-03-14T16:30:00",
169+
"start": self._now.replace(hour=15, minute=30, second=0).isoformat(),
170+
"end": self._now.replace(hour=16, minute=30, second=0).isoformat(),
160171
}
161172
)
162173
assert response.status_code == 200, response.content
163174
assert response.data == {
164-
"start": "2021-03-14T12:00:00Z",
165-
"end": "2021-03-14T17:00:00Z",
175+
"start": _iso_z(self._now.replace(hour=12, minute=0, second=0)),
176+
"end": _iso_z(self._now.replace(hour=17, minute=0, second=0)),
166177
"projects": [],
167178
}
168179

@@ -212,7 +223,7 @@ def test_resolution_invalid(self):
212223

213224
assert response.status_code == 400, response.content
214225

215-
@freeze_time("2021-03-14T12:27:28.303Z")
226+
@freeze_time(_now)
216227
def test_attachment_filter_only(self):
217228
response = self.do_request(
218229
{
@@ -229,7 +240,7 @@ def test_attachment_filter_only(self):
229240
"detail": "if filtering by attachment no other category may be present"
230241
}
231242

232-
@freeze_time("2021-03-14T12:27:28.303Z")
243+
@freeze_time(_now)
233244
def test_user_all_accessible(self):
234245
response = self.do_request(
235246
{
@@ -256,12 +267,12 @@ def test_user_all_accessible(self):
256267

257268
assert response.status_code == 200
258269
assert response.data == {
259-
"start": "2021-03-13T00:00:00Z",
260-
"end": "2021-03-15T00:00:00Z",
270+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
271+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
261272
"projects": [],
262273
}
263274

264-
@freeze_time("2021-03-14T12:27:28.303Z")
275+
@freeze_time(_now)
265276
def test_no_project_access(self):
266277
user = self.create_user(is_superuser=False)
267278
self.create_member(user=user, organization=self.organization, role="member", teams=[])
@@ -281,7 +292,7 @@ def test_no_project_access(self):
281292
assert response.status_code == 403, response.content
282293
assert response.data == {"detail": "You do not have permission to perform this action."}
283294

284-
@freeze_time("2021-03-14T12:27:28.303Z")
295+
@freeze_time(_now)
285296
def test_open_membership_semantics(self):
286297
self.org.flags.allow_joinleave = True
287298
self.org.save()
@@ -299,8 +310,8 @@ def test_open_membership_semantics(self):
299310

300311
assert response.status_code == 200
301312
assert response.data == {
302-
"start": "2021-03-13T00:00:00Z",
303-
"end": "2021-03-15T00:00:00Z",
313+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
314+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
304315
"projects": [
305316
{
306317
"id": self.project.id,
@@ -343,7 +354,7 @@ def test_open_membership_semantics(self):
343354
],
344355
}
345356

346-
@freeze_time("2021-03-14T12:27:28.303Z")
357+
@freeze_time(_now)
347358
def test_org_simple(self):
348359
make_request = functools.partial(
349360
self.client.get,
@@ -359,8 +370,8 @@ def test_org_simple(self):
359370

360371
assert response.status_code == 200, response.content
361372
assert response.data == {
362-
"start": "2021-03-12T00:00:00Z",
363-
"end": "2021-03-15T00:00:00Z",
373+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=2)),
374+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
364375
"projects": [
365376
{
366377
"id": self.project.id,
@@ -416,7 +427,7 @@ def test_org_simple(self):
416427
],
417428
}
418429

419-
@freeze_time("2021-03-14T12:27:28.303Z")
430+
@freeze_time(_now)
420431
def test_org_multiple_fields(self):
421432
make_request = functools.partial(
422433
self.client.get,
@@ -432,8 +443,8 @@ def test_org_multiple_fields(self):
432443

433444
assert response.status_code == 200, response.content
434445
assert response.data == {
435-
"start": "2021-03-12T00:00:00Z",
436-
"end": "2021-03-15T00:00:00Z",
446+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=2)),
447+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
437448
"projects": [
438449
{
439450
"id": self.project.id,
@@ -493,7 +504,7 @@ def test_org_multiple_fields(self):
493504
],
494505
}
495506

496-
@freeze_time("2021-03-14T12:27:28.303Z")
507+
@freeze_time(_now)
497508
def test_org_project_totals_per_project(self):
498509
make_request = functools.partial(
499510
self.client.get,
@@ -510,8 +521,8 @@ def test_org_project_totals_per_project(self):
510521

511522
assert response_per_group.status_code == 200, response_per_group.content
512523
assert response_per_group.data == {
513-
"start": "2021-03-13T12:00:00Z",
514-
"end": "2021-03-14T13:00:00Z",
524+
"start": _iso_z((self._now - timedelta(days=1)).replace(hour=12, minute=0, second=0)),
525+
"end": _iso_z(self._now.replace(hour=13, minute=0, second=0)),
515526
"projects": [
516527
{
517528
"id": self.project.id,
@@ -554,7 +565,7 @@ def test_org_project_totals_per_project(self):
554565
],
555566
}
556567

557-
@freeze_time("2021-03-14T12:27:28.303Z")
568+
@freeze_time(_now)
558569
def test_project_filter(self):
559570
make_request = functools.partial(
560571
self.client.get,
@@ -572,8 +583,8 @@ def test_project_filter(self):
572583

573584
assert response.status_code == 200, response.content
574585
assert response.data == {
575-
"start": "2021-03-13T00:00:00Z",
576-
"end": "2021-03-15T00:00:00Z",
586+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
587+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
577588
"projects": [
578589
{
579590
"id": self.project.id,
@@ -597,7 +608,7 @@ def test_project_filter(self):
597608
],
598609
}
599610

600-
@freeze_time("2021-03-14T12:27:28.303Z")
611+
@freeze_time(_now)
601612
def test_reason_filter(self):
602613
make_request = functools.partial(
603614
self.client.get,
@@ -615,8 +626,8 @@ def test_reason_filter(self):
615626

616627
assert response.status_code == 200, response.content
617628
assert response.data == {
618-
"start": "2021-03-13T00:00:00Z",
619-
"end": "2021-03-15T00:00:00Z",
629+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
630+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
620631
"projects": [
621632
{
622633
"id": self.project.id,
@@ -661,7 +672,7 @@ def test_reason_filter(self):
661672
],
662673
}
663674

664-
@freeze_time("2021-03-14T12:27:28.303Z")
675+
@freeze_time(_now)
665676
def test_outcome_filter(self):
666677
make_request = functools.partial(
667678
self.client.get,
@@ -678,8 +689,8 @@ def test_outcome_filter(self):
678689
)
679690
assert response.status_code == 200, response.content
680691
assert response.data == {
681-
"start": "2021-03-13T00:00:00Z",
682-
"end": "2021-03-15T00:00:00Z",
692+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
693+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
683694
"projects": [
684695
{
685696
"id": self.project.id,
@@ -697,7 +708,7 @@ def test_outcome_filter(self):
697708
],
698709
}
699710

700-
@freeze_time("2021-03-14T12:27:28.303Z")
711+
@freeze_time(_now)
701712
def test_category_filter(self):
702713
make_request = functools.partial(
703714
self.client.get,
@@ -713,8 +724,8 @@ def test_category_filter(self):
713724
)
714725
assert response.status_code == 200, response.content
715726
assert response.data == {
716-
"start": "2021-03-13T00:00:00Z",
717-
"end": "2021-03-15T00:00:00Z",
727+
"start": _iso_z(floor_to_utc_day(self._now) - timedelta(days=1)),
728+
"end": _iso_z(floor_to_utc_day(self._now) + timedelta(days=1)),
718729
"projects": [
719730
{
720731
"id": self.project.id,

0 commit comments

Comments
 (0)