From aa3e3909f907cf15d3c1650f62153bad3a7b63be Mon Sep 17 00:00:00 2001 From: Lucas Guillermou Date: Wed, 11 Sep 2024 15:27:20 +0200 Subject: [PATCH 1/3] Raise a proper 422 error when uploading a schemanode refering an unexisting schemanode --- backend/infrahub/core/schema_manager.py | 7 +++-- .../test_schema_missing_menu_placement.py | 30 +++++++++++++++++++ .../schema_manager/test_manager_schema.py | 4 +-- 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py diff --git a/backend/infrahub/core/schema_manager.py b/backend/infrahub/core/schema_manager.py index 75f782bbf3..4625308fc9 100644 --- a/backend/infrahub/core/schema_manager.py +++ b/backend/infrahub/core/schema_manager.py @@ -904,8 +904,11 @@ def validate_menu_placements(self) -> None: try: placement_node = self.get(name=node.menu_placement, duplicate=False) except SchemaNotFoundError: - raise ValueError(f"{node.kind}: {node.menu_placement} is not a valid menu placement") from None - + raise SchemaNotFoundError( + branch_name=self.name, + identifier=node.menu_placement, + message=f"{node.kind} refers an unexisting menu placement node: {node.menu_placement}.", + ) if node == placement_node: raise ValueError(f"{node.kind}: cannot be placed under itself in the menu") from None diff --git a/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py b/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py new file mode 100644 index 0000000000..daea1d9b75 --- /dev/null +++ b/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py @@ -0,0 +1,30 @@ +from infrahub_sdk import InfrahubClient + +from .shared import ( + TestSchemaLifecycleBase, +) + + +class TestSchemaMissingMenuPlacement(TestSchemaLifecycleBase): + async def test_schema_missing_menu_placement(self, client: InfrahubClient): + schema = { + "version": "1.0", + "nodes": [ + { + "name": "BNode", + "namespace": "Infra", + "menu_placement": "UnexistingNode", + "label": "BNode", + "display_labels": ["name__value"], + "attributes": [{"name": "name", "kind": "Text", "unique": True}], + } + ], + } + + response = await client.schema.load(schemas=[schema], branch="main") + assert response.schema_updated is False + assert response.errors["errors"][0]["extensions"]["code"] == 422 + assert ( + response.errors["errors"][0]["message"] + == "InfraBNode refers an unexisting menu placement node: UnexistingNode." + ) diff --git a/backend/tests/unit/core/schema_manager/test_manager_schema.py b/backend/tests/unit/core/schema_manager/test_manager_schema.py index d2ddf74d95..d3d401ee9d 100644 --- a/backend/tests/unit/core/schema_manager/test_manager_schema.py +++ b/backend/tests/unit/core/schema_manager/test_manager_schema.py @@ -835,10 +835,10 @@ async def test_schema_branch_validate_menu_placement(): schema = SchemaBranch(cache={}) schema.load_schema(schema=SchemaRoot(**FULL_SCHEMA)) - with pytest.raises(ValueError) as exc: + with pytest.raises(SchemaNotFoundError) as exc: schema.validate_menu_placements() - assert str(exc.value) == "TestSubObject: NoSuchObject is not a valid menu placement" + assert exc.value.message == "TestSubObject refers an unexisting menu placement node: NoSuchObject." async def test_schema_branch_validate_same_node_menu_placement(): From d4a309523249665f8b48de730298630dadfc2cab Mon Sep 17 00:00:00 2001 From: Lucas Guillermou Date: Wed, 11 Sep 2024 23:55:21 +0200 Subject: [PATCH 2/3] Raise from exception + improve wording --- backend/infrahub/core/schema_manager.py | 6 +++--- .../schema_lifecycle/test_schema_missing_menu_placement.py | 2 +- .../tests/unit/core/schema_manager/test_manager_schema.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/infrahub/core/schema_manager.py b/backend/infrahub/core/schema_manager.py index 4625308fc9..9e0f892836 100644 --- a/backend/infrahub/core/schema_manager.py +++ b/backend/infrahub/core/schema_manager.py @@ -903,12 +903,12 @@ def validate_menu_placements(self) -> None: if node.menu_placement: try: placement_node = self.get(name=node.menu_placement, duplicate=False) - except SchemaNotFoundError: + except SchemaNotFoundError as exc: raise SchemaNotFoundError( branch_name=self.name, identifier=node.menu_placement, - message=f"{node.kind} refers an unexisting menu placement node: {node.menu_placement}.", - ) + message=f"{node.kind} refers to an invalid menu placement node: {node.menu_placement}.", + ) from exc if node == placement_node: raise ValueError(f"{node.kind}: cannot be placed under itself in the menu") from None diff --git a/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py b/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py index daea1d9b75..076ea39112 100644 --- a/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py +++ b/backend/tests/integration/schema_lifecycle/test_schema_missing_menu_placement.py @@ -26,5 +26,5 @@ async def test_schema_missing_menu_placement(self, client: InfrahubClient): assert response.errors["errors"][0]["extensions"]["code"] == 422 assert ( response.errors["errors"][0]["message"] - == "InfraBNode refers an unexisting menu placement node: UnexistingNode." + == "InfraBNode refers to an invalid menu placement node: UnexistingNode." ) diff --git a/backend/tests/unit/core/schema_manager/test_manager_schema.py b/backend/tests/unit/core/schema_manager/test_manager_schema.py index d3d401ee9d..c21d74dc12 100644 --- a/backend/tests/unit/core/schema_manager/test_manager_schema.py +++ b/backend/tests/unit/core/schema_manager/test_manager_schema.py @@ -838,7 +838,7 @@ async def test_schema_branch_validate_menu_placement(): with pytest.raises(SchemaNotFoundError) as exc: schema.validate_menu_placements() - assert exc.value.message == "TestSubObject refers an unexisting menu placement node: NoSuchObject." + assert exc.value.message == "TestSubObject refers to an invalid menu placement node: NoSuchObject." async def test_schema_branch_validate_same_node_menu_placement(): From 21d298b00e52825759cee0c8db036e76ac0089d1 Mon Sep 17 00:00:00 2001 From: Lucas Guillermou Date: Thu, 12 Sep 2024 15:06:27 +0200 Subject: [PATCH 3/3] Add changelog fragment --- changelog/4089.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/4089.fixed.md diff --git a/changelog/4089.fixed.md b/changelog/4089.fixed.md new file mode 100644 index 0000000000..daa68d8f53 --- /dev/null +++ b/changelog/4089.fixed.md @@ -0,0 +1 @@ +Loading a schema with a schemanode referencing an incorrect menu placement now returns a proper HTTP 422 error