From 020cc5d3ec53ebc47f20dd97cb79fd12850402a5 Mon Sep 17 00:00:00 2001 From: jannikmeinecke Date: Fri, 3 Jun 2022 18:43:17 +0200 Subject: [PATCH 1/2] Add client route for deleting remote links by global (and internal) id ___ Jannik Meinecke on behalf of MBition GmbH. https://github.com/mercedes-benz/foss/blob/master/PROVIDER_INFORMATION.md --- jira/client.py | 31 +++++++++++++++++++++++++++++++ tests/tests.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/jira/client.py b/jira/client.py index f6365257c..b8b0ced9f 100644 --- a/jira/client.py +++ b/jira/client.py @@ -16,6 +16,7 @@ import re import sys import time +import urllib import warnings from collections import OrderedDict from collections.abc import Iterable @@ -3232,6 +3233,36 @@ def delete_user_avatar(self, username: str, avatar: str): url = self._get_url("user/avatar/" + avatar) return self._session.delete(url, params=params) + @translate_resource_args + def delete_remote_link( + self, + issue: Union[str, Issue], + *, + internal_id: Optional[str] = None, + global_id: Optional[str] = None, + ) -> Response: + """Delete remote link from issue by internalId or globalId. + + Args: + issue (str): Key (or Issue) of Issue + internal_id (Optional[str]): InternalID of the remote link to delete + global_id (Optional[str]): GlobalID of the remote link to delete + + Returns: + Response + """ + if not ((internal_id is None) ^ (global_id is None)): + raise ValueError("Must supply either 'internal_id' XOR 'global_id'.") + + if internal_id is not None: + url = self._get_url(f"issue/{issue}/remotelink/{internal_id}") + elif global_id is not None: + # stop "&" and other special characters in global_id from messing around with the query + global_id = urllib.parse.quote(global_id, safe="") + url = self._get_url(f"issue/{issue}/remotelink?globalId={global_id}") + + return self._session.delete(url) + def search_users( self, user: Optional[str] = None, diff --git a/tests/tests.py b/tests/tests.py index 20ef9a5bf..93927ea8d 100755 --- a/tests/tests.py +++ b/tests/tests.py @@ -350,6 +350,40 @@ def _create_issue_search_results_json(issues, **kwargs): } +DEFAULT_NEW_REMOTE_LINK_OBJECT = {"url": "http://google.com", "title": "googlicious!"} + + +class ClientRemoteLinkTests(JiraTestCase): + def setUp(self): + JiraTestCase.setUp(self) + self.issue_1 = self.test_manager.project_b_issue1 + self.project_b_issue1_obj = self.test_manager.project_b_issue1_obj + + def test_delete_remote_link_by_internal_id(self): + link = self.jira.add_remote_link( + self.issue_1, + destination=DEFAULT_NEW_REMOTE_LINK_OBJECT, + ) + _id = link.id + self.jira.delete_remote_link(self.issue_1, internal_id=_id) + self.assertRaises(JIRAError, self.jira.remote_link, self.issue_1, _id) + + def test_delete_remote_link_by_global_id(self): + link = self.jira.add_remote_link( + self.issue_1, + destination=DEFAULT_NEW_REMOTE_LINK_OBJECT, + globalId="python-test:story.of.sasquatch.riding", + ) + _id = link.id + self.jira.delete_remote_link( + self.issue_1, global_id="python-test:story.of.sasquatch.riding" + ) + self.assertRaises(JIRAError, self.jira.remote_link, self.issue_1, _id) + + def test_delete_remote_link_with_invalid_args(self): + self.assertRaises(ValueError, self.jira.delete_remote_link, self.issue_1) + + class WebsudoTests(JiraTestCase): def test_kill_websudo(self): self.jira.kill_websudo() From c48510d7301b8b9daa6da96e13ba0c025d983711 Mon Sep 17 00:00:00 2001 From: jannikmeinecke Date: Tue, 7 Jun 2022 12:21:09 +0200 Subject: [PATCH 2/2] Clarify naming, remove unused variable in ClientRemoteLinkTests ___ Jannik Meinecke on behalf of MBition GmbH. https://github.com/mercedes-benz/foss/blob/master/PROVIDER_INFORMATION.md --- tests/tests.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 93927ea8d..df67e9151 100755 --- a/tests/tests.py +++ b/tests/tests.py @@ -356,32 +356,31 @@ def _create_issue_search_results_json(issues, **kwargs): class ClientRemoteLinkTests(JiraTestCase): def setUp(self): JiraTestCase.setUp(self) - self.issue_1 = self.test_manager.project_b_issue1 - self.project_b_issue1_obj = self.test_manager.project_b_issue1_obj + self.issue_key = self.test_manager.project_b_issue1 def test_delete_remote_link_by_internal_id(self): link = self.jira.add_remote_link( - self.issue_1, + self.issue_key, destination=DEFAULT_NEW_REMOTE_LINK_OBJECT, ) _id = link.id - self.jira.delete_remote_link(self.issue_1, internal_id=_id) - self.assertRaises(JIRAError, self.jira.remote_link, self.issue_1, _id) + self.jira.delete_remote_link(self.issue_key, internal_id=_id) + self.assertRaises(JIRAError, self.jira.remote_link, self.issue_key, _id) def test_delete_remote_link_by_global_id(self): link = self.jira.add_remote_link( - self.issue_1, + self.issue_key, destination=DEFAULT_NEW_REMOTE_LINK_OBJECT, globalId="python-test:story.of.sasquatch.riding", ) _id = link.id self.jira.delete_remote_link( - self.issue_1, global_id="python-test:story.of.sasquatch.riding" + self.issue_key, global_id="python-test:story.of.sasquatch.riding" ) - self.assertRaises(JIRAError, self.jira.remote_link, self.issue_1, _id) + self.assertRaises(JIRAError, self.jira.remote_link, self.issue_key, _id) def test_delete_remote_link_with_invalid_args(self): - self.assertRaises(ValueError, self.jira.delete_remote_link, self.issue_1) + self.assertRaises(ValueError, self.jira.delete_remote_link, self.issue_key) class WebsudoTests(JiraTestCase):