Skip to content

Commit

Permalink
more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
ajtmccarty committed Nov 20, 2024
1 parent 8d394dd commit 2d3e492
Show file tree
Hide file tree
Showing 2 changed files with 155 additions and 1 deletion.
76 changes: 75 additions & 1 deletion backend/tests/unit/core/diff/test_diff_and_merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ async def test_relationship_set_to_null(self, db: InfrahubDatabase, default_bran
best_friend_rels = await updated_friend.best_friends.get_relationships(db=db)
assert len(best_friend_rels) == 0

async def test_local_nodes_added_on_branch(
async def test_local_and_aware_nodes_added_on_branch(
self, db: InfrahubDatabase, default_branch: Branch, car_person_schema_branch_local: SchemaBranch
):
branch2 = await create_branch(db=db, branch_name="branch2")
Expand Down Expand Up @@ -369,3 +369,77 @@ async def test_local_nodes_added_on_branch(
)
assert len(owner_rels) == 1
assert owner_rels[0].peer_id == person.id

async def test_agnostic_and_aware_nodes_added_on_branch(
self, db: InfrahubDatabase, default_branch: Branch, car_person_schema_global
):
branch2 = await create_branch(db=db, branch_name="branch2")
person = await Node.init(db=db, schema="TestPerson", branch=branch2)
await person.new(db=db, name="Guy", height=180)
await person.save(db=db)
car = await Node.init(db=db, schema="TestCar", branch=branch2)
await car.new(db=db, name="camry", nbr_seats=3, is_electric=False, owner=person.id)
await car.save(db=db)

diff_coordinator = await self._get_diff_coordinator(db=db, branch=branch2)
enriched_diff = await diff_coordinator.update_branch_diff(base_branch=default_branch, diff_branch=branch2)
diff_person = enriched_diff.get_node(node_uuid=person.id)
assert diff_person.action is DiffAction.UPDATED
diff_car = enriched_diff.get_node(node_uuid=car.id)
assert diff_car.action is DiffAction.ADDED

diff_merger = await self._get_diff_merger(db=db, branch=branch2)
await diff_merger.merge_graph(at=Timestamp())

# validate person (agnostic) exists on main
updated_person = await NodeManager.get_one(db=db, id=person.id)
assert updated_person.height.value == 180
assert updated_person.name.value == "Guy"
cars_rels = await updated_person.cars.get(db=db)
assert len(cars_rels) == 1
assert cars_rels[0].peer_id == car.id
# validate car merged to main
updated_car = await NodeManager.get_one(db=db, id=car.id)
assert updated_car.name.value == "camry"
assert updated_car.nbr_seats.value == 3
assert updated_car.is_electric.value is False
owner_rel = await updated_car.owner.get(db=db)
assert owner_rel.peer_id == person.id

person_schema = registry.schema.get(name="TestPerson", duplicate=False)
cars_rel_schema = person_schema.get_relationship(name="cars")
cars_rels = await NodeManager.query_peers(
db=db, ids=[person.id], source_kind="TestPerson", schema=cars_rel_schema, filters={}, fetch_peers=True
)
assert len(cars_rels) == 1
assert cars_rels[0].peer_id == car.id
car_schema = registry.schema.get(name="TestCar", duplicate=False)
owner_rel_schema = car_schema.get_relationship(name="owner")
owner_rels = await NodeManager.query_peers(
db=db, ids=[car.id], source_kind="TestCar", schema=owner_rel_schema, filters={}, fetch_peers=True
)
assert len(owner_rels) == 1
assert owner_rels[0].peer_id == person.id
# validate relationship still exists on branch
cars_rels = await NodeManager.query_peers(
db=db,
branch=branch2,
ids=[person.id],
source_kind="TestPerson",
schema=cars_rel_schema,
filters={},
fetch_peers=True,
)
assert len(cars_rels) == 1
assert cars_rels[0].peer_id == car.id
owner_rels = await NodeManager.query_peers(
db=db,
branch=branch2,
ids=[car.id],
source_kind="TestCar",
schema=owner_rel_schema,
filters={},
fetch_peers=True,
)
assert len(owner_rels) == 1
assert owner_rels[0].peer_id == person.id
80 changes: 80 additions & 0 deletions backend/tests/unit/core/diff/test_diff_calculator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2427,3 +2427,83 @@ async def test_hierarchy_with_same_kind_parent_and_child(
assert diff_prop.action is DiffAction.ADDED
assert diff_prop.previous_value is None
assert diff_prop.new_value == new_value


async def test_create_local_and_aware_nodes_on_branch(
db: InfrahubDatabase, default_branch: Branch, car_person_schema_branch_local: SchemaBranch
):
branch = await create_branch(db=db, branch_name="branch")
from_time = Timestamp()
person = await Node.init(db=db, schema="TestPerson", branch=branch)
await person.new(db=db, name="Guy", height=180)
await person.save(db=db)
# car is a local node
car = await Node.init(db=db, schema="TestCar", branch=branch)
await car.new(db=db, name="camry", owner=person.id)
await car.save(db=db)

diff_calculator = DiffCalculator(db=db)
calculated_diffs = await diff_calculator.calculate_diff(
base_branch=default_branch, diff_branch=branch, from_time=from_time, to_time=Timestamp()
)

base_branch_diff = calculated_diffs.base_branch_diff
assert len(base_branch_diff.nodes) == 0

diff_branch_diff = calculated_diffs.diff_branch_diff
nodes_by_id = {n.uuid: n for n in diff_branch_diff.nodes}
assert set(nodes_by_id.keys()) == {person.id}
node_diff = nodes_by_id[person.id]
assert node_diff.action is DiffAction.ADDED
assert len(node_diff.relationships) == 0
attrs_by_name = {a.name: a for a in node_diff.attributes}
assert set(attrs_by_name.keys()) == {"name", "height"}
for attr_diff in node_diff.attributes:
assert attr_diff.action is DiffAction.ADDED


async def test_create_aware_and_agnostic_nodes_on_branch(
db: InfrahubDatabase, default_branch: Branch, car_person_schema_global
):
branch = await create_branch(db=db, branch_name="branch")
from_time = Timestamp()
# person is an agnostic node
person = await Node.init(db=db, schema="TestPerson", branch=branch)
await person.new(db=db, name="Guy", height=180)
await person.save(db=db)
# nbr_seats is an agnostic attr
car = await Node.init(db=db, schema="TestCar", branch=branch)
await car.new(db=db, name="camry", nbr_seats=3, is_electric=True, owner=person.id)
await car.save(db=db)

diff_calculator = DiffCalculator(db=db)
calculated_diffs = await diff_calculator.calculate_diff(
base_branch=default_branch, diff_branch=branch, from_time=from_time, to_time=Timestamp()
)

base_branch_diff = calculated_diffs.base_branch_diff
assert len(base_branch_diff.nodes) == 0

diff_branch_diff = calculated_diffs.diff_branch_diff
nodes_by_id = {n.uuid: n for n in diff_branch_diff.nodes}
assert set(nodes_by_id.keys()) == {car.id, person.id}
# check car attributes and relationship
node_diff = nodes_by_id[car.id]
assert node_diff.action is DiffAction.ADDED
assert len(node_diff.relationships) == 1
rel_diff = node_diff.relationships.pop()
assert rel_diff.name == "owner"
assert rel_diff.action is DiffAction.ADDED
attrs_by_name = {a.name: a for a in node_diff.attributes}
# nbr_seats is agnostic, so is not included
assert set(attrs_by_name.keys()) == {"name", "color", "is_electric"}
for attr_diff in node_diff.attributes:
assert attr_diff.action is DiffAction.ADDED
# check person relationship
node_diff = nodes_by_id[person.id]
assert node_diff.action is DiffAction.UPDATED
assert len(node_diff.attributes) == 0
assert len(node_diff.relationships) == 1
rel_diff = node_diff.relationships.pop()
assert rel_diff.name == "cars"
assert rel_diff.action is DiffAction.UPDATED

0 comments on commit 2d3e492

Please sign in to comment.