You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_serialization.py 3.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #custom type
  2. from pydantic import BaseModel
  3. from dataclasses import dataclass
  4. import pytest
  5. from agnext.core import Serialization
  6. class PydanticMessage(BaseModel):
  7. message: str
  8. class NestingPydanticMessage(BaseModel):
  9. message: str
  10. nested: PydanticMessage
  11. @dataclass
  12. class DataclassMessage:
  13. message: str
  14. @dataclass
  15. class NestingDataclassMessage:
  16. message: str
  17. nested: DataclassMessage
  18. @dataclass
  19. class NestingPydanticDataclassMessage:
  20. message: str
  21. nested: PydanticMessage
  22. def test_pydantic() -> None:
  23. serde = Serialization()
  24. serde.add_type(PydanticMessage)
  25. message = PydanticMessage(message="hello")
  26. name = serde.type_name(message)
  27. json = serde.serialize(message, type_name=name)
  28. assert name == "PydanticMessage"
  29. assert json == '{"message":"hello"}'
  30. deserialized = serde.deserialize(json, type_name=name)
  31. assert deserialized == message
  32. def test_nested_pydantic() -> None:
  33. serde = Serialization()
  34. serde.add_type(NestingPydanticMessage)
  35. message = NestingPydanticMessage(message="hello", nested=PydanticMessage(message="world"))
  36. name = serde.type_name(message)
  37. json = serde.serialize(message, type_name=name)
  38. assert json == '{"message":"hello","nested":{"message":"world"}}'
  39. deserialized = serde.deserialize(json, type_name=name)
  40. assert deserialized == message
  41. def test_dataclass() -> None:
  42. serde = Serialization()
  43. serde.add_type(DataclassMessage)
  44. message = DataclassMessage(message="hello")
  45. name = serde.type_name(message)
  46. json = serde.serialize(message, type_name=name)
  47. assert json == '{"message": "hello"}'
  48. deserialized = serde.deserialize(json, type_name=name)
  49. assert deserialized == message
  50. def test_nesting_dataclass_dataclass() -> None:
  51. serde = Serialization()
  52. serde.add_type(NestingDataclassMessage)
  53. message = NestingDataclassMessage(message="hello", nested=DataclassMessage(message="world"))
  54. name = serde.type_name(message)
  55. with pytest.raises(ValueError):
  56. _json = serde.serialize(message, type_name=name)
  57. def test_nesting_dataclass_pydantic() -> None:
  58. serde = Serialization()
  59. serde.add_type(NestingPydanticDataclassMessage)
  60. message = NestingPydanticDataclassMessage(message="hello", nested=PydanticMessage(message="world"))
  61. name = serde.type_name(message)
  62. with pytest.raises(ValueError):
  63. _json = serde.serialize(message, type_name=name)
  64. def test_invalid_type() -> None:
  65. serde = Serialization()
  66. try:
  67. serde.add_type(str) # type: ignore
  68. except ValueError as e:
  69. assert str(e) == "Unsupported type <class 'str'>"
  70. def test_custom_type() -> None:
  71. serde = Serialization()
  72. class CustomStringTypeDeserializer:
  73. def deserialize(self, message: str) -> str:
  74. return message[1:-1]
  75. class CustomStringTypeSerializer:
  76. def serialize(self, message: str) -> str:
  77. return f'"{message}"'
  78. serde.add_type_custom("custom_str", CustomStringTypeDeserializer(), CustomStringTypeSerializer())
  79. message = "hello"
  80. json = serde.serialize(message, type_name="custom_str")
  81. assert json == '"hello"'
  82. deserialized = serde.deserialize(json, type_name="custom_str")
  83. assert deserialized == message