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())