From f1d912fbcf12468206430d9e09b10233a1f21fdd Mon Sep 17 00:00:00 2001 From: Michal Konečný Date: Mar 10 2022 11:00:16 +0000 Subject: Add get_bug function to bugzilla systems Signed-off-by: Michal Konečný --- diff --git a/tests/utils/test_bugzilla_system.py b/tests/utils/test_bugzilla_system.py index 26a62db..66918a0 100644 --- a/tests/utils/test_bugzilla_system.py +++ b/tests/utils/test_bugzilla_system.py @@ -969,6 +969,78 @@ class TestEditComponent: mock_bz_call.assert_called_with(server.editcomponent, {"data": data}) +class TestGetBug: + """Test class for `toddlers.utils.bugzilla_system.get_bug` function.""" + + @patch("toddlers.utils.bugzilla_system.get_bz") + def test_get_bug(self, mock_bz): + """Assert that bug is retrieved without issue.""" + bug_id = "100" + server = Mock() + server.getbug.return_value = {"bugs": [{"id": bug_id}]} + + mock_bz.return_value = server + + bug = toddlers.utils.bugzilla_system.get_bug(bug_id) + + mock_bz.assert_called_with() + server.getbug.assert_called_with(id=bug_id) + assert bug == {"id": bug_id} + + @patch("toddlers.utils.bugzilla_system.get_bz") + def test_get_bug_none_found(self, mock_bz): + """Assert that no bug found returns None.""" + bug_id = "100" + server = Mock() + server.getbug.return_value = {"bugs": []} + + mock_bz.return_value = server + + bug = toddlers.utils.bugzilla_system.get_bug(bug_id) + + mock_bz.assert_called_with() + server.getbug.assert_called_with(id=bug_id) + assert bug is None + + @patch("toddlers.utils.bugzilla_system.execute_bugzilla_call") + @patch("toddlers.utils.bugzilla_system.get_bz") + def test_get_bug_xmlrpc_fault(self, mock_bz, mock_bz_call): + """Assert that XMLRPC fault is handled.""" + bug_id = "100" + server = Mock() + mock_bz_call.side_effect = xmlrpc.client.Fault(50, "Fault") + + mock_bz.return_value = server + + with pytest.raises(xmlrpc.client.Fault) as exc: + toddlers.utils.bugzilla_system.get_bug(bug_id) + + assert exc.value.args == (bug_id, 50, "Fault") + + mock_bz.assert_called_with() + mock_bz_call.assert_called_with(server.getbug, {"id": bug_id}) + + @patch("toddlers.utils.bugzilla_system.execute_bugzilla_call") + @patch("toddlers.utils.bugzilla_system.get_bz") + def test_get_bug_protocol_error(self, mock_bz, mock_bz_call): + """Assert that protocol error is handled.""" + bug_id = "100" + server = Mock() + mock_bz_call.side_effect = xmlrpc.client.ProtocolError( + "Error", 10, "Error message", {} + ) + + mock_bz.return_value = server + + with pytest.raises(xmlrpc.client.ProtocolError) as exc: + toddlers.utils.bugzilla_system.get_bug(bug_id) + + assert exc.value.args == ("ProtocolError", 10, "Error message") + + mock_bz.assert_called_with() + mock_bz_call.assert_called_with(server.getbug, {"id": bug_id}) + + class TestExecuteBugzillaCall: """Test class for `toddlers.utils.bugzilla_system.execute_bugzilla_call` function.""" diff --git a/toddlers/utils/bugzilla_system.py b/toddlers/utils/bugzilla_system.py index 570974f..2c90b88 100644 --- a/toddlers/utils/bugzilla_system.py +++ b/toddlers/utils/bugzilla_system.py @@ -562,6 +562,35 @@ def edit_component( _log.info("[NOCHANGE] %s/%s", product, package) +def get_bug(bug_id: str) -> Optional[dict]: + """ + Retrieve bug from bugzilla. + + Params: + bug_id: Id of the bug to retrieve + + Returns: + Bug dictionary if bug is retrieved, otherwise None. + """ + bz = get_bz() + + try: + bug = execute_bugzilla_call(bz.getbug, {"id": bug_id}) + except xmlrpc.client.Fault as e: + # Output something useful in args + e.args = (bug_id, e.faultCode, e.faultString) + raise + except xmlrpc.client.ProtocolError as e: + e.args = ("ProtocolError", e.errcode, e.errmsg) + raise + + # No bug retrieved + if len(bug["bugs"]) != 1: + return None + + return bug["bugs"][0] + + R = TypeVar("R")