diff --git a/infrahub_sdk/node.py b/infrahub_sdk/node.py index 6033fe3b..161d31bb 100644 --- a/infrahub_sdk/node.py +++ b/infrahub_sdk/node.py @@ -82,17 +82,18 @@ def __init__(self, name: str, schema: AttributeSchemaAPI, data: Any | dict): self.id: str | None = data.get("id", None) - self.value: Any | None = data.get("value", None) + self._value: Any | None = data.get("value", None) + self.value_has_been_mutated = False self.is_default: bool | None = data.get("is_default", None) self.is_from_profile: bool | None = data.get("is_from_profile", None) - if self.value: + if self._value: value_mapper: dict[str, Callable] = { "IPHost": ipaddress.ip_interface, "IPNetwork": ipaddress.ip_network, } mapper = value_mapper.get(schema.kind, lambda value: value) - self.value = mapper(data.get("value")) + self._value = mapper(data.get("value")) self.is_inherited: bool | None = data.get("is_inherited", None) self.updated_at: str | None = data.get("updated_at", None) @@ -107,6 +108,15 @@ def __init__(self, name: str, schema: AttributeSchemaAPI, data: Any | dict): if data.get(prop_name): setattr(self, prop_name, NodeProperty(data=data.get(prop_name))) # type: ignore[arg-type] + @property + def value(self) -> Any: + return self._value + + @value.setter + def value(self, value: Any) -> None: + self._value = value + self.value_has_been_mutated = True + def _generate_input_data(self) -> dict | None: data: dict[str, Any] = {} variables: dict[str, Any] = {} @@ -975,7 +985,9 @@ def _strip_unmodified(self, data: dict, variables: dict) -> tuple[dict, dict]: for item in original_data.keys(): if item in data.keys(): if data[item] == original_data[item]: - data.pop(item) + if attr := getattr(self, item, None): # this should never be None, just a safety default value + if not isinstance(attr, Attribute) or not attr.value_has_been_mutated: + data.pop(item) continue if isinstance(original_data[item], dict): self._strip_unmodified_dict(data=data, original_data=original_data, variables=variables, item=item) diff --git a/tests/integration/test_node.py b/tests/integration/test_node.py index ea218284..6c2244a3 100644 --- a/tests/integration/test_node.py +++ b/tests/integration/test_node.py @@ -63,6 +63,25 @@ async def test_node_create_with_relationships( assert node_after.name.value == node.name.value assert node_after.manufacturer.peer.id == manufacturer_mercedes.id + async def test_node_update_with_original_data( + self, + default_branch: str, + client: InfrahubClient, + initial_schema: None, + ): + person_marina = await client.create(kind="TestingPerson", name="marina", age=20) + await person_marina.save() + + person_marina = await client.get(kind="TestingPerson", id=person_marina.id) + + person_marina.age.value = 30 + await person_marina.save() + + person_marina.age.value = 20 + await person_marina.save() + node = await client.get(kind="TestingPerson", id=person_marina.id) + assert node.age.value == 20, node.age.value + # async def test_node_update_payload_with_relationships( # self, # db: InfrahubDatabase,