class LinkSharedEventTest(BaseEventTest): @responses.activate @patch( "sentry.integrations.slack.endpoints.event.match_link", # match_link will be called twice, for each our links. Resolve into # two unique links and one duplicate. side_effect=[ ("mock_link", {"arg1": "value1"}), ("mock_link", {"arg1", "value2"}), ("mock_link", {"arg1": "value1"}), ], ) @patch( "sentry.integrations.slack.endpoints.event.link_handlers", { "mock_link": Handler( matcher=re.compile(r"test"), arg_mapper=make_type_coercer({}), fn=Mock(return_value={"link1": "unfurl", "link2": "unfurl"}), ) }, ) def share_links(self, mock_match_link): responses.add(responses.POST, "https://slack.com/api/chat.unfurl", json={"ok": True}) resp = self.post_webhook(event_data=json.loads(LINK_SHARED_EVENT)) assert resp.status_code == 200, resp.content assert len(mock_match_link.mock_calls) == 3 data = dict(parse_qsl(responses.calls[0].request.body)) unfurls = json.loads(data["unfurls"]) # We only have two unfurls since one link was duplicated assert len(unfurls) == 2 assert unfurls["link1"] == "unfurl" assert unfurls["link2"] == "unfurl" return data def test_valid_token(self): data = self.share_links() assert data["token"] == "xoxb-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx" def test_user_access_token(self): # this test is needed to make sure that classic bots installed by on-prem users # still work since they needed to use a user_access_token for unfurl self.integration.metadata.update( { "user_access_token": "xoxt-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx", "access_token": "xoxm-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx", } ) self.integration.save() data = self.share_links() assert data["token"] == "xoxt-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx"
class DiscoverLinkSharedEvent(BaseEventTest): @responses.activate @patch( "sentry.integrations.slack.endpoints.event.match_link", # match_link will be called twice, for each our links. Resolve into # two unique links and one duplicate. side_effect=[ (LinkType.DISCOVER, { "arg1": "value1" }), (LinkType.DISCOVER, {"arg1", "value2"}), (LinkType.DISCOVER, { "arg1": "value1" }), ], ) @patch("sentry.integrations.slack.requests.event.has_discover_links", return_value=True) @patch( "sentry.integrations.slack.endpoints.event.link_handlers", { LinkType.DISCOVER: Handler( matcher=re.compile(r"test"), arg_mapper=make_type_coercer({}), fn=Mock(return_value={ "link1": "unfurl", "link2": "unfurl" }), ) }, ) def share_discover_links(self, mock_match_link, mock_): responses.add(responses.POST, "https://slack.com/api/chat.postEphemeral", json={"ok": True}) responses.add(responses.POST, "https://slack.com/api/chat.unfurl", json={"ok": True}) resp = self.post_webhook(event_data=json.loads(LINK_SHARED_EVENT)) assert resp.status_code == 200, resp.content data = responses.calls[0].request.body return dict(parse_qsl(data)) def test_share_discover_links_unlinked_user(self): IdentityProvider.objects.create(type="slack", external_id="TXXXXXXX1", config={}) with self.feature("organizations:discover-basic"): data = self.share_discover_links() blocks = json.loads(data["blocks"]) assert blocks[0]["type"] == "section" assert ( blocks[0]["text"]["text"] == "Link your Slack identity to Sentry to unfurl Discover charts.") assert blocks[1]["type"] == "actions" assert len(blocks[1]["elements"]) == 2 assert [button["text"]["text"] for button in blocks[1]["elements"]] == ["Link", "Cancel"] def test_share_discover_links_linked_user(self): idp = IdentityProvider.objects.create(type="slack", external_id="TXXXXXXX1", config={}) Identity.objects.create( external_id="Uxxxxxxx", idp=idp, user=self.user, status=IdentityStatus.VALID, scopes=[], ) data = self.share_discover_links() unfurls = json.loads(data["unfurls"]) # We only have two unfurls since one link was duplicated assert len(unfurls) == 2 assert unfurls["link1"] == "unfurl" assert unfurls["link2"] == "unfurl"