/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.dashbuilder.displayer.client.widgets.sourcecode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class JsValidatorTest {
@Mock
JsEvaluator jsEvaluator;
DefaultJsValidator validator;
@Before
public void setUp() {
validator = new DefaultJsValidator(jsEvaluator);
}
@Test
public void testNoError() {
String error = validator.validate("var a=1; var b = 42+a; alert(b);", null);
assertNull(error);
}
@Test
public void testNotAllowed_document() {
String error = validator.validate("document.getElementById(\"\");", null);
assertNotNull(error);
}
@Test
public void testNotAllowed_window() {
String error = validator.validate("window.location=\"\"", null);
assertNotNull(error);
}
@Test
public void testNotAllowed_eval() {
String error = validator.validate("eval(\"\");", null);
assertNotNull(error);
error = validator.validate("eval\n(\"\");", null);
assertNotNull(error);
error = validator.validate("eval (\"\");", null);
assertNotNull(error);
error = validator.validate("eval\t(\"\");", null);
assertNotNull(error);
}
@Test
public void testNotAllowed_innerHtml() {
String error = validator.validate("this.innerHtml=\"\"", null);
assertNotNull(error);
}
@Test
public void testVariableReplacement() throws Exception {
String error = validator.validate("${this}.style.cursor=\"pointer\";", null);
String js = "function __alert(msg) {};\nvar __var0__ = document.createElement(\"div\");\n__var0__.style.cursor=\"pointer\";";
verify(jsEvaluator).evaluate(js);
assertNull(error);
doThrow(new Exception("error __var0__")).when(jsEvaluator).evaluate(anyString());
error = validator.validate("${this}.style.cursor=\"pointer\";", null);
assertEquals(error, "error ${this}");
}
@Test
public void testAllowedVariables() throws Exception {
List<String> vars = Arrays.asList("${this}");
String error = validator.validate("${this}.style.cursor=\"pointer\";", vars);
assertNull(error);
vars = new ArrayList<>();
error = validator.validate("${this}.style.cursor=\"pointer\";", vars);
assertNotNull(error);
}
@Test
public void testOcurrences() throws Exception {
assertEquals(validator.occurrences("", "{"), 0);
assertEquals(validator.occurrences("{", "{"), 1);
assertEquals(validator.occurrences("{", "}"), 0);
assertEquals(validator.occurrences("{}", "}"), 1);
assertEquals(validator.occurrences("{}", "{"), 1);
assertEquals(validator.occurrences("{{}}", "{"), 2);
}
@Test
public void testIsolateLines() throws Exception {
String js = "if (a) b;\nelse c;";
String isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) b;\nc;\n");
js = " ";
isolated = validator.isolateLines(js);
assertEquals(isolated.length(), 0);
js = "if (a) {\nb;\n} else c;";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) {}\nb;\n{} c;\n");
js = "if (a) {\nb; }\nelse c;";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) {}\nb; \nc;\n");
js = "if (a)\n{ b;\n} else c;";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a)\n b;\n{} c;\n");
js = "if (a) { b; } else c;";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) { b; } c;\n");
js = "if (a) { if (b) {}}";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) { if (b) {}}\n");
js = "if (a) {\nif (b) {\n}\n}";
isolated = validator.isolateLines(js);
assertEquals(isolated, "if (a) {}\nif (b) {}\n");
}
}