diff --git a/swh/deposit/cli/client.py b/swh/deposit/cli/client.py --- a/swh/deposit/cli/client.py +++ b/swh/deposit/cli/client.py @@ -142,7 +142,8 @@ # retrieve user's collection sd_content = client.service_document() if "error" in sd_content: - raise InputError("Service document retrieval: %s" % (sd_content["error"],)) + msg = sd_content["error"] + raise InputError(f"Service document retrieval: {msg}") collection = sd_content["app:service"]["app:workspace"]["app:collection"][ "sword:name" ] diff --git a/swh/deposit/client.py b/swh/deposit/client.py --- a/swh/deposit/client.py +++ b/swh/deposit/client.py @@ -286,7 +286,7 @@ """ return {} - def parse_result_error(self, xml_content): + def parse_result_error(self, xml_content: bytes) -> Dict: """Given an error response in xml, parse it into a dict. Returns: @@ -385,6 +385,10 @@ """ return parse_xml(xml_content) + def parse_result_error(self, xml_content: bytes) -> Dict: + result = super().parse_result_error(xml_content) + return {"error": result["summary"]} + class StatusDepositClient(BaseDepositClient): """Status information on a deposit. diff --git a/swh/deposit/tests/cli/test_client.py b/swh/deposit/tests/cli/test_client.py --- a/swh/deposit/tests/cli/test_client.py +++ b/swh/deposit/tests/cli/test_client.py @@ -21,6 +21,7 @@ BaseDepositClient, MaintenanceError, PublicApiDepositClient, + ServiceDocumentDepositClient, ) from swh.deposit.parsers import parse_xml from swh.model.exceptions import ValidationError @@ -941,3 +942,17 @@ "detail": "", "sword:verboseDescription": verbose_description, } + + +def test_cli_service_document_failure(atom_dataset, mocker): + """Ensure service document failures are properly served + + """ + summary = "Invalid user credentials" + error_xml = atom_dataset["error-cli"].format(summary=summary, verboseDescription="") + + api_call = ServiceDocumentDepositClient(url="https://somewhere.org/") + + actual_error = api_call.parse_result_error(error_xml) + + assert actual_error == {"error": summary}