Skip to content

Commit a6a2332

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

2 files changed

Lines changed: 153 additions & 0 deletions

File tree

tests/integration/test_infrahub_client.py

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

tests/integration/test_infrahub_client_sync.py

Lines changed: 69 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,74 @@ 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+
351+
def test_attribute_metadata(
352+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
353+
) -> None:
354+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
355+
356+
assert node.name.updated_by.display_label == "Admin"
357+
assert node.breed.updated_by.display_label == "Admin"
358+
original_name_updated_at = node.name.updated_at
359+
original_breed_updated_at = node.breed.updated_at
360+
assert original_name_updated_at is not None
361+
362+
node.name.value = "Luna Updated"
363+
node.save()
364+
365+
node_after = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
366+
assert node_after.name.value == "Luna Updated"
367+
assert node_after.name.updated_by.display_label == "Admin"
368+
assert node_after.name.updated_at is not None
369+
assert node_after.name.updated_at > original_name_updated_at
370+
assert node_after.breed.updated_at == original_breed_updated_at
371+
372+
def test_relationship_metadata_cardinality_one(
373+
self, client_sync: InfrahubClientSync, base_dataset: None, cat_luna: InfrahubNode
374+
) -> None:
375+
node = client_sync.get(kind=TESTING_CAT, id=cat_luna.id, include_metadata=True)
376+
377+
rel_metadata = node.owner.get_relationship_metadata()
378+
assert isinstance(rel_metadata, RelationshipMetadata)
379+
assert rel_metadata.updated_at is not None
380+
assert rel_metadata.updated_by.display_label == "Admin"
381+
382+
def test_relationship_metadata_cardinality_many(
383+
self, client_sync: InfrahubClientSync, base_dataset: None, person_ethan: InfrahubNode
384+
) -> None:
385+
# Use include=["animals"] rather than prefetch_relationships=True — see async counterpart
386+
# in test_infrahub_client.py for full explanation.
387+
node = client_sync.get(
388+
kind=TESTING_PERSON,
389+
id=person_ethan.id,
390+
include_metadata=True,
391+
include=["animals"],
392+
exclude=["favorite_animal"],
393+
)
394+
395+
assert node.animals.peers
396+
for peer in node.animals.peers:
397+
rel_metadata = peer.get_relationship_metadata()
398+
assert isinstance(rel_metadata, RelationshipMetadata)
399+
assert rel_metadata.updated_at is not None
400+
assert rel_metadata.updated_by.display_label == "Admin"
401+
333402
@pytest.mark.xfail(reason="https://github.com/opsmill/infrahub-sdk-python/issues/733")
334403
def test_recorder_with_playback_rewrite_host(self, base_dataset: None, tmp_path: Path, infrahub_port: int) -> None:
335404
# Create a fresh client for recording to ensure clean state (no cached schema)

0 commit comments

Comments
 (0)