specter-desktop/tests/test_se_controller.py
k9ert 9fc3ea87ad
Chore: generic better error_handling for API calls (#2014)
* Chore: generic better error_handling for API calls

* pricebar and toggle_privacy

* fetchAddressData

* Remove anoying log-msg

* fix cypress test (hopefully)

* remove unnecessary code

* return response in send_request if it is error msg

* tx-table adapted with send_request

* variable declarations of api responses

* account for booleans as response values

* typo in rpc error handler

* try catch block in send_request added & type checking fixes

* tests for errorhandling

* use Headers()

* check for null not undefined

* remove log flodding and always returning an object

* fix tests

* Improved exception handling

* specify better Types for Exception

Co-authored-by: Manolis Mandrapilias <70536101+moneymanolis@users.noreply.github.com>
Co-authored-by: moneymanolis <moneymanolis@protonmail.com>
2022-12-13 14:23:04 +01:00

135 lines
5.8 KiB
Python

from cryptoadvance.specter.rpc import RpcError
from cryptoadvance.specter.specter_error import (
BrokenCoreConnectionException,
ExtProcTimeoutException,
SpecterError,
)
from mock import patch
from werkzeug.exceptions import MethodNotAllowed, NotFound
from flask_wtf.csrf import CSRFError
def test_controller_error_handling_RpcError(app):
from cryptoadvance.specter.server_endpoints.controller import server_rpc_error
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_rpc_error(RpcError("Muh!")) == {"error": "Muh!"}
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_rpc_error(RpcError("Muh!"))
assert response.status_code == 302 # redirect
assert mock_flash.called
def test_controller_error_handling_SpecterError(app):
from cryptoadvance.specter.server_endpoints.controller import server_specter_error
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_specter_error(SpecterError("Muh!")) == {"error": "Muh!"}
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_specter_error(SpecterError("Muh!"))
assert response.status_code == 302 # redirect
assert mock_flash.called
def test_controller_error_handling_NotFound(app):
from cryptoadvance.specter.server_endpoints.controller import server_notFound_error
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_notFound_error(NotFound("Muh!"))["error"].startswith(
"Could not find Resource (404)"
)
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response, status_code = server_notFound_error(NotFound("Muh!"))
assert status_code == 404
assert not mock_flash.called
def test_controller_error_handling_Exception(app):
from cryptoadvance.specter.server_endpoints.controller import server_error
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_error(Exception("Muh!"))["error"].startswith("Uncaught exception")
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response, status_code = server_error(Exception("Muh!"))
assert status_code == 500
assert not mock_flash.called
def test_controller_error_handling_BrokenCoreConnectionException(app):
from cryptoadvance.specter.server_endpoints.controller import (
server_broken_core_connection,
)
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_broken_core_connection(BrokenCoreConnectionException("Muh!"))[
"error"
].startswith("You got disconnected from your node (no RPC connection)")
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_broken_core_connection(
BrokenCoreConnectionException("Muh!")
)
assert response.status_code == 302
assert mock_flash.called
def test_controller_error_handling_ExtProcTimeoutException(app):
from cryptoadvance.specter.server_endpoints.controller import server_error_timeout
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_error_timeout(ExtProcTimeoutException("Muh!"))[
"error"
].startswith("Bitcoin Core is not coming up in time. ")
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_error_timeout(ExtProcTimeoutException("Muh!"))
assert response.status_code == 302
assert mock_flash.called
def test_controller_error_handling_CSRFError(app):
from cryptoadvance.specter.server_endpoints.controller import server_error_csrf
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_error_csrf(CSRFError("Muh!"))["error"].startswith(
"Session expired (CSRF)."
)
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_error_csrf(CSRFError("Muh!"))
assert response.status_code == 302
assert mock_flash.called
def test_controller_error_handling_MethodNotAllowed(app):
from cryptoadvance.specter.server_endpoints.controller import server_error_405
with app.test_request_context(environ_base={"HTTP_ACCEPT": "application/json"}):
assert server_error_405(MethodNotAllowed("Muh!"))["error"].startswith(
"405 method not allowed. Token might have expired."
)
with app.test_request_context(environ_base={"HTTP_ACCEPT": "*/*"}):
with patch(
"cryptoadvance.specter.server_endpoints.controller.flash"
) as mock_flash:
response = server_error_405(MethodNotAllowed("Muh!"))
assert response.status_code == 302
assert mock_flash.called