diff --git a/src/pytmv1/model/common.py b/src/pytmv1/model/common.py index 45fd04e..29435c9 100644 --- a/src/pytmv1/model/common.py +++ b/src/pytmv1/model/common.py @@ -5,7 +5,7 @@ from pydantic import BaseModel as PydanticBaseModel from pydantic import ConfigDict, Field from pydantic import RootModel as PydanticRootModel -from pydantic import model_validator +from pydantic import field_validator, model_validator from pydantic.alias_generators import to_camel from .enum import ( @@ -131,17 +131,24 @@ class Endpoint(BaseConsumable): endpoint_name: Value mac_address: ValueList ip: ValueList - os_name: OperatingSystem - os_version: str - os_description: str - product_code: ProductCode - installed_product_codes: List[ProductCode] + os_name: Optional[OperatingSystem] = None + os_version: Optional[str] = None + os_description: Optional[str] = None + product_code: Optional[ProductCode] = None + installed_product_codes: List[ProductCode] = Field(default=[]) componentUpdatePolicy: Optional[str] = None componentUpdateStatus: Optional[str] = None componentVersion: Optional[str] = None policyName: Optional[str] = None protectionManager: Optional[str] = None + @field_validator("os_name", "product_code", mode="before") + @classmethod + def allow_empty_enum_string(cls, value: Any) -> Union[Any, None]: + if value == "": + return None + return value + class EmailActivity(BaseConsumable): mail_msg_subject: Optional[str] = None diff --git a/src/pytmv1/model/enum.py b/src/pytmv1/model/enum.py index 710a94c..85f4e3f 100644 --- a/src/pytmv1/model/enum.py +++ b/src/pytmv1/model/enum.py @@ -261,7 +261,6 @@ class ProductCode(str, Enum): SAO = "sao" SDS = "sds" XES = "xes" - NOT_FOUND = "" class Provenance(str, Enum): diff --git a/tests/integration/test_search.py b/tests/integration/test_search.py index 0d80f1c..cca3d19 100755 --- a/tests/integration/test_search.py +++ b/tests/integration/test_search.py @@ -72,3 +72,14 @@ def test_list_endpoint_data(client): assert result.response.items[0].componentUpdatePolicy == "N-2" assert result.response.items[0].componentUpdateStatus == "pause" assert result.response.items[0].componentVersion == "outdatedVersion" + + +def test_list_endpoint_data_optional_fields(client): + result = client.endpoint.list_data(endpointName="optional_fields") + assert result.result_code == ResultCode.SUCCESS + assert isinstance(result.response, ListEndpointDataResp) + assert len(result.response.items) > 0 + assert not result.response.items[0].product_code + assert not result.response.items[0].os_name + assert not result.response.items[0].os_version + assert not result.response.items[0].os_description