diff --git a/build.gradle b/build.gradle index 38970e34..029dea0e 100644 --- a/build.gradle +++ b/build.gradle @@ -48,6 +48,13 @@ dependencies { pluginLibs 'com.google.code.gson:gson:2.10.1' implementation('org.rundeck:rundeck-core:4.16.0-rc1-20230815') implementation 'org.codehaus.groovy:groovy-all:3.0.9' + + testImplementation platform("org.spockframework:spock-bom:2.0-groovy-3.0") + testImplementation "org.spockframework:spock-core" +} + +tasks.withType(Test).configureEach { + useJUnitPlatform() } task copyToLib(type: Copy) { diff --git a/src/main/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStep.java b/src/main/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStep.java index df7802cc..c2510dbb 100644 --- a/src/main/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStep.java +++ b/src/main/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStep.java @@ -81,8 +81,7 @@ public void executeNodeStep( configuration.put(AnsibleDescribable.ANSIBLE_DEBUG,"False"); } - AnsibleRunnerBuilder - builder = new AnsibleRunnerBuilder(context.getExecutionContext(), context.getFramework(), context.getNodes(), configuration); + AnsibleRunnerBuilder builder = new AnsibleRunnerBuilder(context.getExecutionContext(), context.getFramework(), context.getNodes(), configuration); try { runner = builder.buildAnsibleRunner(); @@ -96,12 +95,12 @@ public void executeNodeStep( } catch (AnsibleException e) { Map failureData = new HashMap<>(); failureData.put("message",e.getMessage()); - failureData.put("ansible-config", builder.getConfigFile()); + failureData.put("ansible-config", configuration); throw new NodeStepException(e.getMessage(), e, e.getFailureReason(), failureData, e.getMessage()); } catch (Exception e) { Map failureData = new HashMap<>(); failureData.put("message",e.getMessage()); - failureData.put("ansible-config", builder.getConfigFile()); + failureData.put("ansible-config", configuration); throw new NodeStepException(e.getMessage(),e, AnsibleException.AnsibleFailureReason.AnsibleError, failureData, e.getMessage()); } diff --git a/src/test/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStepSpec.groovy b/src/test/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStepSpec.groovy new file mode 100644 index 00000000..8d06b1dc --- /dev/null +++ b/src/test/groovy/com/rundeck/plugins/ansible/plugin/AnsiblePlaybookInlineWorkflowNodeStepSpec.groovy @@ -0,0 +1,47 @@ +package com.rundeck.plugins.ansible.plugin + +import com.dtolabs.rundeck.core.common.Framework +import com.dtolabs.rundeck.core.common.INodeEntry +import com.dtolabs.rundeck.core.common.INodeSet +import com.dtolabs.rundeck.core.execution.ExecutionContext +import com.dtolabs.rundeck.core.execution.workflow.steps.node.NodeStepException +import com.dtolabs.rundeck.plugins.step.NodeStepPlugin +import com.dtolabs.rundeck.plugins.step.PluginStepContext +import org.junit.jupiter.api.Assertions +import spock.lang.Specification + + +class AnsiblePlaybookInlineWorkflowNodeStepSpec extends Specification{ + + void "failure data should not include null values when throwing"(){ + given: + NodeStepPlugin plugin = new AnsiblePlaybookInlineWorkflowNodeStep() + INodeEntry node = Mock(INodeEntry){ + getNodename() >> 'localhost' + } + + PluginStepContext context = Mock(PluginStepContext){ + getDataContext() >> ['job': ['loglevel':'INFO']] + getExecutionContext() >> Mock(ExecutionContext){ + getDataContext() >> [:] + } + getFramework() >> Mock(Framework) + getNodes() >> Mock(INodeSet){ + getNodes() >> [] + } + } + + Map configuration = [ + 'ansible-playbook' : 'path/to/playbook' + ] + + when: + plugin.executeNodeStep(context, configuration, node) + + then: + NodeStepException e = thrown(NodeStepException) + e.getFailureData().each { String key, Object value -> + Assertions.assertNotNull(value, "Value for key ${key} should not be null") + } + } +}