/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.forge2.ui.bot.wizard.test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import org.jboss.reddeer.eclipse.core.resources.Project;
import org.jboss.reddeer.eclipse.core.resources.ProjectItem;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.ui.views.contentoutline.OutlineView;
import org.jboss.reddeer.swt.api.TreeItem;
import org.jboss.tools.forge.ui.bot.test.util.ScaffoldType;
import org.junit.Before;
import org.junit.Test;
/**
* Class for testing scaffold generation from entities
*
* @author Jan Richter
*
*/
public class ScaffoldWizardTest extends WizardTestBase {
private static final String[] ENTITY_NAMES = { "Customer", "Product", "Order" };
private Project project;
@Before
public void prepare() {
newProject(PROJECT_NAME);
project = new ProjectExplorer().getProject(PROJECT_NAME);
persistenceSetup(PROJECT_NAME);
newEntity(ENTITY_NAMES[0]);
newEntity(ENTITY_NAMES[1]);
newEntity(ENTITY_NAMES[2]);
}
/**
* Test scaffold generation for JSF
*/
@Test
public void testCreateFacesScaffold() {
ScaffoldType facesType = ScaffoldType.FACES;
setupScaffold(facesType);
createScaffold(facesType);
checkGeneratedFiles(facesType);
}
/**
* Test scaffold generation for AngularJS
*/
@Test
public void testCreateAngularJSScaffold() {
ScaffoldType angular = ScaffoldType.ANGULARJS;
setupScaffold(angular);
createScaffold(angular);
checkGeneratedFiles(angular);
}
private void checkGeneratedFiles(ScaffoldType type) {
project.refresh();
ProjectItem model = project.getProjectItem("Java Resources", "src/main/java", GROUPID + ".model");
for (String name : ENTITY_NAMES) {
assertTrue("No class for entity " + name, model.containsItem(name + ".java"));
checkWebResources(name, type);
if (type == ScaffoldType.FACES) {
checkViewClass(name);
}
}
}
private void checkWebResources(String entityName, ScaffoldType type) {
ProjectItem webapp = project.getProjectItem("src", "main", "webapp");
if (type == ScaffoldType.FACES) {
ProjectItem entityFolder = webapp
.getChild(Character.toLowerCase(entityName.charAt(0)) + entityName.substring(1));
String[] fileNames = { "create.xhtml", "search.xhtml", "view.xhtml" };
assertNotNull(entityFolder);
for (String fileName : fileNames) {
assertTrue("File " + fileName + " missing for entity " + entityName,
entityFolder.containsItem(fileName));
}
} else if (type == ScaffoldType.ANGULARJS) {
ProjectItem scriptsFolder = webapp.getChild("scripts");
assertNotNull("Missing webapp/scripts folder", scriptsFolder);
ProjectItem controllers = scriptsFolder.getChild("controllers");
assertNotNull("Missing webapp/scripts/controllers folder", controllers);
ProjectItem services = scriptsFolder.getChild("services");
assertNotNull("Missing webapp/scripts/services folder", services);
String cont = "Controller.js";
assertTrue("Missing edit controller for entity " + entityName,
controllers.containsItem("edit" + entityName + cont));
assertTrue("Missing new controller for entity " + entityName,
controllers.containsItem("new" + entityName + cont));
assertTrue("Missing search controller for entity " + entityName,
controllers.containsItem("search" + entityName + cont));
assertTrue("Missing factory service for entuty " + entityName,
services.containsItem(entityName + "Factory.js"));
}
}
private void checkViewClass(String entityName) {
ProjectItem javaResources = project.getProjectItem("Java Resources", "src/main/java");
ProjectItem view = null;
for (ProjectItem item : javaResources.getChildren()) {
if (item.getName().endsWith(".view")) {
view = item;
break;
}
}
assertNotNull("Missing view package", view);
assertTrue("No bean for entity" + entityName, view.containsItem(entityName + "Bean.java"));
view.getChild(entityName + "Bean.java").open();
OutlineView outline = new OutlineView();
outline.open();
TreeItem beanItem = null;
Collection<TreeItem> items = outline.outlineElements();
for (TreeItem item : items) {
if (item.getText().equals(entityName + "Bean")) {
beanItem = item;
}
}
// check id
assertNotNull(beanItem.getItem("id : Long"));
assertNotNull(beanItem.getItem("getId() : Long"));
assertNotNull(beanItem.getItem("setId(Long) : void"));
// check the entity field
String entityFieldName = Character.toLowerCase(entityName.charAt(0)) + entityName.substring(1);
assertNotNull(beanItem.getItem(entityFieldName + " : " + entityName));
assertNotNull(beanItem.getItem("get" + entityName + "() : " + entityName));
assertNotNull(beanItem.getItem("set" + entityName + "(" + entityName + ")" + " : void"));
// check CRUD operations
assertNotNull(beanItem.getItem("create() : String"));
assertNotNull(beanItem.getItem("retrieve() : void"));
assertNotNull(beanItem.getItem("findById(Long) : " + entityName));
assertNotNull(beanItem.getItem("update() : String"));
assertNotNull(beanItem.getItem("delete() : String"));
assertNotNull(beanItem.getItem("getAll() : List<" + entityName + ">"));
}
private void newEntity(String name) {
newJPAEntity(PROJECT_NAME, name, "", GROUPID + ".model");
}
}