diff --git a/changelog/455.fixed.md b/changelog/455.fixed.md new file mode 100644 index 00000000..73d958c6 --- /dev/null +++ b/changelog/455.fixed.md @@ -0,0 +1 @@ +Update InfrahubNode creation to include __typename, display_label, and kind from a RelatedNode \ No newline at end of file diff --git a/infrahub_sdk/node/node.py b/infrahub_sdk/node/node.py index 7a095586..d48968b4 100644 --- a/infrahub_sdk/node/node.py +++ b/infrahub_sdk/node/node.py @@ -507,11 +507,17 @@ def _init_relationships(self, data: dict | RelatedNode | None = None) -> None: if rel_schema.cardinality == "one": if isinstance(rel_data, RelatedNode): - peer_id_data: dict[str, Any] = {} - if rel_data.id: - peer_id_data["id"] = rel_data.id - if rel_data.hfid: - peer_id_data["hfid"] = rel_data.hfid + peer_id_data: dict[str, Any] = { + key: value + for key, value in ( + ("id", rel_data.id), + ("hfid", rel_data.hfid), + ("__typename", rel_data.typename), + ("kind", rel_data.kind), + ("display_label", rel_data.display_label), + ) + if value is not None + } if peer_id_data: rel_data = peer_id_data else: @@ -1090,11 +1096,17 @@ def _init_relationships(self, data: dict | None = None) -> None: if rel_schema.cardinality == "one": if isinstance(rel_data, RelatedNodeSync): - peer_id_data: dict[str, Any] = {} - if rel_data.id: - peer_id_data["id"] = rel_data.id - if rel_data.hfid: - peer_id_data["hfid"] = rel_data.hfid + peer_id_data: dict[str, Any] = { + key: value + for key, value in ( + ("id", rel_data.id), + ("hfid", rel_data.hfid), + ("__typename", rel_data.typename), + ("kind", rel_data.kind), + ("display_label", rel_data.display_label), + ) + if value is not None + } if peer_id_data: rel_data = peer_id_data else: diff --git a/infrahub_sdk/node/related_node.py b/infrahub_sdk/node/related_node.py index 60d46ca9..bf6cb532 100644 --- a/infrahub_sdk/node/related_node.py +++ b/infrahub_sdk/node/related_node.py @@ -39,6 +39,7 @@ def __init__(self, branch: str, schema: RelationshipSchemaAPI, data: Any | dict, self._hfid: list[str] | None = None self._display_label: str | None = None self._typename: str | None = None + self._kind: str | None = None if isinstance(data, (CoreNodeBase)): self._peer = data @@ -118,6 +119,12 @@ def typename(self) -> str | None: return self._peer.typename return self._typename + @property + def kind(self) -> str | None: + if self._peer: + return self._peer.get_kind() + return self._kind + def _generate_input_data(self, allocate_from_pool: bool = False) -> dict[str, Any]: data: dict[str, Any] = {} diff --git a/tests/integration/test_node.py b/tests/integration/test_node.py index c398d00a..9cc2ed75 100644 --- a/tests/integration/test_node.py +++ b/tests/integration/test_node.py @@ -83,6 +83,7 @@ async def test_node_create_with_relationships_using_related_node( assert node_after.name.value == node.name.value assert node_after.manufacturer.peer.id == manufacturer_mercedes.id assert node_after.owner.peer.id == person_joe.id + assert node_after.owner.peer.typename == "TestingPerson" async def test_node_update_with_original_data( self, diff --git a/tests/unit/sdk/test_node.py b/tests/unit/sdk/test_node.py index 2938d4a5..f427c592 100644 --- a/tests/unit/sdk/test_node.py +++ b/tests/unit/sdk/test_node.py @@ -196,7 +196,13 @@ async def test_init_node_data_user_with_relationships(client, location_schema: N @pytest.mark.parametrize("client_type", client_types) -@pytest.mark.parametrize("rel_data", [{"id": "pppppppp"}, {"hfid": ["pppp", "pppp"]}]) +@pytest.mark.parametrize( + "rel_data", + [ + {"id": "pppppppp", "__typename": "BuiltinTag"}, + {"hfid": ["pppp", "pppp"], "display_label": "mmmm", "kind": "BuiltinTag"}, + ], +) async def test_init_node_data_user_with_relationships_using_related_node( client, location_schema: NodeSchemaAPI, client_type, rel_data ): @@ -231,6 +237,9 @@ async def test_init_node_data_user_with_relationships_using_related_node( assert isinstance(node.primary_tag, RelatedNodeBase) assert node.primary_tag.id == rel_data.get("id") assert node.primary_tag.hfid == rel_data.get("hfid") + assert node.primary_tag.typename == rel_data.get("__typename") + assert node.primary_tag.kind == rel_data.get("kind") + assert node.primary_tag.display_label == rel_data.get("display_label") keys = dir(node) assert "name" in keys