blob: 7195424a1a2b6c6fb55c6bab26e6c458dc4fb215 [file] [log] [blame]
// 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.cloudstack.jsinterpreter;
import com.fasterxml.jackson.databind.JsonNode;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@RunWith(MockitoJUnitRunner.class)
public class JsInterpreterHelperTest {
@Spy
private JsInterpreterHelper jsInterpreterHelperSpy;
@Mock
private JsonNode jsonNodeMock;
@Mock
private Iterator<String> fieldNamesMock;
@Mock
private Map.Entry<String, JsonNode> fields;
public void setupIterateOverJsonTreeTests() {
JsonNode node = Map.entry("array", jsonNodeMock).getValue();
Mockito.doReturn(true).when(node).isArray();
Mockito.doReturn(node).when(fields).getValue();
}
@Test
public void getScriptVariablesTestReturnVariables() {
String script = "if (account.name == 'test') { domain.id } else { zone.id }";
Set<String> variables = jsInterpreterHelperSpy.getScriptVariables(script);
Assert.assertEquals(variables.size(), 3);
Assert.assertTrue(variables.containsAll(List.of("account.name", "domain.id", "zone.id")));
}
@Test
public void getScriptVariablesTestScriptWithoutVariablesReturnEmptyList() {
String script = "if (4 < 2) { 3 } else if (3 != 3) { 3 } else { 3 > 3 } while (false) { 3 }";
Set<String> variables = jsInterpreterHelperSpy.getScriptVariables(script);
Assert.assertTrue(variables.isEmpty());
}
@Test
public void replaceScriptVariablesTestReturnScriptWithVariablesReplaced() {
String script = "if (account.name == 'test') { domain.id } else { zone.id }";
Map<String, String> newVariables = new HashMap<>();
newVariables.put("account.name", "accountname");
newVariables.put("domain.id", "domainid");
newVariables.put("zone.id", "zoneid");
String newScript = jsInterpreterHelperSpy.replaceScriptVariables(script, newVariables);
Assert.assertEquals("if (accountname == 'test') { domainid } else { zoneid }", newScript);
}
@Test
public void searchIntoObjectNodesTestNullNodeReturnNull() {
String fieldName = jsInterpreterHelperSpy.searchIntoObjectNodes(null);
Assert.assertEquals(null, fieldName);
}
@Test
public void searchIntoObjectNodesTestNonEmptyFieldNamesReturnFieldName() {
Mockito.doReturn(true, false).when(fieldNamesMock).hasNext();
Mockito.doReturn("fieldName").when(fieldNamesMock).next();
Mockito.doReturn(jsonNodeMock).when(jsonNodeMock).get("fieldName");
Mockito.doNothing().when(jsInterpreterHelperSpy).iterateOverJsonTree((Iterator<Map.Entry<String, JsonNode>>) Mockito.any());
Mockito.doReturn(fieldNamesMock).when(jsonNodeMock).fieldNames();
String fieldName = jsInterpreterHelperSpy.searchIntoObjectNodes(jsonNodeMock);
Assert.assertEquals("fieldName", fieldName);
}
@Test
public void searchIntoObjectNodesTestNameFieldAppendFieldValueToVariable() {
Mockito.doReturn(true, false).when(fieldNamesMock).hasNext();
Mockito.doReturn("name").when(fieldNamesMock).next();
Mockito.doReturn(jsonNodeMock).when(jsonNodeMock).get("name");
Mockito.doNothing().when(jsInterpreterHelperSpy).iterateOverJsonTree((Iterator<Map.Entry<String, JsonNode>>) Mockito.any());
Mockito.doReturn(fieldNamesMock).when(jsonNodeMock).fieldNames();
jsInterpreterHelperSpy.searchIntoObjectNodes(jsonNodeMock);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).appendFieldValueToVariable(Mockito.any(), Mockito.any());
}
@Test
public void searchIntoObjectNodesTestPropertyFieldAppendFieldValueToVariable() {
Mockito.doReturn(true, false).when(fieldNamesMock).hasNext();
Mockito.doReturn("property").when(fieldNamesMock).next();
Mockito.doReturn(jsonNodeMock).when(jsonNodeMock).get("property");
Mockito.doNothing().when(jsInterpreterHelperSpy).iterateOverJsonTree((Iterator<Map.Entry<String, JsonNode>>) Mockito.any());
Mockito.doReturn(fieldNamesMock).when(jsonNodeMock).fieldNames();
jsInterpreterHelperSpy.searchIntoObjectNodes(jsonNodeMock);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).appendFieldValueToVariable(Mockito.any(), Mockito.any());
}
@Test
public void appendFieldValueToVariableTestPropertyKeyAppendFieldValueAsAttribute() {
jsInterpreterHelperSpy.setVariable(new StringBuilder("account"));
jsInterpreterHelperSpy.setVariables(new HashSet<>());
Mockito.doReturn("name").when(jsonNodeMock).textValue();
jsInterpreterHelperSpy.appendFieldValueToVariable("property", jsonNodeMock);
Assert.assertEquals("account.name", jsInterpreterHelperSpy.getVariable().toString());
}
@Test
public void appendFieldValueToVariableTestNameKeyAppendFieldValueAsNewVariable() {
jsInterpreterHelperSpy.setVariable(new StringBuilder("account"));
jsInterpreterHelperSpy.setVariables(new HashSet<>());
Mockito.doReturn("zone").when(jsonNodeMock).textValue();
jsInterpreterHelperSpy.appendFieldValueToVariable("name", jsonNodeMock);
Assert.assertEquals("zone", jsInterpreterHelperSpy.getVariable().toString());
}
@Test
public void iterateOverJsonTreeTestMethodsCall() {
setupIterateOverJsonTreeTests();
jsInterpreterHelperSpy.iterateOverJsonTree(fields);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).iterateOverArrayNodes(Mockito.any());
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).searchIntoObjectNodes(Mockito.any());
}
@Test
public void iterateOverJsonTreeTestFieldNameNullAndNameKeyAppendFieldValueToVariable() {
setupIterateOverJsonTreeTests();
Mockito.doReturn("name").when(fields).getKey();
Mockito.doNothing().when(jsInterpreterHelperSpy).appendFieldValueToVariable(Mockito.any(), Mockito.any());
jsInterpreterHelperSpy.iterateOverJsonTree(fields);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).appendFieldValueToVariable(Mockito.any(), Mockito.any());
}
@Test
public void iterateOverJsonTreeTestFieldNameNullAndNamePropertyAppendFieldValueToVariable() {
setupIterateOverJsonTreeTests();
Mockito.doReturn("property").when(fields).getKey();
Mockito.doNothing().when(jsInterpreterHelperSpy).appendFieldValueToVariable(Mockito.any(), Mockito.any());
jsInterpreterHelperSpy.iterateOverJsonTree(fields);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(1)).appendFieldValueToVariable(Mockito.any(), Mockito.any());
}
@Test
public void iterateOverArrayNodesTestThreeSizeArrayCallIterateOverJsonTreeThreeTimes() {
Map<String, JsonNode> fields = new HashMap<>();
fields.put("field", jsonNodeMock);
JsonNode root = Mockito.mock(JsonNode.class);
JsonNode node1 = Mockito.mock(JsonNode.class);
JsonNode node2 = Mockito.mock(JsonNode.class);
JsonNode node3 = Mockito.mock(JsonNode.class);
Mockito.doReturn(fields.entrySet().iterator()).when(node1).fields();
Mockito.doReturn(fields.entrySet().iterator()).when(node2).fields();
Mockito.doReturn(fields.entrySet().iterator()).when(node3).fields();
Map<String, JsonNode> childrenMap = new HashMap<>();
childrenMap.put("node1", node1);
childrenMap.put("node2", node2);
childrenMap.put("node3", node3);
Map.Entry<String, JsonNode> rootEntry = Map.entry("rootNode", root);
Mockito.doReturn(node1).when(rootEntry.getValue()).get(0);
Mockito.doReturn(node2).when(rootEntry.getValue()).get(1);
Mockito.doReturn(node3).when(rootEntry.getValue()).get(2);
Mockito.doNothing().when(jsInterpreterHelperSpy).iterateOverJsonTree((Iterator<Map.Entry<String, JsonNode>>) Mockito.any());
jsInterpreterHelperSpy.iterateOverArrayNodes(rootEntry);
Mockito.verify(jsInterpreterHelperSpy, Mockito.times(3)).iterateOverJsonTree((Iterator<Map.Entry<String, JsonNode>>) Mockito.any());
}
@Test
public void removeCallFunctionsFromVariableTestTwoCallExpressionsRemoveTwoLastProperties() {
jsInterpreterHelperSpy.setCallExpressions(2);
jsInterpreterHelperSpy.setVariable(new StringBuilder("value.osName.toLowerCase().indexOf('windows')"));
jsInterpreterHelperSpy.removeCallFunctionsFromVariable();
Assert.assertEquals("value.osName", jsInterpreterHelperSpy.getVariable().toString());
}
}