diff --git a/elyra/pipeline/handlers.py b/elyra/pipeline/handlers.py index 83c43c6f3..f3bb86050 100644 --- a/elyra/pipeline/handlers.py +++ b/elyra/pipeline/handlers.py @@ -96,7 +96,7 @@ async def post(self, *args, **kwargs): pipeline_export_path = payload["export_path"] pipeline_overwrite = payload["overwrite"] - response = await PipelineValidationManager.instance().validate(pipeline=pipeline_definition) + response = await PipelineValidationManager.instance().validate(pipeline_definition) self.log.debug(f"Validation checks completed. Results as follows: {response.to_json()}") if not response.has_fatal: @@ -283,7 +283,7 @@ async def post(self): pipeline_definition = self.get_json_body() self.log.debug(f"Pipeline payload: {pipeline_definition}") - response = await PipelineValidationManager.instance().validate(pipeline=pipeline_definition) + response = await PipelineValidationManager.instance().validate(pipeline_definition) json_msg = response.to_json() self.set_status(200) diff --git a/elyra/tests/pipeline/test_handlers.py b/elyra/tests/pipeline/test_handlers.py index 2735ef5df..3b6e9c829 100644 --- a/elyra/tests/pipeline/test_handlers.py +++ b/elyra/tests/pipeline/test_handlers.py @@ -30,6 +30,11 @@ from elyra.tests.pipeline import resources from elyra.tests.util.handlers_utils import expected_http_error +from elyra.pipeline.processor import PipelineProcessorManager +from elyra.pipeline.validation import PipelineValidationManager +from elyra.pipeline.validation import ValidationResponse +from elyra.pipeline.parser import PipelineParser +from elyra.pipeline.validation import ValidationSeverity try: import importlib.resources as pkg_resources @@ -42,6 +47,13 @@ TEST_CATALOG_NAME = "test_handlers_catalog" +def _async_return(result): + # Helper function to return an arbitrary value when mocking awaits + f = asyncio.Future() + f.set_result(result) + return f + + def _get_resource_path(filename): resource_path = os.path.join(os.path.dirname(__file__), "resources", "components", filename) resource_path = os.path.normpath(resource_path) @@ -204,3 +216,46 @@ async def test_get_pipeline_properties_definition(jp_fetch): {"id": "elyra_kubernetes_secrets"}, {"id": "elyra_mounted_volumes"}, ] + + +async def test_pipeline_success(jp_fetch, monkeypatch): + request_body = {"pipeline": "body", "export_format": "py", "export_path": "test.py", "overwrite": True} + + # Create a response that will trigger the valid code path + validation_response = ValidationResponse() + + monkeypatch.setattr(PipelineValidationManager, "validate", lambda x, y: _async_return(validation_response)) + monkeypatch.setattr(PipelineParser, "parse", lambda x, y: "Dummy_Data") + monkeypatch.setattr(PipelineProcessorManager, "export", lambda x, y, z, aa, bb: _async_return("test.py")) + + json_body = json.dumps(request_body) + + http_response = await jp_fetch("elyra", "pipeline", "export", body=json_body, method="POST") + + assert http_response.code == 201 + + +async def test_pipeline_failure(jp_fetch, monkeypatch): + request_body = {"pipeline": "body", "export_format": "py", "export_path": "test.py", "overwrite": True} + + # Create a response that will trigger the fatal code path + bad_validation_response = ValidationResponse() + bad_validation_response.add_message(severity=ValidationSeverity.Error, message_type="invalidJSON", message="issue") + + monkeypatch.setattr(PipelineValidationManager, "validate", lambda x, y: _async_return(bad_validation_response)) + + json_body = json.dumps(request_body) + + # Will raise HTTP error so we need to catch with pytest + with pytest.raises(HTTPClientError): + await jp_fetch("elyra", "pipeline", "export", body=json_body, method="POST") + + +async def test_validation_handler(jp_fetch, monkeypatch): + request_body = {"pipeline": "body", "export_format": "py", "export_path": "test.py", "overwrite": True} + + monkeypatch.setattr(PipelineValidationManager, "validate", lambda x, y: _async_return(ValidationResponse())) + json_body = json.dumps(request_body) + http_response = await jp_fetch("elyra", "pipeline", "validate", body=json_body, method="POST") + + assert http_response.code == 200