Skip to content

Commit 2295da9

Browse files
committed
Add integartion tests for metadata
1 parent 2f0ce37 commit 2295da9

2 files changed

Lines changed: 156 additions & 0 deletions

File tree

tests/integration/test_infrahub_client.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from infrahub_sdk.constants import InfrahubClientMode
1212
from infrahub_sdk.exceptions import BranchNotFoundError, URLNotFoundError
1313
from infrahub_sdk.node import InfrahubNode
14+
from infrahub_sdk.node.metadata import NodeMetadata, RelationshipMetadata
1415
from infrahub_sdk.playback import JSONPlayback
1516
from infrahub_sdk.recorder import JSONRecorder
1617
from infrahub_sdk.schema import GenericSchema, NodeSchema, ProfileSchemaAPI
@@ -328,6 +329,91 @@ async def create_person_with_tags(clt: InfrahubClient, nbr_tags: int) -> None:
328329
)
329330
assert len(group.members.peers) == 2
330331

332+
async def test_node_metadata_not_fetched_by_default(
333+
self, client: InfrahubClient, base_dataset: None, cat_luna: InfrahubNode
334+
) -> None:
335+
node = await client.get(kind=TESTING_CAT, id=cat_luna.id)
336+
assert node.get_node_metadata() is None
337+
338+
async def test_node_metadata_with_get(
339+
self, client: InfrahubClient, base_dataset: None, cat_luna: InfrahubNode
340+
) -> None:
341+
node = await client.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
342+
343+
metadata = node.get_node_metadata()
344+
assert isinstance(metadata, NodeMetadata)
345+
assert metadata.created_at is not None
346+
assert metadata.updated_at is not None
347+
assert metadata.created_by.display_label == "Admin"
348+
assert metadata.updated_by.display_label == "Admin"
349+
350+
async def test_node_metadata_with_all(self, client: InfrahubClient, base_dataset: None) -> None:
351+
nodes = await client.all(kind=TESTING_CAT, include_metadata=True)
352+
assert nodes
353+
354+
for node in nodes:
355+
metadata = node.get_node_metadata()
356+
assert isinstance(metadata, NodeMetadata)
357+
assert metadata.created_at is not None
358+
assert metadata.updated_at is not None
359+
assert metadata.created_by.display_label == "Admin"
360+
assert metadata.updated_by.display_label == "Admin"
361+
362+
async def test_attribute_metadata(self, client: InfrahubClient, base_dataset: None, cat_luna: InfrahubNode) -> None:
363+
node = await client.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
364+
365+
assert node.name.updated_by.display_label == "Admin"
366+
assert node.breed.updated_by.display_label == "Admin"
367+
original_name_updated_at = node.name.updated_at
368+
original_breed_updated_at = node.breed.updated_at
369+
370+
node.name.value = "Luna Updated"
371+
await node.save()
372+
373+
assert original_name_updated_at is not None
374+
375+
node_after = await client.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
376+
assert node_after.name.value == "Luna Updated"
377+
assert node_after.name.updated_by.display_label == "Admin"
378+
assert node_after.name.updated_at is not None
379+
assert node_after.name.updated_at > original_name_updated_at
380+
assert node_after.breed.updated_at == original_breed_updated_at
381+
382+
async def test_relationship_metadata_cardinality_one(
383+
self, client: InfrahubClient, base_dataset: None, cat_luna: InfrahubNode
384+
) -> None:
385+
node = await client.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
386+
387+
rel_metadata = node.owner.get_relationship_metadata()
388+
assert isinstance(rel_metadata, RelationshipMetadata)
389+
assert rel_metadata.updated_at is not None
390+
assert rel_metadata.updated_by.display_label == "Admin"
391+
392+
async def test_relationship_metadata_cardinality_many(
393+
self, client: InfrahubClient, base_dataset: None, person_ethan: InfrahubNode
394+
) -> None:
395+
# Use include=["animals"] rather than prefetch_relationships=True.
396+
# prefetch_relationships=True recursively fetches each animal's peer relationships,
397+
# which in turn include person_ethan's null favorite_animal cardinality-one relationship.
398+
# The server GraphQL schema marks NestedEdgedTestingAnimal.node_metadata as non-nullable,
399+
# so requesting include_metadata=True on that null edge causes the server to silently
400+
# return empty edges. include=["animals"] fetches only the animals relationship shallowly.
401+
# Also exclude favorite_animal (null cardinality-one inbound) for the same reason.
402+
node = await client.get(
403+
kind=TESTING_PERSON,
404+
id=person_ethan.id,
405+
include_metadata=True,
406+
include=["animals"],
407+
exclude=["favorite_animal"],
408+
)
409+
410+
assert node.animals.peers
411+
for peer in node.animals.peers:
412+
rel_metadata = peer.get_relationship_metadata()
413+
assert isinstance(rel_metadata, RelationshipMetadata)
414+
assert rel_metadata.updated_at is not None
415+
assert rel_metadata.updated_by.display_label == "Admin"
416+
331417
@pytest.mark.xfail(reason="https://github.com/opsmill/infrahub-sdk-python/issues/733")
332418
async def test_recorder_with_playback_rewrite_host(
333419
self, base_dataset: None, tmp_path: Path, infrahub_port: int

tests/integration/test_infrahub_client_sync.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from infrahub_sdk.constants import InfrahubClientMode
1111
from infrahub_sdk.exceptions import BranchNotFoundError, URLNotFoundError
1212
from infrahub_sdk.node import InfrahubNodeSync
13+
from infrahub_sdk.node.metadata import NodeMetadata, RelationshipMetadata
1314
from infrahub_sdk.playback import JSONPlayback
1415
from infrahub_sdk.recorder import JSONRecorder
1516
from infrahub_sdk.schema import GenericSchema, NodeSchema, ProfileSchemaAPI
@@ -330,6 +331,75 @@ def create_person_with_tags(clt: InfrahubClientSync, nbr_tags: int) -> None:
330331
)
331332
assert len(group.members.peers) == 2
332333

334+
def test_node_metadata_not_fetched_by_default(
335+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
336+
) -> None:
337+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id)
338+
assert node.get_node_metadata() is None
339+
340+
def test_node_metadata_with_get(
341+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
342+
) -> None:
343+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
344+
345+
metadata = node.get_node_metadata()
346+
assert isinstance(metadata, NodeMetadata)
347+
assert metadata.created_at is not None
348+
assert metadata.updated_at is not None
349+
assert metadata.created_by.display_label == "Admin"
350+
assert metadata.updated_by.display_label == "Admin"
351+
352+
def test_attribute_metadata(
353+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
354+
) -> None:
355+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
356+
357+
assert node.name.updated_by.display_label == "Admin"
358+
assert node.breed.updated_by.display_label == "Admin"
359+
original_name_updated_at = node.name.updated_at
360+
original_breed_updated_at = node.breed.updated_at
361+
assert original_name_updated_at is not None
362+
363+
node.name.value = "Luna Updated"
364+
node.save()
365+
366+
node_after = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
367+
assert node_after.name.value == "Luna Updated"
368+
assert node_after.name.updated_by.display_label == "Admin"
369+
assert node_after.name.updated_at is not None
370+
assert node_after.name.updated_at > original_name_updated_at
371+
assert node_after.breed.updated_at == original_breed_updated_at
372+
373+
def test_relationship_metadata_cardinality_one(
374+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
375+
) -> None:
376+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
377+
378+
rel_metadata = node.owner.get_relationship_metadata()
379+
assert isinstance(rel_metadata, RelationshipMetadata)
380+
assert rel_metadata.updated_at is not None
381+
assert rel_metadata.updated_by.display_label == "Admin"
382+
383+
def test_relationship_metadata_cardinality_many(
384+
self, client_sync: InfrahubClientSync, base_dataset: None, person_ethan: InfrahubNode
385+
) -> None:
386+
# Use include=["animals"] rather than prefetch_relationships=True — see async counterpart
387+
# in test_infrahub_client.py for full explanation.
388+
node = client_sync.get(
389+
kind=TESTING_PERSON,
390+
id=person_ethan.id,
391+
include_metadata=True,
392+
include=["animals"],
393+
exclude=["favorite_animal"],
394+
)
395+
396+
assert node.animals.peers
397+
for peer in node.animals.peers:
398+
rel_metadata = peer.get_relationship_metadata()
399+
assert isinstance(rel_metadata, RelationshipMetadata)
400+
assert rel_metadata.updated_at is not None
401+
assert rel_metadata.updated_by.display_label == "Admin"
402+
333403
@pytest.mark.xfail(reason="https://github.com/opsmill/infrahub-sdk-python/issues/733")
334404
def test_recorder_with_playback_rewrite_host(self, base_dataset: None, tmp_path: Path, infrahub_port: int) -> None:
335405
# Create a fresh client for recording to ensure clean state (no cached schema)

0 commit comments

Comments
 (0)