Files
pyrestresource/test/test_rest_resource_walker.py
2023-11-06 01:11:43 +00:00

156 lines
6.2 KiB
Python

from __future__ import annotations
import unittest
from typing import Optional
from os import chdir
from pathlib import Path
from io import StringIO
from contextlib import redirect_stdout
print(__name__)
print(__package__)
from src.pyrestresource import (
RestField,
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):
cls_counter: dict[str, int] = {}
def process(self) -> None:
counter = self.cls_counter
if self.resource_name not in counter:
counter[self.resource_name] = 0
counter[self.resource_name] = counter[self.resource_name] + 1
print(f"DICT {self.resource_name} {counter[self.resource_name]}")
class RestResourceWalker_Sub_RestFields_TEST_Print(RestResourceWalker_Sub_RestFields):
cls_counter: dict[str, int] = {}
def process(self) -> None:
counter = self.cls_counter
if self.resource_name not in counter:
counter[self.resource_name] = 0
counter[self.resource_name] = counter[self.resource_name] + 1
print(f"FIELD {self.resource_name} {counter[self.resource_name]}")
class RestResourceWalker_Sub_RestResourceBase_TEST_Print(RestResourceWalker_Sub_RestResourceBase):
cls_counter: dict[str, int] = {}
def process(self) -> None:
counter = self.cls_counter
if self.resource_name not in counter:
counter[self.resource_name] = 0
counter[self.resource_name] = counter[self.resource_name] + 1
print(f"RestResource {self.resource_name} {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 = RestField(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):
RestResourceWalker_Sub_T_Dict_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestFields_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestResourceBase_TEST_Print.cls_counter = {}
test = RestResourceWalker_Root_TEST_Print(RootApp)
with redirect_stdout(StringIO()) as capted_stdout:
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):
RestResourceWalker_Sub_T_Dict_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestFields_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestResourceBase_TEST_Print.cls_counter = {}
instRootApp = RootApp()
test = RestResourceWalker_Root_TEST_Print(instRootApp)
with redirect_stdout(StringIO()) as capted_stdout:
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):
RestResourceWalker_Sub_T_Dict_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestFields_TEST_Print.cls_counter = {}
RestResourceWalker_Sub_RestResourceBase_TEST_Print.cls_counter = {}
instRootApp = RootApp()
test = RestResourceWalker_Root_TEST_Print(instRootApp.info)
with redirect_stdout(StringIO()) as capted_stdout:
test.process({})
self.assertIn("FIELD version 1", capted_stdout.getvalue())
self.assertIn("FIELD api_version 1", capted_stdout.getvalue())