/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2015 Wisdom Framework
* %%
* Licensed 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.
* #L%
*/
package org.wisdom.source.ast.visitor;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseException;
import com.github.javaparser.ast.CompilationUnit;
import com.google.common.collect.Iterables;
import org.junit.Test;
import org.wisdom.api.http.FileItem;
import org.wisdom.source.ast.model.ControllerModel;
import org.wisdom.source.ast.model.ControllerRouteModel;
import org.wisdom.source.ast.model.RouteParamModel;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Check the model computed by {@link ControllerSourceVisitor}
*/
public class ControllerSourceVisitorTest {
ControllerSourceVisitor visitor = new ControllerSourceVisitor();
@Test
public void testHttpVerbs() throws IOException, ParseException {
File file = new File("src/test/java/controller/SimpleController.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
final Collection<ControllerRouteModel> routes = (Collection<ControllerRouteModel>) model.getRoutes().get("/simple");
assertThat(routes).isNotNull();
assertThat(routes).hasSize(6);
for (ControllerRouteModel route : routes) {
assertThat(route.getHttpMethod().name()).isEqualToIgnoringCase(route.getMethodName());
assertThat(route.getParams()).isEmpty();
assertThat(route.getPath()).isEqualToIgnoringCase("/simple");
}
}
@Test
public void testEmptyController() throws IOException, ParseException {
File file = new File("src/test/java/controller/EmptyController.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
assertThat(model.getRoutes()).isEmpty();
}
@Test
public void testParameters() throws IOException, ParseException {
File file = new File("src/test/java/controller/ParameterizedController.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model, "/params/1");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
RouteParamModel param = (RouteParamModel) Iterables.get(route.getParams(), 0);
assertThat(param.getName()).isEqualTo("hello");
assertThat(param.getParamType()).isEqualTo(RouteParamModel.ParamType.FORM);
assertThat(param.getDefaultValue()).isNull();
assertThat(param.getValueType()).isEqualTo(String.class.getSimpleName());
route = getModelByPath(model, "/params/2/{hello}");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
param = (RouteParamModel) Iterables.get(route.getParams(), 0);
assertThat(param.getName()).isEqualTo("hello");
assertThat(param.getParamType()).isEqualTo(RouteParamModel.ParamType.PATH_PARAM);
assertThat(param.getDefaultValue()).isNull();
assertThat(param.getValueType()).isEqualTo(String.class.getSimpleName());
route = getModelByPath(model, "/params/3/{hello}");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(2);
param = getParamByName(route.getParams(), "hello");
assertThat(param.getParamType()).isEqualTo(RouteParamModel.ParamType.PATH_PARAM);
assertThat(param.getDefaultValue()).isNull();
assertThat(param.getValueType()).isEqualTo(String.class.getSimpleName());
param = getParamByName(route.getParams(), "name");
assertThat(param.getParamType()).isEqualTo(RouteParamModel.ParamType.FORM);
assertThat(param.getDefaultValue()).isEqualTo("wisdom");
assertThat(param.getValueType()).isEqualTo(String.class.getSimpleName());
}
@Test
public void testNotNullContraints() throws IOException, ParseException{
File file = new File("src/test/java/controller/ControllerWithConstraints.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model,"/superman");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
RouteParamModel param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with NotNull constraints
assertThat(param.getName()).isEqualTo("clark");
assertThat(param.isMandatory()).isTrue();
route = getModelByPath(model,"/batman");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with NotNull constraints that contains a message
assertThat(param.getName()).isEqualTo("bruce");
assertThat(param.isMandatory()).isTrue();
}
@Test
public void testMinContraints() throws IOException, ParseException{
File file = new File("src/test/java/controller/ControllerWithConstraints.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model,"/spiderman");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
RouteParamModel param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with Min constraint
assertThat(param.getName()).isEqualTo("peter");
assertThat(param.getMin()).isEqualTo(1962);
route = getModelByPath(model,"/chameleon");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with Min constraints that contains a message
assertThat(param.getName()).isEqualTo("dmitri");
assertThat(param.getMin()).isEqualTo(1963);
}
@Test
public void testMaxContraints() throws IOException, ParseException{
File file = new File("src/test/java/controller/ControllerWithConstraints.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model,"/rahan");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
RouteParamModel param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with Max constraint
assertThat(param.getName()).isEqualTo("son");
assertThat(param.getMax()).isEqualTo(2010);
route = getModelByPath(model,"/crao");
assertThat(route).isNotNull();
assertThat(route.getParams()).hasSize(1);
param = (RouteParamModel) Iterables.get(route.getParams(), 0);
//Annotated with Max constraints that contains a message
assertThat(param.getName()).isEqualTo("father");
assertThat(param.getMax()).isEqualTo(2010);
}
@Test
public void testBody() throws IOException, ParseException {
File file = new File("src/test/java/controller/ParameterizedController.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model, "/params/4");
assertThat(route.getParams()).hasSize(1);
final RouteParamModel o = (RouteParamModel) Iterables.get(route.getParams(), 0);
assertThat(o.getParamType()).isEqualTo(RouteParamModel.ParamType.BODY);
assertThat(o.getName()).isEqualTo("body"); // Special value.
assertThat(o.getValueType()).isEqualTo(String.class.getSimpleName());
}
@Test
public void testFileItem() throws IOException, ParseException {
File file = new File("src/test/java/controller/ParameterizedController.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
ControllerRouteModel route = getModelByPath(model, "/params/5");
assertThat(route.getParams()).hasSize(1);
final RouteParamModel o = (RouteParamModel) Iterables.get(route.getParams(), 0);
assertThat(o.getParamType()).isEqualTo(RouteParamModel.ParamType.FORM);
assertThat(o.getName()).isEqualTo("file");
assertThat(o.getValueType()).isEqualTo(FileItem.class.getSimpleName());
}
@Test
public void testControllerUsingPath() throws IOException, ParseException {
File file = new File("src/test/java/controller/ControllerWithPath.java");
final CompilationUnit declaration = JavaParser.parse(file);
ControllerModel model = new ControllerModel();
visitor.visit(declaration, model);
System.out.println(model.getRoutesAsMultiMap());
ControllerRouteModel route = getModelByFullPath(model, "/root/simple");
assertThat(route).isNotNull();
route = getModelByFullPath(model, "/root/");
assertThat(route).isNotNull();
route = getModelByFullPath(model, "/root");
assertThat(route).isNotNull();
route = getModelByFullPath(model, "/rootstuff");
assertThat(route).isNotNull();
}
private ControllerRouteModel getModelByPath(ControllerModel model, String name) {
for (ControllerRouteModel route : (Collection<ControllerRouteModel>) model.getRoutesAsMultiMap().values()) {
if (route.getPath().equals(name)) {
return route;
}
}
return null;
}
private ControllerRouteModel getModelByFullPath(ControllerModel model, String name) {
final Collection<ControllerRouteModel> collection = model.getRoutesAsMultiMap().get(name);
if (collection.isEmpty()) {
return null;
}
return Iterables.get(collection, 0);
}
private RouteParamModel getParamByName(Collection<RouteParamModel> set, String name) {
for (RouteParamModel model : set) {
if (model.getName().equalsIgnoreCase(name)) {
return model;
}
}
return null;
}
// PArameter
// Body
// Path
// No uri
// no / in uri
// regex in path
}