164 lines
6.1 KiB
Python
164 lines
6.1 KiB
Python
from __future__ import annotations
|
|
import unittest
|
|
|
|
from typing import Annotated, Optional
|
|
|
|
from os import chdir
|
|
from pathlib import Path
|
|
from pydantic import Field
|
|
from io import StringIO
|
|
from contextlib import redirect_stdout, redirect_stderr
|
|
|
|
print(__name__)
|
|
print(__package__)
|
|
|
|
from src.pyrestresource import (
|
|
RestResourceBase,
|
|
)
|
|
|
|
from src.pyrestresource.rest_resource_walker import (
|
|
RestResourceWalker_Root,
|
|
RestResourceWalker_Sub_T_Dict,
|
|
RestResourceWalker_Sub_RestFields,
|
|
RestResourceWalker_Sub_RestResourceBase,
|
|
)
|
|
|
|
testdir_path = Path(__file__).parent.resolve()
|
|
chdir(testdir_path.parent.resolve())
|
|
|
|
|
|
class RestResourceWalker_Sub_T_Dict_TEST_Print(RestResourceWalker_Sub_T_Dict):
|
|
counter: dict[str, int] = {}
|
|
|
|
@classmethod
|
|
def init_sub(cls, walker: RestResourceWalker_Root) -> None:
|
|
cls.counter = {}
|
|
|
|
def process(self) -> None:
|
|
if self.resource_name not in self.counter:
|
|
self.counter[self.resource_name] = 0
|
|
self.counter[self.resource_name] = self.counter[self.resource_name] + 1
|
|
|
|
print(f"DICT {self.resource_name} {self.counter[self.resource_name]}")
|
|
|
|
|
|
class RestResourceWalker_Sub_RestFields_TEST_Print(RestResourceWalker_Sub_RestFields):
|
|
counter: dict[str, int] = {}
|
|
|
|
@classmethod
|
|
def init_sub(cls, walker: RestResourceWalker_Root) -> None:
|
|
cls.counter = {}
|
|
|
|
def process(self) -> None:
|
|
if self.resource_name not in self.counter:
|
|
self.counter[self.resource_name] = 0
|
|
self.counter[self.resource_name] = self.counter[self.resource_name] + 1
|
|
|
|
print(f"FIELD {self.resource_name} {self.counter[self.resource_name]}")
|
|
|
|
|
|
class RestResourceWalker_Sub_RestResourceBase_TEST_Print(
|
|
RestResourceWalker_Sub_RestResourceBase
|
|
):
|
|
counter: dict[str, int] = {}
|
|
|
|
@classmethod
|
|
def init_sub(cls, walker: RestResourceWalker_Root) -> None:
|
|
cls.counter = {}
|
|
|
|
def process(self) -> None:
|
|
if self.resource_name not in self.counter:
|
|
self.counter[self.resource_name] = 0
|
|
self.counter[self.resource_name] = self.counter[self.resource_name] + 1
|
|
|
|
print(f"RestResource {self.resource_name} {self.counter[self.resource_name]}")
|
|
|
|
|
|
class RestResourceWalker_Root_TEST_Print(RestResourceWalker_Root):
|
|
cls_RestResourceWalker_Sub = [
|
|
RestResourceWalker_Sub_T_Dict_TEST_Print,
|
|
RestResourceWalker_Sub_RestFields_TEST_Print,
|
|
RestResourceWalker_Sub_RestResourceBase_TEST_Print,
|
|
]
|
|
|
|
|
|
def init_classes():
|
|
class Info(RestResourceBase):
|
|
version: str
|
|
api_version: str
|
|
|
|
class People(RestResourceBase):
|
|
last_name: str
|
|
|
|
class RootApp(RestResourceBase):
|
|
info: Info = Field(default=Info(version="0.0.1", api_version="0.0.2"))
|
|
info2: Info = Info(version="0.0.2", api_version="0.0.3")
|
|
peoples: dict[str, People] = {
|
|
"john": People(last_name="Doe"),
|
|
"jane": People(last_name="Roe"),
|
|
}
|
|
test_string: str = "test value"
|
|
test_string_opt: Optional[str] = None
|
|
test_int: int = 42
|
|
|
|
# this add the classes to globals to allow using them later on
|
|
# => this is only for uinit-testing purpose and is not needed in real use
|
|
globals()[Info.__name__] = Info
|
|
globals()[People.__name__] = People
|
|
globals()[RootApp.__name__] = RootApp
|
|
|
|
|
|
class Test_Walker(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
chdir(testdir_path.parent.resolve())
|
|
init_classes()
|
|
|
|
def test_walk_class(self):
|
|
test = RestResourceWalker_Root_TEST_Print(RootApp)
|
|
with redirect_stdout(StringIO()) as capted_stdout, redirect_stderr(
|
|
StringIO()
|
|
) as capted_stderr:
|
|
test.process()
|
|
self.assertIn("RestResource info 1", capted_stdout.getvalue())
|
|
self.assertIn("RestResource info2 1", capted_stdout.getvalue())
|
|
self.assertIn("DICT peoples 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_string 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_string_opt 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_int 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD version 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD version 2", capted_stdout.getvalue())
|
|
self.assertIn("FIELD api_version 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD api_version 2", capted_stdout.getvalue())
|
|
self.assertIn("RestResource peoples 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD last_name 1", capted_stdout.getvalue())
|
|
|
|
def test_walk_obj(self):
|
|
instRootApp = RootApp()
|
|
test = RestResourceWalker_Root_TEST_Print(instRootApp)
|
|
with redirect_stdout(StringIO()) as capted_stdout, redirect_stderr(
|
|
StringIO()
|
|
) as capted_stderr:
|
|
test.process()
|
|
self.assertIn("RestResource info 1", capted_stdout.getvalue())
|
|
self.assertIn("RestResource info2 1", capted_stdout.getvalue())
|
|
self.assertIn("DICT peoples 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_string 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_string_opt 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD test_int 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD version 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD version 2", capted_stdout.getvalue())
|
|
self.assertIn("FIELD api_version 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD api_version 2", capted_stdout.getvalue())
|
|
self.assertIn("RestResource peoples 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD last_name 1", capted_stdout.getvalue())
|
|
|
|
def test_walk_obj_nested_RestResource(self):
|
|
instRootApp = RootApp()
|
|
test = RestResourceWalker_Root_TEST_Print(instRootApp.info)
|
|
with redirect_stdout(StringIO()) as capted_stdout, redirect_stderr(
|
|
StringIO()
|
|
) as capted_stderr:
|
|
test.process()
|
|
self.assertIn("FIELD version 1", capted_stdout.getvalue())
|
|
self.assertIn("FIELD api_version 1", capted_stdout.getvalue())
|