Skip to content
This repository has been archived by the owner on Apr 3, 2023. It is now read-only.

Commit

Permalink
feat: add ErrorDetail
Browse files Browse the repository at this point in the history
  • Loading branch information
HamidMolareza committed Mar 31, 2023
1 parent 9808868 commit 7fb0722
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 2 deletions.
1 change: 1 addition & 0 deletions .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ disable=
C0114, # missing-module-docstring
C0301, # Line too long (line-too-long)
W0718, # Catching too general exception Exception (broad-exception-caught)
R0913, # Too many arguments (too-many-arguments)
40 changes: 40 additions & 0 deletions def_result/ResultDetails/ErrorDetail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import traceback
from typing import Any, Dict, Optional

from def_result.ResultDetail import ResultDetail


class ErrorDetail(ResultDetail):
""" Stores the error details of a result. """
errors: Optional[Dict[str, str]]
exception: Optional[Exception]
stack_trace: traceback.StackSummary

def __init__(self, title: Optional[str] = "An error occurred",
message: Optional[str] = None,
code: Optional[int] = 500,
errors: Optional[Dict[str, str]] = None,
exception: Optional[Exception] = None,
more_data: Optional[Any] = None):
super().__init__(title if title else "An error occurred", message, code, more_data)
self.errors = errors
self.exception = exception
self.stack_trace = traceback.extract_stack()

def add_or_update_error(self, key: str, value: str):
""" Add or update an error. """
if self.errors is None:
self.errors = {}
self.errors[key] = value

def __str__(self):
error_details = super().__str__()

if self.errors:
error_details += "Errors: " + str(self.errors) + "\n"

if self.exception:
error_details += "Exception: " + str(self.exception) + "\n"
error_details += "Stack trace: " + str(self.stack_trace) + "\n"

return error_details
Empty file.
42 changes: 42 additions & 0 deletions tests/ResultDetails/test_ErrorDetail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import unittest

from def_result.ResultDetails.ErrorDetail import ErrorDetail
from tests.helpers import assert_error_detail


class TestErrorDetail(unittest.TestCase):
def test_init_without_args(self):
error_detail = ErrorDetail()

assert_error_detail(test_class=self, error_detail=error_detail, title="An error occurred", code=500)

def test_init_with_args(self):
exception = Exception("Fake exception")
error_detail = ErrorDetail(title="title", message="message", code=100, errors={"message": "error"},
exception=exception, more_data=["more_data"])

assert_error_detail(test_class=self, error_detail=error_detail, title="title", message="message", code=100,
errors={"message": "error"}, exception=exception, more_data=["more_data"])

def test_add_or_update_error(self):
error_detail = ErrorDetail()
self.assertEqual(None, error_detail.errors)
# Add an error
error_detail.add_or_update_error("key", "error")
self.assertEqual({"key": "error"}, error_detail.errors)
# Update an error
error_detail.add_or_update_error("key", "error2")
self.assertEqual({"key": "error2"}, error_detail.errors)
print(str(error_detail))

def test_str(self):
error_detail = ErrorDetail(title="title", message="message", code=100, errors={"message": "error"},
exception=Exception("Fake exception"), more_data=["more_data"])

print(str(error_detail))
self.assertTrue(str(error_detail).startswith(
"Title: title\nMessage: message\nCode: 100\nErrors: {'message': 'error'}\nException: Fake exception"))


if __name__ == '__main__':
unittest.main()
2 changes: 0 additions & 2 deletions tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,3 @@ def assert_error_detail(test_class: unittest.TestCase, error_detail: ErrorDetail
test_class.assertEqual(exception, error_detail.exception)

test_class.assertTrue(error_detail.stack_trace)
if exception:
test_class.assertEqual(traceback.TracebackException.from_exception(exception), error_detail.stack_trace)

0 comments on commit 7fb0722

Please sign in to comment.