You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dynamix-python-sdk/tests/local/test_class_naming.py

100 lines
3.6 KiB

1 week ago
import dynamix_sdk.types as sdk_types
from dynamix_sdk.utils import gen_cls_name_from_url_path
def test_api_class_naming(api_groups):
for api_group in api_groups:
correct_class_name = f'{api_group.name.capitalize()}API'
assert api_group.cls.__qualname__ == correct_class_name, (
f'\nAPI group: {api_group.name}'
f'\nCorrect API class name: {correct_class_name}'
)
for api_subgroup in api_group.subgroups:
correct_class_name = (
f'{api_group.name.capitalize()}'
f'{api_subgroup.name.capitalize()}'
f'API'
)
assert api_subgroup.cls.__qualname__ == correct_class_name, (
f'\nAPI group: {api_group.name}'
f'\nAPI subgroup: {api_subgroup.name}'
f'\nCorrect API class name: {correct_class_name}'
)
def test_protocol_class_naming(sdk_dx_functions):
for sdk_func in sdk_dx_functions:
correct_class_name = gen_cls_name_from_url_path(
url_path=sdk_func.url_path,
postfix='Protocol',
)
assert sdk_func.proto_cls.__qualname__ == correct_class_name, (
f'\nFunction call attributes: {sdk_func.call_attrs}'
f'\nURL path: {sdk_func.url_path}'
f'\nCorrect Protocol class name: {correct_class_name}'
)
def get_subclasses(cls: type, result: list[type] | None = None):
if result:
_result = result
else:
_result: list[type] = []
for subclass in cls.__subclasses__():
if issubclass(subclass.__bases__[0], cls):
_result.append(subclass)
_result += get_subclasses(subclass)
return _result
def test_params_nested_model_class_naming():
base_cls = sdk_types.BaseAPIParamsNestedModel
for params_nm_cls in get_subclasses(base_cls):
suffix = 'APIParamsNM'
assert params_nm_cls.__qualname__.endswith(suffix), (
f'Class {params_nm_cls.__qualname__}:'
f' all subclasses of {base_cls.__qualname__}'
f' must have a name with suffix "{suffix}".'
)
def test_result_class_naming(sdk_dx_functions):
for sdk_func in sdk_dx_functions:
if issubclass(sdk_func.result_cls, sdk_types.BaseAPIResultModel):
result_cls_postfix = 'ResultModel'
elif issubclass(sdk_func.result_cls, sdk_types.BaseAPIResultStr):
result_cls_postfix = 'ResultStr'
elif issubclass(sdk_func.result_cls, sdk_types.BaseAPIResultInt):
result_cls_postfix = 'ResultInt'
elif issubclass(sdk_func.result_cls, sdk_types.BaseAPIResultBool):
result_cls_postfix = 'ResultBool'
else:
raise TypeError
result_cls_name = gen_cls_name_from_url_path(
url_path=sdk_func.url_path,
postfix=result_cls_postfix,
)
assert sdk_func.result_cls.__qualname__ == result_cls_name, (
f'\nFunction call attributes: {sdk_func.call_attrs}'
f'\nURL path: {sdk_func.url_path}'
f'\nResult base class:'
f' {sdk_func.result_cls.__bases__[0].__qualname__}'
f'\nCorrect result class name: {result_cls_name}'
)
def test_result_nested_model_class_naming():
base_cls = sdk_types.BaseAPIResultNestedModel
for result_nm_cls in get_subclasses(base_cls):
suffix = 'APIResultNM'
assert result_nm_cls.__qualname__.endswith(suffix), (
f'Class {result_nm_cls.__qualname__}:'
f' all subclasses of {base_cls.__qualname__}'
f' must have a name with suffix "{suffix}".'
)