from typing import Dict
from privex import helpers
from tests.base import PrivexBaseCase
import logging
log = logging.getLogger(__name__)
[docs]def some_func(x, y, z=123, *args, **kwargs):
"""This is an example function used by :class:`.TestInspectFunctions`"""
pass
[docs]class SimpleExample:
"""This is an example basic class used by :class:`.TestInspectFunctions`"""
[docs] def __init__(self, hello, world, lorem='ipsum', **kwargs):
pass
[docs]class BaseOne:
"""This is an example parent class used by :class:`.TestInspectFunctions`"""
[docs] def __init__(self, a, b, c='hello'):
pass
[docs]class BaseTwo(BaseOne):
"""This is an example parent class used by :class:`.TestInspectFunctions`"""
[docs] def __init__(self, d, e, c='orange', **kw):
super().__init__(a=kw.get('a'), b=kw.get('b'), c=c)
[docs]class InheritExample(BaseTwo):
"""This is an example inheritance class used by :class:`.TestInspectFunctions`"""
[docs] def __init__(self, some, more='args', d='banana', **kw):
super().__init__(some=some, more=more, **kw)
[docs]class TestInspectFunctions(PrivexBaseCase):
[docs] def test_function_params_func(self):
"""Test :func:`.get_function_params` with a normal function"""
params = helpers.get_function_params(some_func)
self.assertIn('x', params)
self.assertIn('y', params)
self.assertIn('z', params)
self.assertNotIn('*args', params)
self.assertNotIn('**kwargs', params)
self.assertEqual(params['z'].default, 123)
[docs] def test_function_params_class(self):
"""Test :func:`.get_function_params` with a plain class without check_parents / merge"""
params = helpers.get_function_params(SimpleExample)
self.assertIn('hello', params)
self.assertIn('world', params)
self.assertIn('lorem', params)
self.assertNotIn('**kwargs', params)
self.assertEqual(params['lorem'].default, 'ipsum')
[docs] def test_function_params_class_no_parents(self):
"""Test :func:`.get_function_params` with an inherited class without check_parents / merge"""
params = helpers.get_function_params(InheritExample, check_parents=False)
self.assertIn('some', params)
self.assertIn('more', params)
self.assertIn('d', params)
self.assertNotIn('a', params)
self.assertNotIn('b', params)
self.assertNotIn('e', params)
[docs] def test_function_params_class_parents(self):
"""Test :func:`.get_function_params` with an inherited class using check_parents=True and merge=False"""
params = helpers.get_function_params(InheritExample, check_parents=True, merge=False)
params: Dict[type, Dict[str, helpers.T_PARAM]]
self.assertIn(BaseOne, params)
self.assertIn(BaseTwo, params)
self.assertIn(InheritExample, params)
self.assertIn('some', params[InheritExample])
self.assertIn('more', params[InheritExample])
self.assertIn('d', params[InheritExample])
self.assertIn('a', params[BaseOne])
self.assertIn('b', params[BaseOne])
self.assertIn('c', params[BaseOne])
self.assertIn('d', params[BaseTwo])
self.assertIn('e', params[BaseTwo])
self.assertIn('c', params[BaseTwo])
self.assertEqual(params[BaseTwo]['c'].default, 'orange')
self.assertEqual(params[BaseOne]['c'].default, 'hello')
self.assertEqual(params[BaseTwo]['d'].default, helpers.INS_EMPTY)
self.assertEqual(params[InheritExample]['d'].default, 'banana')
[docs] def test_function_params_class_parents_merge(self):
"""Test :func:`.get_function_params` with an inherited class using check_parents=True and merge=True"""
params = helpers.get_function_params(InheritExample, check_parents=True, merge=True)
self.assertIn('some', params)
self.assertIn('more', params)
self.assertIn('a', params)
self.assertIn('b', params)
self.assertIn('c', params)
self.assertIn('d', params)
self.assertIn('e', params)
self.assertEqual(params['c'].default, 'orange')
self.assertEqual(params['d'].default, 'banana')
[docs] def test_construct_dict_func(self):
"""Test :func:`.construct_dict` with calling a function using a dict"""
def limited_func(hello, example='world'):
return "success"
data = dict(hello='world', example='yes', lorem='ipsum')
with self.assertRaises(TypeError):
limited_func(**data)
res = helpers.construct_dict(limited_func, data)
self.assertEqual(res, "success")
[docs] def test_construct_dict_class(self):
"""Test :func:`.construct_dict` with constructing a class using a dict"""
class LimitedClass:
def __init__(self, hello, example='world'):
self.hello = hello
self.example = example
data = dict(hello='world', example='yes', lorem='ipsum')
with self.assertRaises(TypeError):
LimitedClass(**data)
res = helpers.construct_dict(LimitedClass, data)
self.assertEqual(res.hello, 'world')
self.assertEqual(res.example, 'yes')