You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "pvillard31 (via GitHub)" <gi...@apache.org> on 2024/11/22 14:20:43 UTC

[PR] NIFI-14041 - Improve MockPropertyValue and EL evaluation validation [nifi]

pvillard31 opened a new pull request, #9549:
URL: https://github.com/apache/nifi/pull/9549

   # Summary
   
   [NIFI-14041](https://issues.apache.org/jira/browse/NIFI-14041) - Improve MockPropertyValue and EL evaluation validation
   
   While building a processor, I noticed that the test framework would throw an error if I'm in the below situation:
   
   - Processor with input forbidden
   - Property with EL support with Environment scope
   - Evaluation of the EL with .evaluateAttributeExpressions(Map<String,String>)
   
   This should not throw an error. This PR is to fix this case as well as covering the overall EL evaluation in the test framework with proper unit testing.
   
   # Tracking
   
   Please complete the following tracking steps prior to pull request creation.
   
   ### Issue Tracking
   
   - [ ] [Apache NiFi Jira](https://issues.apache.org/jira/browse/NIFI) issue created
   
   ### Pull Request Tracking
   
   - [ ] Pull Request title starts with Apache NiFi Jira issue number, such as `NIFI-00000`
   - [ ] Pull Request commit message starts with Apache NiFi Jira issue number, as such `NIFI-00000`
   
   ### Pull Request Formatting
   
   - [ ] Pull Request based on current revision of the `main` branch
   - [ ] Pull Request refers to a feature branch with one commit containing changes
   
   # Verification
   
   Please indicate the verification steps performed prior to pull request creation.
   
   ### Build
   
   - [ ] Build completed using `mvn clean install -P contrib-check`
     - [ ] JDK 21
   
   ### Licensing
   
   - [ ] New dependencies are compatible with the [Apache License 2.0](https://apache.org/licenses/LICENSE-2.0) according to the [License Policy](https://www.apache.org/legal/resolved.html)
   - [ ] New dependencies are documented in applicable `LICENSE` and `NOTICE` files
   
   ### Documentation
   
   - [ ] Documentation formatting appears as expected in rendered files
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@nifi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] NIFI-14041 - Improve MockPropertyValue and EL evaluation validation [nifi]

Posted by "exceptionfactory (via GitHub)" <gi...@apache.org>.
exceptionfactory commented on code in PR #9549:
URL: https://github.com/apache/nifi/pull/9549#discussion_r1854720585


##########
nifi-mock/src/test/java/org/apache/nifi/util/TestMockPropertyValue.java:
##########
@@ -0,0 +1,310 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.util;
+
+import org.apache.nifi.annotation.behavior.InputRequirement;
+import org.apache.nifi.annotation.behavior.InputRequirement.Requirement;
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.expression.ExpressionLanguageScope;
+import org.apache.nifi.flowfile.FlowFile;
+import org.apache.nifi.processor.AbstractProcessor;
+import org.apache.nifi.processor.ProcessContext;
+import org.apache.nifi.processor.ProcessSession;
+import org.apache.nifi.processor.Relationship;
+import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestMockPropertyValue {
+
+    private final static String FF_SCOPE_WITH_FF = "Test FlowFile scope and providing a flow file";
+    private final static String ENV_SCOPE_WITH_FF = "Test Env scope and providing a flow file";
+    private final static String NONE_SCOPE_WITH_FF = "Test None scope and providing a flow file";
+    private final static String FF_SCOPE_NO_FF = "Test FlowFile scope and no flow file";
+    private final static String ENV_SCOPE_NO_FF = "Test Env scope and no flow file";
+    private final static String NONE_SCOPE_NO_FF = "Test None scope and no flow file";
+    private final static String FF_SCOPE_WITH_MAP = "Test FlowFile scope and providing a Map";
+    private final static String ENV_SCOPE_WITH_MAP = "Test Env scope and providing a Map";
+    private final static String NONE_SCOPE_WITH_MAP = "Test None scope and providing a Map";
+
+    @Test
+    public void testELScopeValidationProcessorWithInput() {
+        final DummyProcessorWithInput processor = new DummyProcessorWithInput();
+        final TestRunner runner = TestRunners.newTestRunner(processor);
+
+        runner.setProperty(DummyProcessorWithInput.PROP_FF_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_ENV_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_NONE_SCOPE, "${test}");
+
+        // This case is expected to work: we evaluate against a FlowFile and the
+        // property has the expected FlowFile scope
+        processor.setTestCase(FF_SCOPE_WITH_FF);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: we evaluate against a FlowFile but the
+        // property is not supposed to support evaluation against a FlowFile
+        processor.setTestCase(ENV_SCOPE_WITH_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());

Review Comment:
   The method reference style should be used throughout.
   ```suggestion
           assertThrows(AssertionError.class, runner::run);
   ```



##########
nifi-mock/src/test/java/org/apache/nifi/util/TestMockPropertyValue.java:
##########
@@ -0,0 +1,310 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.util;
+
+import org.apache.nifi.annotation.behavior.InputRequirement;
+import org.apache.nifi.annotation.behavior.InputRequirement.Requirement;
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.expression.ExpressionLanguageScope;
+import org.apache.nifi.flowfile.FlowFile;
+import org.apache.nifi.processor.AbstractProcessor;
+import org.apache.nifi.processor.ProcessContext;
+import org.apache.nifi.processor.ProcessSession;
+import org.apache.nifi.processor.Relationship;
+import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestMockPropertyValue {
+
+    private final static String FF_SCOPE_WITH_FF = "Test FlowFile scope and providing a flow file";
+    private final static String ENV_SCOPE_WITH_FF = "Test Env scope and providing a flow file";
+    private final static String NONE_SCOPE_WITH_FF = "Test None scope and providing a flow file";
+    private final static String FF_SCOPE_NO_FF = "Test FlowFile scope and no flow file";
+    private final static String ENV_SCOPE_NO_FF = "Test Env scope and no flow file";
+    private final static String NONE_SCOPE_NO_FF = "Test None scope and no flow file";
+    private final static String FF_SCOPE_WITH_MAP = "Test FlowFile scope and providing a Map";
+    private final static String ENV_SCOPE_WITH_MAP = "Test Env scope and providing a Map";
+    private final static String NONE_SCOPE_WITH_MAP = "Test None scope and providing a Map";
+
+    @Test
+    public void testELScopeValidationProcessorWithInput() {
+        final DummyProcessorWithInput processor = new DummyProcessorWithInput();
+        final TestRunner runner = TestRunners.newTestRunner(processor);
+
+        runner.setProperty(DummyProcessorWithInput.PROP_FF_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_ENV_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_NONE_SCOPE, "${test}");
+
+        // This case is expected to work: we evaluate against a FlowFile and the
+        // property has the expected FlowFile scope
+        processor.setTestCase(FF_SCOPE_WITH_FF);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: we evaluate against a FlowFile but the
+        // property is not supposed to support evaluation against a FlowFile
+        processor.setTestCase(ENV_SCOPE_WITH_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is supposed to fail: there is an incoming connection, there is a
+        // FlowFile available, we have EL scope but we don't evaluate against the FF
+        processor.setTestCase(FF_SCOPE_NO_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        processor.setTestCase(ENV_SCOPE_NO_FF);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_NO_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is accepted as we have an incoming connection, we may be evaluating
+        // against a map made of the flow file attributes + additional key/value pairs.
+        processor.setTestCase(FF_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+    }
+
+    @Test
+    public void testELScopeValidationProcessorNoInput() {
+        final DummyProcessorNoInput processor = new DummyProcessorNoInput();
+        final TestRunner runner = TestRunners.newTestRunner(processor);
+
+        runner.setProperty(DummyProcessorNoInput.PROP_FF_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorNoInput.PROP_ENV_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorNoInput.PROP_NONE_SCOPE, "${test}");
+
+        // This case is supposed to be OK: in that case, we don't care if attributes are
+        // not available even though scope is FLOWFILE_ATTRIBUTES it likely means that
+        // the property has been defined in a common/abstract class used by multiple
+        // processors with different input requirements.
+        processor.setTestCase(FF_SCOPE_NO_FF);
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_NO_FF);
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_NO_FF);
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is supposed to be OK: in that case, we don't care if attributes are
+        // not available even though scope is FLOWFILE_ATTRIBUTES it likely means that
+        // the property has been defined in a common/abstract class used by multiple
+        // processors with different input requirements.
+        processor.setTestCase(FF_SCOPE_WITH_MAP);
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_WITH_MAP);
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_MAP);
+        assertThrows(AssertionError.class, () -> runner.run());
+    }
+
+    @InputRequirement(Requirement.INPUT_ALLOWED)
+    private static class DummyProcessorWithInput extends AbstractProcessor {
+        static final PropertyDescriptor PROP_FF_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with FF scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+        static final PropertyDescriptor PROP_ENV_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with Env scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+        static final PropertyDescriptor PROP_NONE_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with None scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.NONE)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+
+        static final Relationship SUCCESS = new Relationship.Builder()
+                .name("success")
+                .build();
+
+        private static final Set<Relationship> RELATIONSHIPS = Set.of(SUCCESS);
+
+        private String testCase;
+
+        @Override
+        protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+            final List<PropertyDescriptor> properties = new ArrayList<>();
+            properties.add(PROP_FF_SCOPE);
+            properties.add(PROP_ENV_SCOPE);
+            properties.add(PROP_NONE_SCOPE);
+            return properties;
+        }
+
+        @Override
+        public Set<Relationship> getRelationships() {
+            return RELATIONSHIPS;
+        }
+
+        @Override
+        public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
+            FlowFile ff = session.get();
+
+            final Map<String, String> map = Map.of("test", "test");
+
+            switch (getTestCase()) {
+            case FF_SCOPE_WITH_FF -> {
+                context.getProperty(PROP_FF_SCOPE).evaluateAttributeExpressions(ff);
+            }

Review Comment:
   The wrapping brackets are not necessary:
   ```suggestion
               case FF_SCOPE_WITH_FF -> context.getProperty(PROP_FF_SCOPE).evaluateAttributeExpressions(ff);
   ```



##########
nifi-mock/src/test/java/org/apache/nifi/util/TestMockPropertyValue.java:
##########
@@ -0,0 +1,310 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.util;
+
+import org.apache.nifi.annotation.behavior.InputRequirement;
+import org.apache.nifi.annotation.behavior.InputRequirement.Requirement;
+import org.apache.nifi.components.PropertyDescriptor;
+import org.apache.nifi.expression.ExpressionLanguageScope;
+import org.apache.nifi.flowfile.FlowFile;
+import org.apache.nifi.processor.AbstractProcessor;
+import org.apache.nifi.processor.ProcessContext;
+import org.apache.nifi.processor.ProcessSession;
+import org.apache.nifi.processor.Relationship;
+import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class TestMockPropertyValue {
+
+    private final static String FF_SCOPE_WITH_FF = "Test FlowFile scope and providing a flow file";
+    private final static String ENV_SCOPE_WITH_FF = "Test Env scope and providing a flow file";
+    private final static String NONE_SCOPE_WITH_FF = "Test None scope and providing a flow file";
+    private final static String FF_SCOPE_NO_FF = "Test FlowFile scope and no flow file";
+    private final static String ENV_SCOPE_NO_FF = "Test Env scope and no flow file";
+    private final static String NONE_SCOPE_NO_FF = "Test None scope and no flow file";
+    private final static String FF_SCOPE_WITH_MAP = "Test FlowFile scope and providing a Map";
+    private final static String ENV_SCOPE_WITH_MAP = "Test Env scope and providing a Map";
+    private final static String NONE_SCOPE_WITH_MAP = "Test None scope and providing a Map";
+
+    @Test
+    public void testELScopeValidationProcessorWithInput() {
+        final DummyProcessorWithInput processor = new DummyProcessorWithInput();
+        final TestRunner runner = TestRunners.newTestRunner(processor);
+
+        runner.setProperty(DummyProcessorWithInput.PROP_FF_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_ENV_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorWithInput.PROP_NONE_SCOPE, "${test}");
+
+        // This case is expected to work: we evaluate against a FlowFile and the
+        // property has the expected FlowFile scope
+        processor.setTestCase(FF_SCOPE_WITH_FF);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: we evaluate against a FlowFile but the
+        // property is not supposed to support evaluation against a FlowFile
+        processor.setTestCase(ENV_SCOPE_WITH_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is supposed to fail: there is an incoming connection, there is a
+        // FlowFile available, we have EL scope but we don't evaluate against the FF
+        processor.setTestCase(FF_SCOPE_NO_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        processor.setTestCase(ENV_SCOPE_NO_FF);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_NO_FF);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is accepted as we have an incoming connection, we may be evaluating
+        // against a map made of the flow file attributes + additional key/value pairs.
+        processor.setTestCase(FF_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_MAP);
+        runner.enqueue("");
+        assertThrows(AssertionError.class, () -> runner.run());
+    }
+
+    @Test
+    public void testELScopeValidationProcessorNoInput() {
+        final DummyProcessorNoInput processor = new DummyProcessorNoInput();
+        final TestRunner runner = TestRunners.newTestRunner(processor);
+
+        runner.setProperty(DummyProcessorNoInput.PROP_FF_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorNoInput.PROP_ENV_SCOPE, "${test}");
+        runner.setProperty(DummyProcessorNoInput.PROP_NONE_SCOPE, "${test}");
+
+        // This case is supposed to be OK: in that case, we don't care if attributes are
+        // not available even though scope is FLOWFILE_ATTRIBUTES it likely means that
+        // the property has been defined in a common/abstract class used by multiple
+        // processors with different input requirements.
+        processor.setTestCase(FF_SCOPE_NO_FF);
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_NO_FF);
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_NO_FF);
+        assertThrows(AssertionError.class, () -> runner.run());
+
+        // This case is supposed to be OK: in that case, we don't care if attributes are
+        // not available even though scope is FLOWFILE_ATTRIBUTES it likely means that
+        // the property has been defined in a common/abstract class used by multiple
+        // processors with different input requirements.
+        processor.setTestCase(FF_SCOPE_WITH_MAP);
+        runner.run();
+
+        processor.setTestCase(ENV_SCOPE_WITH_MAP);
+        runner.run();
+
+        // This case is not expected to work: no EL support on the property
+        processor.setTestCase(NONE_SCOPE_WITH_MAP);
+        assertThrows(AssertionError.class, () -> runner.run());
+    }
+
+    @InputRequirement(Requirement.INPUT_ALLOWED)
+    private static class DummyProcessorWithInput extends AbstractProcessor {
+        static final PropertyDescriptor PROP_FF_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with FF scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+        static final PropertyDescriptor PROP_ENV_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with Env scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.ENVIRONMENT)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+        static final PropertyDescriptor PROP_NONE_SCOPE = new PropertyDescriptor.Builder()
+                .name("Property with None scope")
+                .expressionLanguageSupported(ExpressionLanguageScope.NONE)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .build();
+
+        static final Relationship SUCCESS = new Relationship.Builder()
+                .name("success")
+                .build();
+
+        private static final Set<Relationship> RELATIONSHIPS = Set.of(SUCCESS);
+
+        private String testCase;
+
+        @Override
+        protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
+            final List<PropertyDescriptor> properties = new ArrayList<>();
+            properties.add(PROP_FF_SCOPE);
+            properties.add(PROP_ENV_SCOPE);
+            properties.add(PROP_NONE_SCOPE);
+            return properties;

Review Comment:
   This can be condensed using `List.of()`



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@nifi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] NIFI-14041 - Improve MockPropertyValue and EL evaluation validation [nifi]

Posted by "pvillard31 (via GitHub)" <gi...@apache.org>.
pvillard31 commented on PR #9549:
URL: https://github.com/apache/nifi/pull/9549#issuecomment-2495444856

   Thanks for reviewing @exceptionfactory - pushed a commit to address your comments


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@nifi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] NIFI-14041 - Improve MockPropertyValue and EL evaluation validation [nifi]

Posted by "exceptionfactory (via GitHub)" <gi...@apache.org>.
exceptionfactory merged PR #9549:
URL: https://github.com/apache/nifi/pull/9549


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@nifi.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org