PLINT-1175 Allow specifying error message

This commit is contained in:
Albert Suralinski
2021-10-14 09:25:20 +00:00
parent 948bfcd971
commit 761598de54
5 changed files with 180 additions and 51 deletions

View File

@@ -2,70 +2,87 @@ from galaxy.api.jsonrpc import ApplicationError, UnknownError
assert UnknownError
class AuthenticationRequired(ApplicationError):
def __init__(self, data=None):
super().__init__(1, "Authentication required", data)
def __init__(self, message="Authentication required", data=None):
super().__init__(1, message, data)
class BackendNotAvailable(ApplicationError):
def __init__(self, data=None):
super().__init__(2, "Backend not available", data)
def __init__(self, message="Backend not available", data=None):
super().__init__(2, message, data)
class BackendTimeout(ApplicationError):
def __init__(self, data=None):
super().__init__(3, "Backend timed out", data)
def __init__(self, message="Backend timed out", data=None):
super().__init__(3, message, data)
class BackendError(ApplicationError):
def __init__(self, data=None):
super().__init__(4, "Backend error", data)
def __init__(self, message="Backend error", data=None):
super().__init__(4, message, data)
class UnknownBackendResponse(ApplicationError):
def __init__(self, data=None):
super().__init__(4, "Backend responded in unknown way", data)
def __init__(self, message="Backend responded in unknown way", data=None):
super().__init__(4, message, data)
class TooManyRequests(ApplicationError):
def __init__(self, data=None):
super().__init__(5, "Too many requests. Try again later", data)
def __init__(self, message="Too many requests. Try again later", data=None):
super().__init__(5, message, data)
class InvalidCredentials(ApplicationError):
def __init__(self, data=None):
super().__init__(100, "Invalid credentials", data)
def __init__(self, message="Invalid credentials", data=None):
super().__init__(100, message, data)
class NetworkError(ApplicationError):
def __init__(self, data=None):
super().__init__(101, "Network error", data)
def __init__(self, message="Network error", data=None):
super().__init__(101, message, data)
class ProtocolError(ApplicationError):
def __init__(self, data=None):
super().__init__(103, "Protocol error", data)
def __init__(self, message="Protocol error", data=None):
super().__init__(103, message, data)
class TemporaryBlocked(ApplicationError):
def __init__(self, data=None):
super().__init__(104, "Temporary blocked", data)
def __init__(self, message="Temporary blocked", data=None):
super().__init__(104, message, data)
class Banned(ApplicationError):
def __init__(self, data=None):
super().__init__(105, "Banned", data)
def __init__(self, message="Banned", data=None):
super().__init__(105, message, data)
class AccessDenied(ApplicationError):
def __init__(self, data=None):
super().__init__(106, "Access denied", data)
def __init__(self, message="Access denied", data=None):
super().__init__(106, message, data)
class FailedParsingManifest(ApplicationError):
def __init__(self, data=None):
super().__init__(200, "Failed parsing manifest", data)
def __init__(self, message="Failed parsing manifest", data=None):
super().__init__(200, message, data)
class TooManyMessagesSent(ApplicationError):
def __init__(self, data=None):
super().__init__(300, "Too many messages sent", data)
def __init__(self, message="Too many messages sent", data=None):
super().__init__(300, message, data)
class IncoherentLastMessage(ApplicationError):
def __init__(self, data=None):
super().__init__(400, "Different last message id on backend", data)
def __init__(self, message="Different last message id on backend", data=None):
super().__init__(400, message, data)
class MessageNotFound(ApplicationError):
def __init__(self, data=None):
super().__init__(500, "Message not found", data)
def __init__(self, message="Message not found", data=None):
super().__init__(500, message, data)
class ImportInProgress(ApplicationError):
def __init__(self, data=None):
super().__init__(600, "Import already in progress", data)
def __init__(self, message="Import already in progress", data=None):
super().__init__(600, message, data)

View File

@@ -15,7 +15,7 @@ logger = logging.getLogger(__name__)
class JsonRpcError(Exception):
def __init__(self, code, message, data=None):
self.code = code
self.message = message
self.message = str(message)
self.data = data
super().__init__()
@@ -33,29 +33,36 @@ class JsonRpcError(Exception):
return obj
class ParseError(JsonRpcError):
def __init__(self):
super().__init__(-32700, "Parse error")
def __init__(self, message="Parse error"):
super().__init__(-32700, message)
class InvalidRequest(JsonRpcError):
def __init__(self):
super().__init__(-32600, "Invalid Request")
def __init__(self, message="Invalid Request"):
super().__init__(-32600, message)
class MethodNotFound(JsonRpcError):
def __init__(self):
super().__init__(-32601, "Method not found")
def __init__(self, message="Method not found"):
super().__init__(-32601, message)
class InvalidParams(JsonRpcError):
def __init__(self):
super().__init__(-32602, "Invalid params")
def __init__(self, message="Invalid params"):
super().__init__(-32602, message)
class Timeout(JsonRpcError):
def __init__(self):
super().__init__(-32000, "Method timed out")
def __init__(self, message="Method timed out"):
super().__init__(-32000, message)
class Aborted(JsonRpcError):
def __init__(self):
super().__init__(-32001, "Method aborted")
def __init__(self, message="Method aborted"):
super().__init__(-32001, message)
class ApplicationError(JsonRpcError):
def __init__(self, code, message, data):
@@ -63,9 +70,11 @@ class ApplicationError(JsonRpcError):
raise ValueError("The error code in reserved range")
super().__init__(code, message, data)
class UnknownError(ApplicationError):
def __init__(self, data=None):
super().__init__(0, "Unknown error", data)
def __init__(self, message="Unknown error", data=None):
super().__init__(0, message, data)
Request = namedtuple("Request", ["method", "params", "id"], defaults=[{}, None])
Response = namedtuple("Response", ["id", "result", "error"], defaults=[None, {}, {}])

103
tests/test_errors.py Normal file
View File

@@ -0,0 +1,103 @@
import pytest
import galaxy.api.errors as errors
import galaxy.api.jsonrpc as jsonrpc
@pytest.mark.parametrize("error, expected_error_msg", [
(errors.AuthenticationRequired, "Authentication required"),
(errors.BackendNotAvailable, "Backend not available"),
(errors.BackendTimeout, "Backend timed out"),
(errors.BackendError, "Backend error"),
(errors.UnknownBackendResponse, "Backend responded in unknown way"),
(errors.TooManyRequests, "Too many requests. Try again later"),
(errors.InvalidCredentials, "Invalid credentials"),
(errors.NetworkError, "Network error"),
(errors.ProtocolError, "Protocol error"),
(errors.TemporaryBlocked, "Temporary blocked"),
(errors.Banned, "Banned"),
(errors.AccessDenied, "Access denied"),
(errors.FailedParsingManifest, "Failed parsing manifest"),
(errors.TooManyMessagesSent, "Too many messages sent"),
(errors.IncoherentLastMessage, "Different last message id on backend"),
(errors.MessageNotFound, "Message not found"),
(errors.ImportInProgress, "Import already in progress"),
(jsonrpc.UnknownError, "Unknown error"),
(jsonrpc.ParseError, "Parse error"),
(jsonrpc.InvalidRequest, "Invalid Request"),
(jsonrpc.MethodNotFound, "Method not found"),
(jsonrpc.InvalidParams, "Invalid params"),
(jsonrpc.Timeout, "Method timed out"),
(jsonrpc.Aborted, "Method aborted"),
])
def test_error_default_message(error, expected_error_msg):
error_json = error().json()
assert error_json["message"] == expected_error_msg
@pytest.mark.parametrize("error", [
errors.AuthenticationRequired,
errors.BackendNotAvailable,
errors.BackendTimeout,
errors.BackendError,
errors.UnknownBackendResponse,
errors.TooManyRequests,
errors.InvalidCredentials,
errors.NetworkError,
errors.ProtocolError,
errors.TemporaryBlocked,
errors.Banned,
errors.AccessDenied,
errors.FailedParsingManifest,
errors.TooManyMessagesSent,
errors.IncoherentLastMessage,
errors.MessageNotFound,
errors.ImportInProgress,
jsonrpc.UnknownError,
jsonrpc.ParseError,
jsonrpc.InvalidRequest,
jsonrpc.MethodNotFound,
jsonrpc.InvalidParams,
jsonrpc.Timeout,
jsonrpc.Aborted,
])
def test_set_error_custom_message(error):
custom_message = "test message"
error_json = error(custom_message).json()
assert error_json["message"] == custom_message
@pytest.mark.parametrize("error", [
errors.AuthenticationRequired,
errors.BackendNotAvailable,
errors.BackendTimeout,
errors.BackendError,
errors.UnknownBackendResponse,
errors.TooManyRequests,
errors.InvalidCredentials,
errors.NetworkError,
errors.ProtocolError,
errors.TemporaryBlocked,
errors.Banned,
errors.AccessDenied,
errors.FailedParsingManifest,
errors.TooManyMessagesSent,
errors.IncoherentLastMessage,
errors.MessageNotFound,
errors.ImportInProgress,
jsonrpc.UnknownError,
jsonrpc.ParseError,
jsonrpc.InvalidRequest,
jsonrpc.MethodNotFound,
jsonrpc.InvalidParams,
jsonrpc.Timeout,
jsonrpc.Aborted,
])
def test_set_arbitrary_error_message(error):
arbitrary_messages = [[], {}, (), 1, None]
for msg in arbitrary_messages:
error_json = error(msg).json()
assert error_json["message"] == str(msg)

View File

@@ -122,7 +122,7 @@ async def test_prepare_get_local_size_context_error(plugin, read, write):
request_id = "31415"
error_details = "Unexpected syntax"
error_message, error_code = FailedParsingManifest().message, FailedParsingManifest().code
plugin.prepare_local_size_context.side_effect = FailedParsingManifest(error_details)
plugin.prepare_local_size_context.side_effect = FailedParsingManifest(data=error_details)
request = {
"jsonrpc": "2.0",
"id": request_id,

View File

@@ -271,7 +271,7 @@ async def test_prepare_get_subscription_games_context_error(plugin, read, write)
request_id = "31415"
error_details = "Unexpected backend error"
error_message, error_code = BackendError().message, BackendError().code
plugin.prepare_subscription_games_context.side_effect = BackendError(error_details)
plugin.prepare_subscription_games_context.side_effect = BackendError(data=error_details)
request = {
"jsonrpc": "2.0",
"id": request_id,