Browse Source

ref: fix some nullability issues in tests (#72429)

this fixes ~160 typing errors once BaseManager is type checked

<!-- Describe your PR here. -->
anthony sottile 9 months ago
parent
commit
f13b22e537

+ 3 - 3
tests/sentry/api/endpoints/internal/test_integration_proxy.py

@@ -70,9 +70,9 @@ class InternalIntegrationProxyEndpointTest(APITestCase):
         self.integration = self.create_integration(
             self.organization, external_id="example:1", provider="example"
         )
-        self.org_integration = OrganizationIntegration.objects.filter(
+        self.org_integration = OrganizationIntegration.objects.get(
             integration_id=self.integration.id
-        ).first()
+        )
 
         self.valid_header_kwargs = self.create_request_headers(
             integration_id=self.org_integration.id, signature_path=self.proxy_path
@@ -82,7 +82,7 @@ class InternalIntegrationProxyEndpointTest(APITestCase):
     def create_request_headers(
         self,
         signature_path,
-        integration_id: str | None = None,
+        integration_id: int | None = None,
         request_body=b"",
         base_url="https://example.com/api",
     ):

+ 3 - 3
tests/sentry/event_manager/test_event_manager.py

@@ -192,8 +192,8 @@ class EventManagerTest(TestCase, SnubaTestCase, EventManagerTestMixin, Performan
         assert group.times_seen == 2
         assert group.last_seen == event2.datetime
         assert group.message == event2.message
-        assert group.data.get("type") == "default"
-        assert group.data.get("metadata").get("title") == "foo bar"
+        assert group.data["type"] == "default"
+        assert group.data["metadata"]["title"] == "foo bar"
 
     def test_materialze_metadata_simple(self) -> None:
         manager = EventManager(make_event(transaction="/dogs/are/great/"))
@@ -2229,7 +2229,7 @@ class EventManagerTest(TestCase, SnubaTestCase, EventManagerTestMixin, Performan
 
             # and we should see an audit log record.
             with assume_test_silo_mode_of(AuditLogEntry):
-                record = AuditLogEntry.objects.first()
+                record = AuditLogEntry.objects.get()
             assert record.event == audit_log.get_event_id("PROJECT_EDIT")
             assert record.data["sentry:grouping_config"] == DEFAULT_GROUPING_CONFIG
             assert record.data["slug"] == self.project.slug

+ 10 - 10
tests/sentry/integrations/slack/webhooks/actions/test_status.py

@@ -599,7 +599,7 @@ class StatusActionTest(BaseEventTest, PerformanceIssueTestCase, HybridCloudTestM
 
             assert resp.status_code == 200, resp.content
             assert GroupAssignee.objects.filter(group=self.group, team=self.team).exists()
-            activity = Activity.objects.filter(group=self.group).first()
+            activity = Activity.objects.filter(group=self.group)[0]
             assert activity.data == {
                 "assignee": str(user2.id),
                 "assigneeEmail": user2.email,
@@ -634,14 +634,14 @@ class StatusActionTest(BaseEventTest, PerformanceIssueTestCase, HybridCloudTestM
         assert ":red_circle:" in resp.data["blocks"][0]["text"]["text"]
 
         # Assert group assignment activity recorded
-        group_activity = Activity.objects.filter(group=self.group)
-        assert group_activity.first().data == {
+        group_activity = list(Activity.objects.filter(group=self.group))
+        assert group_activity[0].data == {
             "assignee": str(user2.id),
             "assigneeEmail": user2.email,
             "assigneeType": "user",
             "integration": ActivityIntegration.SLACK.value,
         }
-        assert group_activity.last().data == {
+        assert group_activity[-1].data == {
             "assignee": str(self.team.id),
             "assigneeEmail": None,
             "assigneeType": "team",
@@ -671,14 +671,14 @@ class StatusActionTest(BaseEventTest, PerformanceIssueTestCase, HybridCloudTestM
         assert ":white_circle:" in resp.data["blocks"][0]["text"]["text"]
 
         # Assert group assignment activity recorded
-        group_activity = Activity.objects.filter(group=self.group)
-        assert group_activity.first().data == {
+        group_activity = list(Activity.objects.filter(group=self.group))
+        assert group_activity[0].data == {
             "assignee": str(user2.id),
             "assigneeEmail": user2.email,
             "assigneeType": "user",
             "integration": ActivityIntegration.SLACK.value,
         }
-        assert group_activity.last().data == {
+        assert group_activity[-1].data == {
             "assignee": str(self.team.id),
             "assigneeEmail": None,
             "assigneeType": "team",
@@ -706,14 +706,14 @@ class StatusActionTest(BaseEventTest, PerformanceIssueTestCase, HybridCloudTestM
         assert resp.data["blocks"][2]["text"]["text"].endswith(expect_status), resp.data["text"]
 
         # Assert group assignment activity recorded
-        group_activity = Activity.objects.filter(group=self.group)
-        assert group_activity.first().data == {
+        group_activity = list(Activity.objects.filter(group=self.group))
+        assert group_activity[0].data == {
             "assignee": str(user2.id),
             "assigneeEmail": user2.email,
             "assigneeType": "user",
             "integration": ActivityIntegration.SLACK.value,
         }
-        assert group_activity.last().data == {
+        assert group_activity[-1].data == {
             "assignee": str(self.team.id),
             "assigneeEmail": None,
             "assigneeType": "team",

+ 7 - 7
tests/sentry/integrations/vsts/test_client.py

@@ -45,7 +45,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
 
         # Make a request with expired token
         integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_client(base_url=self.vsts_base_url).get_projects()
 
         # Second to last request, before the Projects request, was to refresh
@@ -92,7 +92,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
         # Make a request
 
         integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_client(base_url=self.vsts_base_url).get_projects()
         assert len(responses.calls) == 1
         assert (
@@ -126,7 +126,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
 
         projects = (
             integration.get_installation(
-                integration.organizationintegration_set.first().organization_id
+                integration.organizationintegration_set.get().organization_id
             )
             .get_client(base_url=self.vsts_base_url)
             .get_projects()
@@ -159,7 +159,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
             )
 
         client = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_client(base_url=self.vsts_base_url)
 
         responses.calls.reset()
@@ -216,7 +216,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
             )
 
         client = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_client(base_url=self.vsts_base_url)
 
         path = "src/sentry/integrations/vsts/client.py"
@@ -251,7 +251,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
             )
 
         client = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_client(base_url=self.vsts_base_url)
 
         path = "src/sentry/integrations/vsts/client.py"
@@ -268,7 +268,7 @@ class VstsApiClientTest(VstsIntegrationTestCase):
         self.assert_installation()
         integration = Integration.objects.get(provider="vsts")
         installation = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         )
         with assume_test_silo_mode(SiloMode.REGION):
             repo = Repository.objects.create(

+ 7 - 7
tests/sentry/integrations/vsts/test_integration.py

@@ -148,7 +148,7 @@ class VstsIntegrationProviderTest(VstsIntegrationTestCase):
         self.assert_installation()
         integration = Integration.objects.get(provider="vsts")
         installation = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         )
 
         test_cases = [
@@ -182,7 +182,7 @@ class VstsIntegrationProviderTest(VstsIntegrationTestCase):
         self.assert_installation()
         integration = Integration.objects.get(provider="vsts")
         installation = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         )
 
         with assume_test_silo_mode(SiloMode.REGION):
@@ -208,7 +208,7 @@ class VstsIntegrationProviderTest(VstsIntegrationTestCase):
         self.assert_installation()
         integration = Integration.objects.get(provider="vsts")
         installation = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         )
 
         with assume_test_silo_mode(SiloMode.REGION):
@@ -339,7 +339,7 @@ class VstsIntegrationTest(VstsIntegrationTestCase):
         integration = Integration.objects.get(provider="vsts")
 
         fields = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         ).get_organization_config()
 
         assert [field["name"] for field in fields] == [
@@ -354,12 +354,12 @@ class VstsIntegrationTest(VstsIntegrationTestCase):
         self.assert_installation()
         integration = Integration.objects.get(provider="vsts")
         installation = integration.get_installation(
-            integration.organizationintegration_set.first().organization_id
+            integration.organizationintegration_set.get().organization_id
         )
 
         # Set the `default_identity` property and force token expiration
         installation.get_client()
-        identity = Identity.objects.filter(id=installation.default_identity.id).first()
+        identity = Identity.objects.get(id=installation.default_identity.id)
         identity.data["expires"] = 1566851050
         identity.save()
 
@@ -513,7 +513,7 @@ class VstsIntegrationTest(VstsIntegrationTestCase):
 
         # Set the `default_identity` property and force token expiration
         installation.get_client()
-        identity = Identity.objects.filter(id=installation.default_identity.id).first()
+        identity = Identity.objects.get(id=installation.default_identity.id)
         identity.data["expires"] = 1566851050
         identity.save()
 

+ 6 - 12
tests/sentry/issues/endpoints/test_organization_group_index.py

@@ -4035,10 +4035,7 @@ class GroupUpdateTest(APITestCase, SnubaTestCase):
 
         # The current_release_version should be to the latest (in semver) release associated with
         # a group
-        grp_resolution = GroupResolution.objects.filter(group=group)
-
-        assert len(grp_resolution) == 1
-        grp_resolution = grp_resolution.first()
+        grp_resolution = GroupResolution.objects.get(group=group)
 
         assert grp_resolution.current_release_version == release_2.version
 
@@ -4057,11 +4054,11 @@ class GroupUpdateTest(APITestCase, SnubaTestCase):
             assert not GroupResolution.has_resolution(group=group, release=release)
 
         # Ensure that Activity has `current_release_version` set on `Resolved in next release`
-        activity = Activity.objects.filter(
+        activity = Activity.objects.get(
             group=grp_resolution.group,
             type=ActivityType.SET_RESOLVED_IN_RELEASE.value,
             ident=grp_resolution.id,
-        ).first()
+        )
 
         assert "current_release_version" in activity.data
         assert activity.data["current_release_version"] == release_2.version
@@ -4201,21 +4198,18 @@ class GroupUpdateTest(APITestCase, SnubaTestCase):
         assert response.data["status"] == "resolved"
         assert response.data["statusDetails"]["inNextRelease"]
 
-        grp_resolution = GroupResolution.objects.filter(group=group)
-
-        assert len(grp_resolution) == 1
-        grp_resolution = grp_resolution[0]
+        grp_resolution = GroupResolution.objects.get(group=group)
 
         assert grp_resolution.current_release_version == release_1.version
         assert grp_resolution.release.id == release_2.id
         assert grp_resolution.type == GroupResolution.Type.in_release
         assert grp_resolution.status == GroupResolution.Status.resolved
 
-        activity = Activity.objects.filter(
+        activity = Activity.objects.get(
             group=grp_resolution.group,
             type=ActivityType.SET_RESOLVED_IN_RELEASE.value,
             ident=grp_resolution.id,
-        ).first()
+        )
         assert activity.data["version"] == release_2.version
 
     def test_selective_status_update(self) -> None:

+ 4 - 12
tests/sentry/issues/test_status_change.py

@@ -36,9 +36,7 @@ class HandleStatusChangeTest(TestCase):
         )
 
         assert issue_unignored.called
-        activity = Activity.objects.filter(
-            group=self.group, type=ActivityType.SET_UNRESOLVED.value
-        ).first()
+        activity = Activity.objects.get(group=self.group, type=ActivityType.SET_UNRESOLVED.value)
         assert activity.data == {}
 
         assert GroupHistory.objects.filter(
@@ -61,9 +59,7 @@ class HandleStatusChangeTest(TestCase):
         )
 
         assert issue_unresolved.called
-        activity = Activity.objects.filter(
-            group=self.group, type=ActivityType.SET_UNRESOLVED.value
-        ).first()
+        activity = Activity.objects.get(group=self.group, type=ActivityType.SET_UNRESOLVED.value)
         assert activity.data == {}
 
         assert GroupHistory.objects.filter(
@@ -86,9 +82,7 @@ class HandleStatusChangeTest(TestCase):
         )
 
         assert issue_ignored.called
-        activity = Activity.objects.filter(
-            group=self.group, type=ActivityType.SET_IGNORED.value
-        ).first()
+        activity = Activity.objects.get(group=self.group, type=ActivityType.SET_IGNORED.value)
         assert activity.data.get("ignoreDuration") == 30
 
         assert GroupHistory.objects.filter(
@@ -111,9 +105,7 @@ class HandleStatusChangeTest(TestCase):
         )
 
         assert issue_ignored.called
-        activity = Activity.objects.filter(
-            group=self.group, type=ActivityType.SET_IGNORED.value
-        ).first()
+        activity = Activity.objects.get(group=self.group, type=ActivityType.SET_IGNORED.value)
         assert activity.data.get("ignoreUntilEscalating")
 
         assert GroupHistory.objects.filter(

+ 5 - 1
tests/sentry/issues/test_utils.py

@@ -20,7 +20,11 @@ from sentry.testutils.helpers.datetime import iso_format
 
 
 class OccurrenceTestMixin:
-    def assert_occurrences_identical(self, o1: IssueOccurrence, o2: IssueOccurrence) -> None:
+    def assert_occurrences_identical(
+        self, o1: IssueOccurrence | None, o2: IssueOccurrence | None
+    ) -> None:
+        assert o1 is not None
+        assert o2 is not None
         assert o1.id == o2.id
         assert o1.event_id == o2.event_id
         assert o1.fingerprint == o2.fingerprint

+ 7 - 4
tests/sentry/models/test_group.py

@@ -383,9 +383,10 @@ class GroupGetLatestEventTest(TestCase, OccurrenceTestMixin):
             project_id=self.project.id,
         )
 
-        group = Group.objects.first()
+        group = Group.objects.get()
 
         group_event = group.get_latest_event()
+        assert group_event is not None
 
         assert group_event.event_id == "b" * 32
         assert group_event.occurrence is None
@@ -403,9 +404,10 @@ class GroupGetLatestEventTest(TestCase, OccurrenceTestMixin):
             data={"event_id": "b" * 32, "fingerprint": ["group-1"], "timestamp": self.min_ago},
             project_id=self.project.id,
         )
-        group = Group.objects.first()
+        group = Group.objects.get()
 
         group_event = group.get_latest_event()
+        assert group_event is not None
 
         assert group_event.event_id == "b" * 32
         assert group_event.occurrence is None
@@ -421,10 +423,11 @@ class GroupGetLatestEventTest(TestCase, OccurrenceTestMixin):
             },
         )
 
-        group = Group.objects.first()
+        group = Group.objects.get()
         group.update(type=ProfileFileIOGroupType.type_id)
 
         group_event = group.get_latest_event()
+        assert group_event is not None
         assert group_event.event_id == event_id
         self.assert_occurrences_identical(group_event.occurrence, occurrence)
 
@@ -451,7 +454,7 @@ class GroupReplaysCacheTest(SnubaTestCase, ReplaysSnubaTestCase):
                 replay1_id,
             )
         )
-        group = Group.objects.first()
+        group = Group.objects.get()
         assert group.has_replays() is True
 
         # test caching

+ 6 - 12
tests/sentry/monitors/clock_tasks/test_check_missed.py

@@ -245,16 +245,14 @@ class MonitorClockTasksCheckMissingTest(TestCase):
             id=monitor_environment.id, status=MonitorStatus.ERROR
         )
 
-        missed_checkin = MonitorCheckIn.objects.filter(
+        missed_checkin = MonitorCheckIn.objects.get(
             monitor_environment=monitor_environment.id,
             status=CheckInStatus.MISSED,
         )
 
-        assert missed_checkin.exists()
-        missed_checkin = missed_checkin[0]
-
         # Missed checkins are back-dated to when the checkin was expected to
         # happen. In this case the expected_time is equal to the date_added.
+        assert monitor_environment.last_checkin is not None
         checkin_date = monitor_environment.last_checkin + timedelta(minutes=10)
         checkin_date = checkin_date.replace(second=0, microsecond=0)
 
@@ -429,14 +427,10 @@ class MonitorClockTasksCheckMissingTest(TestCase):
 
         # Missed check-in is created at the time it should have happened, NOT
         # at the most recent expected check in time, that slot was missed.
-        missed_checkin = (
-            MonitorCheckIn.objects.filter(
-                monitor_environment=monitor_environment.id,
-                status=CheckInStatus.MISSED,
-            )
-            .order_by("-date_added")
-            .first()
-        )
+        missed_checkin = MonitorCheckIn.objects.filter(
+            monitor_environment=monitor_environment.id,
+            status=CheckInStatus.MISSED,
+        ).order_by("-date_added")[0]
         assert missed_checkin.date_added == ts + timedelta(minutes=1)
 
     @mock.patch("sentry.monitors.clock_tasks.check_missed.produce_task")

Some files were not shown because too many files changed in this diff