|
| 1 | +from infrahub.auth import AccountSession |
| 2 | +from infrahub.core import registry |
| 3 | +from infrahub.core.branch import Branch |
| 4 | +from infrahub.core.constants import MutationAction, RelationshipDeleteBehavior |
1 | 5 | from infrahub.core.manager import NodeManager |
2 | 6 | from infrahub.core.node import Node |
| 7 | +from infrahub.core.schema.schema_branch import SchemaBranch |
3 | 8 | from infrahub.database import InfrahubDatabase |
| 9 | +from infrahub.events.models import ParentEvent |
| 10 | +from infrahub.events.node_action import NodeMutatedEvent |
4 | 11 | from infrahub.graphql.initialization import prepare_graphql_params |
| 12 | +from infrahub.services import InfrahubServices |
| 13 | +from tests.adapters.event import MemoryInfrahubEvent |
5 | 14 | from tests.helpers.graphql import graphql |
6 | 15 |
|
7 | 16 |
|
@@ -36,6 +45,7 @@ async def test_delete_object(db: InfrahubDatabase, default_branch, car_person_sc |
36 | 45 | ) |
37 | 46 |
|
38 | 47 | assert result.errors is None |
| 48 | + assert result.data |
39 | 49 | assert result.data["TestPersonDelete"]["ok"] is True |
40 | 50 |
|
41 | 51 | assert not await NodeManager.get_one(db=db, id=obj1.id) |
@@ -70,6 +80,7 @@ async def test_delete_prevented( |
70 | 80 | f"It is linked to mandatory relationship owner on node TestCar '{car_camry_main.id}'" |
71 | 81 | in result.errors[0].message |
72 | 82 | ) |
| 83 | + assert result.data |
73 | 84 | assert result.data["TestPersonDelete"] is None |
74 | 85 |
|
75 | 86 | assert await NodeManager.get_one(db=db, id=person_jane_main.id) is not None |
@@ -109,6 +120,7 @@ async def test_delete_allowed_when_peer_rel_optional_on_generic( |
109 | 120 | ) |
110 | 121 |
|
111 | 122 | assert result.errors is None |
| 123 | + assert result.data |
112 | 124 | assert result.data["TestPersonDelete"]["ok"] is True |
113 | 125 |
|
114 | 126 | updated_dog1 = await NodeManager.get_one(db=db, id=dog1.id) |
@@ -151,3 +163,68 @@ async def test_delete_prevented_when_peer_rel_required_on_generic( |
151 | 163 | assert result.errors |
152 | 164 | assert len(result.errors) == 1 |
153 | 165 | assert expected_error_message in result.errors[0].message |
| 166 | + |
| 167 | + |
| 168 | +async def test_delete_events_with_cascade( |
| 169 | + db, |
| 170 | + default_branch: Branch, |
| 171 | + dependent_generics_schema: SchemaBranch, |
| 172 | + enable_broker_config: None, |
| 173 | + session_first_account: AccountSession, |
| 174 | +) -> None: |
| 175 | + # set TestPerson.animals to be cascade delete |
| 176 | + schema_branch = registry.schema.get_schema_branch(name=default_branch.name) |
| 177 | + for schema_kind in ("TestPerson", "TestHuman", "TestCylon"): |
| 178 | + schema = schema_branch.get(name=schema_kind, duplicate=False) |
| 179 | + schema.get_relationship("animals").on_delete = RelationshipDeleteBehavior.CASCADE |
| 180 | + |
| 181 | + human = await Node.init(db=db, schema="TestHuman", branch=default_branch) |
| 182 | + await human.new(db=db, name="Jane", height=180) |
| 183 | + await human.save(db=db) |
| 184 | + dog = await Node.init(db=db, schema="TestDog", branch=default_branch) |
| 185 | + await dog.new(db=db, name="Roofus", breed="whocares", weight=50, owner=human) |
| 186 | + await dog.save(db=db) |
| 187 | + |
| 188 | + memory_event = MemoryInfrahubEvent() |
| 189 | + service = await InfrahubServices.new(event=memory_event) |
| 190 | + gql_params = await prepare_graphql_params( |
| 191 | + db=db, include_subscription=False, branch=default_branch, service=service, account_session=session_first_account |
| 192 | + ) |
| 193 | + query = """ |
| 194 | + mutation DeletePerson($human_id: String!){ |
| 195 | + TestHumanDelete(data: {id: $human_id}) { |
| 196 | + ok |
| 197 | + } |
| 198 | + } |
| 199 | + """ |
| 200 | + result = await graphql( |
| 201 | + schema=gql_params.schema, |
| 202 | + source=query, |
| 203 | + context_value=gql_params.context, |
| 204 | + root_value=None, |
| 205 | + variable_values={"human_id": human.id}, |
| 206 | + ) |
| 207 | + |
| 208 | + assert not result.errors |
| 209 | + |
| 210 | + node_map = await NodeManager.get_many(db=db, ids=[human.id, dog.id]) |
| 211 | + assert node_map == {} |
| 212 | + |
| 213 | + assert gql_params.context.background |
| 214 | + await gql_params.context.background() |
| 215 | + assert len(memory_event.events) == 2 |
| 216 | + primary = memory_event.events[0] |
| 217 | + secondary = memory_event.events[1] |
| 218 | + assert isinstance(primary, NodeMutatedEvent) |
| 219 | + assert isinstance(secondary, NodeMutatedEvent) |
| 220 | + assert primary.kind == "TestHuman" |
| 221 | + assert primary.node_id == human.id |
| 222 | + assert primary.action == MutationAction.DELETED |
| 223 | + assert primary.meta.has_children |
| 224 | + |
| 225 | + assert secondary.kind == "TestDog" |
| 226 | + assert secondary.node_id == dog.id |
| 227 | + assert secondary.action == MutationAction.DELETED |
| 228 | + assert not secondary.meta.has_children |
| 229 | + assert secondary.meta.parent == primary.meta.id |
| 230 | + assert secondary.meta.ancestors == [ParentEvent(id=primary.get_id(), name=primary.get_name())] |
0 commit comments