Files
2024-02-15 17:01:50 +00:00

120 lines
4.1 KiB
Python

import time
import responses
from sentry.integrations.msteams.unlink_identity import build_unlinking_url
from sentry.models.identity import Identity, IdentityStatus
from sentry.testutils.cases import TestCase
from sentry.testutils.silo import control_silo_test
from sentry.utils.signing import unsign
@control_silo_test
class MsTeamsIntegrationUnlinkIdentityTest(TestCase):
def setUp(self):
super(TestCase, self).setUp()
self.user1 = self.create_user(is_superuser=False)
self.user2 = self.create_user(is_superuser=False)
self.org = self.create_organization(owner=None)
self.team = self.create_team(organization=self.org, members=[self.user1, self.user2])
self.login_as(self.user1)
self.integration = self.create_provider_integration(
provider="msteams",
name="Hogwarts",
external_id="1_50l3mnly_5w34r",
metadata={
"service_url": "https://smba.trafficmanager.net/amer",
"access_token": "3ld3rw4nd",
"expires_at": int(time.time()) + 86400,
},
)
self.create_organization_integration(
organization_id=self.org.id, integration=self.integration
)
self.idp = self.create_identity_provider(type="msteams", external_id="1_50l3mnly_5w34r")
self.conversation_id = "my_conversation_id"
access_json = {"expires_in": 86399, "access_token": "3ld3rw4nd"}
responses.add(
responses.POST,
"https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token",
json=access_json,
)
responses.add(
method=responses.POST,
url=f"https://smba.trafficmanager.net/amer/v3/conversations/{self.conversation_id}/activities",
status=200,
json={},
)
@responses.activate
def test_basic_flow(self):
teams_user_id = "my-teams-user-id"
Identity.objects.create(
user=self.user1, idp=self.idp, external_id=teams_user_id, status=IdentityStatus.VALID
)
unlink_url = build_unlinking_url(
self.conversation_id, "https://smba.trafficmanager.net/amer", teams_user_id
)
signed_params = unlink_url.split("/")[-2]
params = unsign(signed_params)
assert params == {
"conversation_id": self.conversation_id,
"service_url": "https://smba.trafficmanager.net/amer",
"teams_user_id": teams_user_id,
}
resp = self.client.get(unlink_url)
assert resp.status_code == 200
self.assertTemplateUsed(resp, "sentry/integrations/msteams/unlink-identity.html")
# Unlink identity of user
resp = self.client.post(unlink_url)
assert resp.status_code == 200
self.assertTemplateUsed(resp, "sentry/integrations/msteams/unlinked.html")
identity = Identity.objects.filter(external_id=teams_user_id, user=self.user1)
assert len(identity) == 0
assert (
"Your Microsoft Teams identity has been unlinked to your Sentry account."
in responses.calls[1].request.body.decode("utf-8")
)
assert len(responses.calls) == 2
@responses.activate
def test_no_identity(self):
teams_user_id = "my-teams-user-id"
# identity for a different user
Identity.objects.create(
user=self.user2, idp=self.idp, external_id=teams_user_id, status=IdentityStatus.VALID
)
unlink_url = build_unlinking_url(
self.conversation_id, "https://smba.trafficmanager.net/amer", teams_user_id
)
resp = self.client.get(unlink_url)
assert resp.status_code == 200
self.assertTemplateUsed(resp, "sentry/integrations/msteams/unlink-identity.html")
# Unlink identity of user
resp = self.client.post(unlink_url)
assert resp.status_code == 200
self.assertTemplateUsed(resp, "sentry/integrations/msteams/no-identity.html")
identity = Identity.objects.filter(external_id=teams_user_id, user=self.user2)
assert len(identity) == 1
assert len(responses.calls) == 0