/**
* Copyright (C) 2012 Christian Brandenstein
*
* 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.
*/
package de.adorsys.beanstest.plugin;
import java.io.FileNotFoundException;
import java.util.List;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import org.jboss.forge.parser.JavaParser;
import org.jboss.forge.parser.java.JavaClass;
import org.jboss.forge.project.Project;
import org.jboss.forge.project.dependencies.Dependency;
import org.jboss.forge.project.facets.DependencyFacet;
import org.jboss.forge.project.facets.JavaSourceFacet;
import org.jboss.forge.project.facets.events.InstallFacets;
import org.jboss.forge.resources.DirectoryResource;
import org.jboss.forge.resources.java.JavaResource;
import org.jboss.forge.shell.Shell;
import org.jboss.forge.shell.ShellMessages;
import org.jboss.forge.shell.ShellPrompt;
import org.jboss.forge.shell.events.PickupResource;
import org.jboss.forge.shell.plugins.Alias;
import org.jboss.forge.shell.plugins.Command;
import org.jboss.forge.shell.plugins.Option;
import org.jboss.forge.shell.plugins.PipeIn;
import org.jboss.forge.shell.plugins.PipeOut;
import org.jboss.forge.shell.plugins.Plugin;
import org.jboss.forge.shell.plugins.RequiresFacet;
import org.jboss.forge.shell.plugins.SetupCommand;
import org.junit.runner.RunWith;
import de.adorsys.beanstest.plugin.facet.CDITestFacet;
import de.adorsys.beanstest.plugin.facet.MockitoFacet;
import de.adorsys.beanstest.plugin.facet.PersistenceTestFacet;
/**
* CDI test plugin
*
* Enables a project to use Weld SE for junit testing
*/
@Alias("beanstest")
@RequiresFacet({ CDITestFacet.class, JavaSourceFacet.class })
public class BeanstestPlugin implements Plugin {
@Inject
private ShellPrompt prompt;
@Inject
private Shell shell;
@Inject
private Project project;
@Inject
private Event<InstallFacets> installFaEvent;
@Inject
private BeanstestConfiguration configuration;
@Inject
private Event<PickupResource> pickup;
@SetupCommand
public void setup(PipeOut out) throws Exception {
if (!project.hasFacet(CDITestFacet.class)) {
// ask for weld se version
DependencyFacet dependencyFacet = project.getFacet(DependencyFacet.class);
List<Dependency> versions = dependencyFacet.resolveAvailableVersions("org.jboss.weld.se:weld-se:[1.1.2.Final,):test");
Dependency dependency = shell.promptChoiceTyped("Select version: ", versions, CDITestFacet.WELDSEDEFAULT);
configuration.setWeldseDependency(dependency);
installFaEvent.fire(new InstallFacets(CDITestFacet.class));
} else {
ShellMessages.info(out, "is installed");
}
}
@Command("mock-scopes")
public void hideMissingScopes() {
CDITestFacet cditest = project.getFacet(CDITestFacet.class);
cditest.mockMissingScopes();
}
@Command("new-test")
public void newTest(@Option(required = true, name = "type", shortName = "t") final JavaResource type, PipeOut out) throws FileNotFoundException {
JavaSourceFacet java = project.getFacet(JavaSourceFacet.class);
DirectoryResource testSrcFolder = java.getTestSourceFolder();
// JavaResource always maps to main folder, see JavaPathspecParser
String className = java.calculateName(type);
String packageName = java.calculatePackage(type);
String path = (packageName + "." + className).replaceAll("\\.", "/") + ".java";
JavaResource javaTestResource = testSrcFolder.getChildOfType(JavaResource.class, path);
if (!javaTestResource.exists()) {
if (javaTestResource.createNewFile()) {
JavaClass javaTestClass = JavaParser.create(JavaClass.class);
javaTestClass.setName(java.calculateName(javaTestResource));
javaTestClass.setPackage(java.calculatePackage(javaTestResource));
// SimpleRunner import
JavaResource simpleRunnerResource = java.getTestJavaResource(java.getBasePackage() + BeanstestConfiguration.PACKAGESUFFIX + ".SimpleRunner.java");
if (simpleRunnerResource != null && simpleRunnerResource.exists()) {
javaTestClass.addImport(simpleRunnerResource.getJavaSource());
} else {
throw new RuntimeException("SimpleRunner does not exist: [" + simpleRunnerResource + "]");
}
javaTestClass.addImport(RunWith.class);
javaTestClass.addAnnotation(RunWith.class).setLiteralValue("SimpleRunner.class");
javaTestResource.setContents(javaTestClass);
pickup.fire(new PickupResource(javaTestResource)); //TODO picked up resource writes to main folder :(
} else {
ShellMessages.error(out, "Cannot create test [" + javaTestResource.getFullyQualifiedName() + "]");
}
} else {
ShellMessages.error(out, "Test already exists [" + javaTestResource.getFullyQualifiedName() + "]");
}
}
@Command("new-mockito")
public void newMockito(@PipeIn String in, PipeOut out, @Option(required = false, name = "stereotype", shortName = "s") final String stereotype,
@Option(required = true, name = "type", shortName = "t") final JavaResource type) throws FileNotFoundException {
if (!project.hasFacet(MockitoFacet.class)) {
installFaEvent.fire(new InstallFacets(MockitoFacet.class));
}
MockitoFacet mockito = project.getFacet(MockitoFacet.class);
mockito.createMockProducer(type, stereotype, out);
}
@Command("test-persistence")
public void setupTestPersistence() throws FileNotFoundException {
if (!project.hasFacet(PersistenceTestFacet.class)) {
installFaEvent.fire(new InstallFacets(PersistenceTestFacet.class));
}
}
}