Skip to content

Commit c69c3c9

Browse files
iamrajjoshiandrewshie-sentry
authored andcommitted
🔧 chore: fix msteams client typing (#89449)
1 parent 3a9448f commit c69c3c9

File tree

12 files changed

+47
-30
lines changed

12 files changed

+47
-30
lines changed

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ module = [
131131
"sentry.integrations.github.integration",
132132
"sentry.integrations.gitlab.issues",
133133
"sentry.integrations.jira.integration",
134-
"sentry.integrations.msteams.client",
135134
"sentry.integrations.msteams.notifications",
136135
"sentry.integrations.pagerduty.actions.form",
137136
"sentry.integrations.pipeline",

src/sentry/integrations/msteams/client.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import time
4+
from abc import ABC
45
from urllib.parse import urlencode
56

67
from requests import PreparedRequest
@@ -11,14 +12,15 @@
1112
from sentry.integrations.services.integration import integration_service
1213
from sentry.integrations.services.integration.model import RpcIntegration
1314
from sentry.shared_integrations.client.proxy import IntegrationProxyClient, infer_org_integration
15+
from sentry.shared_integrations.exceptions import IntegrationError
1416
from sentry.silo.base import SiloMode, control_silo_function
1517

1618
# five minutes which is industry standard clock skew tolerance
1719
CLOCK_SKEW = 60 * 5
1820

1921

20-
# MsTeamsClientMixin abstract client does not handle setting the base url or auth token
21-
class MsTeamsClientMixin:
22+
# MsTeamsClientABC abstract client does not handle setting the base url or auth token
23+
class MsTeamsClientABC(ApiClient, ABC):
2224
integration_name = "msteams"
2325
TEAM_URL = "/v3/teams/%s"
2426
CHANNEL_URL = "/v3/teams/%s/conversations"
@@ -33,7 +35,7 @@ def get_channel_list(self, team_id: str):
3335

3436
def get_member_list(self, team_id: str, continuation_token: str | None = None):
3537
url = self.MEMBER_URL % team_id
36-
params = {"pageSize": 500}
38+
params: dict[str, int | str] = {"pageSize": 500}
3739
if continuation_token:
3840
params["continuationToken"] = continuation_token
3941
return self.get(url, params=params)
@@ -70,7 +72,7 @@ def update_card(self, conversation_id: str, activity_id: str, card):
7072

7173
# MsTeamsPreInstallClient is used with the access token and service url as arguments to the constructor
7274
# It will not handle token refreshing
73-
class MsTeamsPreInstallClient(ApiClient, MsTeamsClientMixin):
75+
class MsTeamsPreInstallClient(MsTeamsClientABC):
7476
integration_name = "msteams"
7577

7678
def __init__(self, access_token: str, service_url: str):
@@ -84,7 +86,7 @@ def request(self, method, path, data=None, params=None):
8486

8587

8688
# MsTeamsClient is used with an existing integration object and handles token refreshing
87-
class MsTeamsClient(IntegrationProxyClient, MsTeamsClientMixin):
89+
class MsTeamsClient(MsTeamsClientABC, IntegrationProxyClient):
8890
integration_name = "msteams"
8991

9092
def __init__(self, integration: Integration | RpcIntegration):
@@ -117,10 +119,16 @@ def access_token(self):
117119
access_token = token_data["access_token"]
118120
new_metadata.update(token_data)
119121

120-
self.integration = integration_service.update_integration(
121-
integration_id=self.integration.id,
122-
metadata=new_metadata,
123-
)
122+
if (
123+
updated_integration := integration_service.update_integration(
124+
integration_id=self.integration.id,
125+
metadata=new_metadata,
126+
)
127+
) is None:
128+
# This should never happen, but if it does, fail loudly
129+
raise IntegrationError("Integration not found, failed to refresh access token")
130+
131+
self.integration = updated_integration
124132
return access_token
125133

126134
@control_silo_function

tests/sentry/integrations/msteams/notifications/test_assigned.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111

1212
@patch(
13-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
13+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1414
Mock(return_value="some_conversation_id"),
1515
)
16-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
16+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1717
class MSTeamsAssignedNotificationTest(MSTeamsActivityNotificationTest):
1818
def test_assigned(self, mock_send_card: MagicMock):
1919
"""

tests/sentry/integrations/msteams/notifications/test_deploy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111

1212

1313
@patch(
14-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
14+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1515
Mock(return_value="some_conversation_id"),
1616
)
17-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
17+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1818
class MSTeamsDeployNotificationTest(MSTeamsActivityNotificationTest):
1919
@skip("Flaky test")
2020
def test_deploy(self, mock_send_card: MagicMock):

tests/sentry/integrations/msteams/notifications/test_escalating.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111

1212
@patch(
13-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
13+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1414
Mock(return_value="some_conversation_id"),
1515
)
16-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
16+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1717
class MSTeamsEscalatingNotificationTest(MSTeamsActivityNotificationTest):
1818
def test_note(self, mock_send_card: MagicMock):
1919
"""

tests/sentry/integrations/msteams/notifications/test_issue_alert.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414

1515
@patch(
16-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
16+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1717
Mock(return_value="some_conversation_id"),
1818
)
19-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
19+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
2020
class MSTeamsIssueAlertNotificationTest(MSTeamsActivityNotificationTest):
2121
def test_issue_alert_user(self, mock_send_card: MagicMock):
2222
"""Test that issue alerts are sent to a MS Teams user."""

tests/sentry/integrations/msteams/notifications/test_note.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111

1212
@patch(
13-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
13+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1414
Mock(return_value="some_conversation_id"),
1515
)
16-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
16+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1717
class MSTeamsNoteNotificationTest(MSTeamsActivityNotificationTest):
1818
def test_note(self, mock_send_card: MagicMock):
1919
"""

tests/sentry/integrations/msteams/notifications/test_regression.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111

1212
@patch(
13-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
13+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1414
Mock(return_value="some_conversation_id"),
1515
)
16-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
16+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1717
class MSTeamsRegressionNotificationTest(MSTeamsActivityNotificationTest):
1818
def test_regression(self, mock_send_card: MagicMock):
1919
"""

tests/sentry/integrations/msteams/notifications/test_resolved.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414

1515
@patch(
16-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
16+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1717
Mock(return_value="some_conversation_id"),
1818
)
19-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
19+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
2020
class MSTeamsResolvedNotificationTest(MSTeamsActivityNotificationTest):
2121
def test_resolved(self, mock_send_card: MagicMock):
2222
"""

tests/sentry/integrations/msteams/notifications/test_unassigned.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010

1111

1212
@patch(
13-
"sentry.integrations.msteams.MsTeamsClientMixin.get_user_conversation_id",
13+
"sentry.integrations.msteams.MsTeamsClientABC.get_user_conversation_id",
1414
Mock(return_value="some_conversation_id"),
1515
)
16-
@patch("sentry.integrations.msteams.MsTeamsClientMixin.send_card")
16+
@patch("sentry.integrations.msteams.MsTeamsClientABC.send_card")
1717
class MSTeamsUnassignedNotificationTest(MSTeamsActivityNotificationTest):
1818
def test_unassigned(self, mock_send_card: MagicMock):
1919
"""

0 commit comments

Comments
 (0)