Skip to content

Commit 5fccef0

Browse files
add more unit tests
1 parent 3f35e72 commit 5fccef0

3 files changed

Lines changed: 67 additions & 2 deletions

File tree

plugins/iac/nimble/src/main/java/org/apache/cloudstack/tosca/model/ToscaInputDefinition.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ public ToscaInputDefinition(String name, String description, ToscaTypeDefinition
2727
this.defaultValue = defaultValue;
2828
this.validation = validation;
2929
}
30+
31+
public Object getDefaultValue() {
32+
return defaultValue;
33+
}
34+
35+
public ToscaFunction.ToscaBooleanFunction getValidation() {
36+
return validation;
37+
}
3038
}

plugins/iac/nimble/src/main/java/org/apache/cloudstack/tosca/parser/ToscaServiceTemplateParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ private ToscaProperty parsePropertyValue(String propertyName, Object propertyBod
292292
return new ToscaProperty(propertyDefinition, propertyBody, propertyBody);
293293
}
294294

295-
private Map<String, ToscaInputDefinition> parseInputs(Map<String, Object> inputs, ToscaServiceTemplateParsingContext context) {
295+
protected Map<String, ToscaInputDefinition> parseInputs(Map<String, Object> inputs, ToscaServiceTemplateParsingContext context) {
296296
Map<String, ToscaInputDefinition> inputDefinitions = new HashMap<>();
297297
for (Map.Entry<String, Object> input : inputs.entrySet()) {
298298
ToscaInputDefinition inputDefinition = parseInput(input.getKey(), ToscaYamlHelper.asMap(input.getValue()), context);
@@ -312,7 +312,7 @@ private ToscaInputDefinition parseInput(String name, Map<String, Object> body, T
312312

313313
ToscaTypeDefinition type = toscaFieldParser.parseType(body, null);
314314
if (type == null) {
315-
context.addError(String.format("The type of the input [%s] is not valid.", name), "inputs section");
315+
context.addError(String.format("The type of the input [%s] was not specified or it is not supported.", name), "inputs section");
316316
return null;
317317
}
318318

plugins/iac/nimble/src/test/java/org/apache/cloudstack/tosca/parser/ToscaServiceTemplateParserTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
package org.apache.cloudstack.tosca.parser;
1818

1919
import com.cloud.exception.InvalidParameterValueException;
20+
import org.apache.cloudstack.tosca.functions.ToscaBooleanFunctions;
21+
import org.apache.cloudstack.tosca.model.ToscaInputDefinition;
22+
import org.apache.cloudstack.tosca.model.ToscaPrimitiveType;
23+
import org.apache.cloudstack.tosca.model.ToscaTypeDefinition;
24+
import org.junit.Assert;
2025
import org.junit.Before;
2126
import org.junit.Test;
2227
import org.junit.runner.RunWith;
@@ -64,6 +69,58 @@ public void parseServiceTemplateTestThrowExceptionWhenUnknownKeysOfTheServiceTem
6469
toscaServiceTemplateParserSpy.parseServiceTemplate(content, null, null);
6570
}
6671

72+
@Test
73+
public void parseInputsTestAllInputsAreParsedSuccessfullyAndAddedToTheParsingContext() {
74+
String content = "{type: {type: string, validation: {$valid_values: [$value, [validvalue1, validvalue2]]}}, enabled: {description: Enabled input description, type: boolean, default_value: false}}";
75+
Map<String, ToscaInputDefinition> inputs = toscaServiceTemplateParserSpy.parseInputs(ToscaYamlHelper.asMap(ToscaYamlHelper.loadYaml(content)), parsingContextMock);
76+
Mockito.verify(parsingContextMock, Mockito.times(0)).addError(Mockito.anyString(), Mockito.anyString());
77+
Mockito.verify(parsingContextMock).setInputs(inputs);
78+
Assert.assertEquals(2, inputs.size());
79+
80+
Assert.assertEquals("type", inputs.get("type").getName());
81+
Assert.assertNull(inputs.get("type").getDescription());
82+
Assert.assertNull(inputs.get("type").getDefaultValue());
83+
Assert.assertEquals(ToscaPrimitiveType.STRING, inputs.get("type").getType().getPrimitiveType());
84+
Assert.assertTrue(inputs.get("type").getValidation() instanceof ToscaBooleanFunctions.ValidValues);
85+
86+
Assert.assertEquals("enabled", inputs.get("enabled").getName());
87+
Assert.assertEquals("Enabled input description", inputs.get("enabled").getDescription());
88+
Assert.assertFalse((Boolean) inputs.get("enabled").getDefaultValue());
89+
Assert.assertEquals(ToscaPrimitiveType.BOOLEAN, inputs.get("enabled").getType().getPrimitiveType());
90+
Assert.assertNull(inputs.get("enabled").getValidation());
91+
}
92+
93+
@Test
94+
public void parseInputsTestAllCorrectInputDeclarationAreParsedAndErrorsOfUnknownKeysAndMissingInputTypeAreAddedToTheParsingContext() {
95+
String content = "{type: {unknownfield: string, validation: {$valid_values: [$value, [validvalue1, validvalue2]]}}, enabled: {description: Enabled input description, type: boolean, default_value: false}}";
96+
Map<String, ToscaInputDefinition> inputs = toscaServiceTemplateParserSpy.parseInputs(ToscaYamlHelper.asMap(ToscaYamlHelper.loadYaml(content)), parsingContextMock);
97+
Mockito.verify(parsingContextMock).addError(Mockito.eq("Unknown key [unknownfield]."), Mockito.anyString());
98+
Mockito.verify(parsingContextMock).addError(Mockito.eq("The type of the input [type] was not specified or it is not supported."), Mockito.anyString());
99+
Assert.assertFalse(inputs.containsKey("type"));
100+
Assert.assertTrue(inputs.containsKey("enabled"));
101+
}
102+
103+
@Test
104+
public void parseInputsTestAllCorrectInputDeclarationAreParsedAndErrorsOfDefaultValueTypeIncompatibilityAreAddedToTheParsingContext() {
105+
String content = "{type: {type: string, validation: {$valid_values: [$value, [validvalue1, validvalue2]]}}, enabled: {description: Enabled input description, type: boolean, default_value: nonbooleanvalue}}";
106+
Map<String, ToscaInputDefinition> inputs = toscaServiceTemplateParserSpy.parseInputs(ToscaYamlHelper.asMap(ToscaYamlHelper.loadYaml(content)), parsingContextMock);
107+
108+
String expectedErrorMessage = String.format("The provided default value [nonbooleanvalue] for the input [enabled] is not compatible with the input type [%s].", ToscaTypeDefinition.ofPrimitive(ToscaPrimitiveType.BOOLEAN));
109+
Mockito.verify(parsingContextMock).addError(Mockito.eq(expectedErrorMessage), Mockito.anyString());
110+
Assert.assertTrue(inputs.containsKey("type"));
111+
Assert.assertFalse(inputs.containsKey("enabled"));
112+
}
113+
114+
@Test
115+
public void parseInputsTestAllCorrectInputDeclarationAreParsedAndErrorsOfInvalidValidationFunctionAreAddedToTheParsingContext() {
116+
String content = "{type: {type: string, validation: {$notvalidfunction: [$value, [validvalue1, validvalue2]]}}, enabled: {description: Enabled input description, type: boolean, default_value: false}}";
117+
Map<String, ToscaInputDefinition> inputs = toscaServiceTemplateParserSpy.parseInputs(ToscaYamlHelper.asMap(ToscaYamlHelper.loadYaml(content)), parsingContextMock);
118+
119+
Mockito.verify(parsingContextMock).addError(Mockito.eq("The validation function of the input [type] is not valid."), Mockito.anyString());
120+
Assert.assertFalse(inputs.containsKey("type"));
121+
Assert.assertTrue(inputs.containsKey("enabled"));
122+
}
123+
67124
@Test
68125
public void validateRequiredToscaKeysTestAddErrorToTheParsingContextWhenRequiredKeysAreMissing() {
69126
Map<String, Object> content = ToscaYamlHelper.asMap(ToscaYamlHelper.loadYaml("{not-required-key: value}"));

0 commit comments

Comments
 (0)