updates / fixes method serialization tests

This commit is contained in:
Mose Müller 2024-02-27 16:32:47 +01:00
parent a72a551f54
commit a7ce321506

View File

@ -6,9 +6,11 @@ import pydase
import pydase.units as u import pydase.units as u
import pytest import pytest
from pydase.components.coloured_enum import ColouredEnum from pydase.components.coloured_enum import ColouredEnum
from pydase.data_service.task_manager import TaskStatus
from pydase.utils.serializer import ( from pydase.utils.serializer import (
SerializationPathError, SerializationPathError,
dump, dump,
frontend,
get_nested_dict_by_path, get_nested_dict_by_path,
get_next_level_dict_by_key, get_next_level_dict_by_key,
serialized_dict_is_nested_object, serialized_dict_is_nested_object,
@ -133,29 +135,34 @@ async def test_method_serialization() -> None:
def some_method(self) -> str: def some_method(self) -> str:
return "some method" return "some method"
async def some_task(self, sleep_time: int) -> None: async def some_task(self) -> None:
while True: while True:
await asyncio.sleep(sleep_time) await asyncio.sleep(10)
instance = ClassWithMethod() instance = ClassWithMethod()
instance.start_some_task(10) # type: ignore instance.start_some_task() # type: ignore
assert dump(instance)["value"] == { assert dump(instance)["value"] == {
"some_method": { "some_method": {
"async": False,
"doc": None,
"parameters": {},
"readonly": True,
"type": "method", "type": "method",
"value": None, "value": None,
"readonly": True,
"doc": None,
"async": False,
"signature": {"parameters": {}, "return_annotation": {}},
"frontend_render": False,
}, },
"some_task": { "some_task": {
"async": True,
"doc": None,
"parameters": {"sleep_time": "int"},
"readonly": True,
"type": "method", "type": "method",
"value": {"sleep_time": 10}, "value": TaskStatus.RUNNING.name,
"readonly": True,
"doc": None,
"async": True,
"signature": {
"parameters": {},
"return_annotation": {},
},
"frontend_render": True,
}, },
} }
@ -173,28 +180,79 @@ def test_methods_with_type_hints() -> None:
assert dump(method_without_type_hint) == { assert dump(method_without_type_hint) == {
"async": False, "async": False,
"doc": None, "doc": None,
"parameters": {"arg_without_type_hint": None}, "signature": {
"parameters": {
"arg_without_type_hint": {
"annotation": "<class 'inspect._empty'>",
"default": {},
}
},
"return_annotation": {},
},
"readonly": True, "readonly": True,
"type": "method", "type": "method",
"value": None, "value": None,
"frontend_render": False,
} }
assert dump(method_with_type_hint) == { assert dump(method_with_type_hint) == {
"async": False,
"doc": None,
"parameters": {"some_argument": "int"},
"readonly": True,
"type": "method", "type": "method",
"value": None, "value": None,
"readonly": True,
"doc": None,
"async": False,
"signature": {
"parameters": {
"some_argument": {"annotation": "<class 'int'>", "default": {}}
},
"return_annotation": {},
},
"frontend_render": False,
}
assert dump(method_with_union_type_hint) == {
"type": "method",
"value": None,
"readonly": True,
"doc": None,
"async": False,
"signature": {
"parameters": {
"some_argument": {"annotation": "int | float", "default": {}}
},
"return_annotation": {},
},
"frontend_render": False,
} }
assert dump(method_with_union_type_hint) == {
"async": False, def test_exposed_function_serialization() -> None:
"doc": None, class MyService(pydase.DataService):
"parameters": {"some_argument": "int | float"}, @frontend
"readonly": True, def some_method(self) -> None:
pass
@frontend
def some_function() -> None:
pass
assert dump(MyService().some_method) == {
"type": "method", "type": "method",
"value": None, "value": None,
"readonly": True,
"doc": None,
"async": False,
"signature": {"parameters": {}, "return_annotation": {}},
"frontend_render": True,
}
assert dump(some_function) == {
"type": "method",
"value": None,
"readonly": True,
"doc": None,
"async": False,
"signature": {"parameters": {}, "return_annotation": {}},
"frontend_render": True,
} }
@ -224,6 +282,7 @@ def test_list_serialization() -> None:
"doc": None, "doc": None,
"readonly": False, "readonly": False,
"type": "DataService", "type": "DataService",
"name": "MySubclass",
"value": { "value": {
"bool_attr": { "bool_attr": {
"doc": None, "doc": None,
@ -268,6 +327,7 @@ def test_dict_serialization() -> None:
"type": "dict", "type": "dict",
"value": { "value": {
"DataService_key": { "DataService_key": {
"name": "MyClass",
"doc": None, "doc": None,
"readonly": False, "readonly": False,
"type": "DataService", "type": "DataService",
@ -317,9 +377,14 @@ def test_derived_data_service_serialization() -> None:
class DerivedService(BaseService): class DerivedService(BaseService):
... ...
base_instance = BaseService() base_service_serialization = dump(BaseService())
service_instance = DerivedService() derived_service_serialization = dump(DerivedService())
assert service_instance.serialize() == base_instance.serialize()
# Names of the classes obviously differ
base_service_serialization.pop("name")
derived_service_serialization.pop("name")
assert base_service_serialization == derived_service_serialization
@pytest.fixture @pytest.fixture