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

Commit

Permalink
feat: Add Result and ResultDetail classes
Browse files Browse the repository at this point in the history
  • Loading branch information
Hamid Molareza committed Mar 31, 2023
1 parent 5b9580f commit bab86c8
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 3 deletions.
26 changes: 26 additions & 0 deletions def_result/Result.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from typing import Optional, Any
from def_result.ResultDetail import ResultDetail


class Result:
success: bool
detail: Optional[ResultDetail] = None
value: Optional[Any] = None

def __init__(self, success: bool, detail: Optional[ResultDetail] = None, value: Optional[Any] = None):
self.success = success
self.detail = detail
self.value = value

@staticmethod
def ok(value: Optional[Any] = None, detail: Optional[ResultDetail] = None):
return Result(True, detail=detail, value=value)

@staticmethod
def fail(detail: Optional[ResultDetail] = None):
return Result(False, detail)

def code(self, default_success_code: int = 200, default_error_code: int = 500) -> int:
if self.detail and self.detail.code:
return self.detail.code
return default_success_code if self.success else default_error_code
42 changes: 42 additions & 0 deletions def_result/ResultDetail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from typing import Optional, Any, List


class ResultDetail:
title: str
message: Optional[str]
code: Optional[int]
more_data: List[Any] = []

def __init__(self, title: str,
message: Optional[str] = None,
code: Optional[int] = None,
more_data: Optional[List[Any]] = None):
if not title:
raise ValueError("title is required")
self.title = title
self.message = message
self.code = code
if more_data is not None:
self.more_data = more_data

def is_instance_of(self, cls):
return isinstance(self, cls)

def add_more_data(self, data: Any) -> None:
if not data:
return
if not self.more_data:
self.more_data = []
self.more_data.append(data)

def __str__(self):
result: str = ""

if self.title:
result += f"Title: {self.title}\n"
if self.message:
result += f"Message: {self.message}\n"
if self.code:
result += f"Code: {self.code}\n"

return result
3 changes: 0 additions & 3 deletions def_result/main.py

This file was deleted.

62 changes: 62 additions & 0 deletions tests/test_ResultDetail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import unittest

from def_result.ResultDetail import ResultDetail


class TestResultDetail(unittest.TestCase):
def test_init_without_optional_args(self):
title = 'title'
result_detail = ResultDetail(title=title)

self.assertEqual(result_detail.title, title)
self.assertIsNone(result_detail.message)
self.assertIsNone(result_detail.code)
self.assertIsNotNone(result_detail.more_data)
self.assertEqual(len(result_detail.more_data), 0)

def test_init_with_optional_args(self):
result_detail = ResultDetail(title='title', message='message', code=100, more_data=["more data"])

self.assertEqual(result_detail.title, 'title')
self.assertEqual(result_detail.message, 'message')
self.assertEqual(result_detail.code, 100)

self.assertIsNotNone(result_detail.more_data)
self.assertEqual(len(result_detail.more_data), 1)
self.assertEqual(result_detail.more_data[0], "more data")

def test_is_instance_of(self):
test_detail = FakeDetail("title")

self.assertTrue(test_detail.is_instance_of(FakeDetail))
self.assertTrue(test_detail.is_instance_of(ResultDetail))

def test_add_more_data(self):
result_detail = ResultDetail(title='title')
result_detail.more_data = None # We use none to make sure that our function does not run into problems.

result_detail.add_more_data("more data")

self.assertIsNotNone(result_detail.more_data)
self.assertEqual(len(result_detail.more_data), 1)
self.assertEqual(result_detail.more_data[0], "more data")

def test_str_without_args(self):
result_detail = ResultDetail(title='title')
expected = "Title: title\n"

self.assertEqual(str(result_detail), expected)

def test_str_with_args(self):
result_detail = ResultDetail(title='title', message='message', code=100)
expected = "Title: title\nMessage: message\nCode: 100\n"

self.assertEqual(str(result_detail), expected)


class FakeDetail(ResultDetail):
pass


if __name__ == "__main__":
unittest.main()

0 comments on commit bab86c8

Please sign in to comment.