package org.springframework.roo.project;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.roo.support.util.XmlUtils.stringToElement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Unit test of the {@link Plugin} class
*
* @author Andrew Swan
* @since 1.2.0
*/
public class PluginTest extends XmlTestCase {
private static final String DEPENDENCY_ARTIFACT_ID = "huge-thing";
private static final String DEPENDENCY_GROUP_ID = "com.acme";
private static final String DEPENDENCY_VERSION = "1.1";
private static final String DEPENDENCY_XML = " <dependency>\n"
+ " <groupId>" + DEPENDENCY_GROUP_ID + "</groupId>\n"
+ " <artifactId>" + DEPENDENCY_ARTIFACT_ID
+ "</artifactId>\n" + " <version>" + DEPENDENCY_VERSION
+ "</version>\n" + " </dependency>\n";
private static final String EXECUTION_CONFIGURATION_XML = " <configuration>\n"
+ " <sources>\n"
+ " <source>src/main/groovy</source>\n"
+ " </sources>\n" + " </configuration>\n";
private static final String EXECUTION_GOAL = "add-tests";
private static final String EXECUTION_ID = "build-it";
private static final String EXECUTION_PHASE = "test";
private static final String EXECUTION_XML = " <execution>\n"
+ " <id>" + EXECUTION_ID + "</id>\n"
+ " <phase>" + EXECUTION_PHASE + "</phase>\n"
+ " <goals>\n" + " <goal>"
+ EXECUTION_GOAL + "</goal>\n" + " </goals>\n"
+ EXECUTION_CONFIGURATION_XML + " </execution>\n";
private static final List<Dependency> NO_DEPENDENCIES = Collections
.emptyList();
private static final List<Execution> NO_EXECUTIONS = Collections
.emptyList();
private static final String PLUGIN_ARTIFACT_ID = "bar";
private static final String PLUGIN_CONFIGURATION_XML = " <configuration>\n"
+ " <targets>\n"
+ " <target>classes</target>\n"
+ " </targets>\n" + " </configuration>\n";
private static final String PLUGIN_GROUP_ID = "com.foo";
private static final String PLUGIN_VERSION = "1.2.3";
private static final String PLUGIN_XML_AV = "<plugin>"
+ "<artifactId>foo-plugin</artifactId>" + "<version>1.6</version>"
+ "</plugin>";
private static final String PLUGIN_XML_GAV = "<plugin>"
+ "<groupId>org.codehaus.mojo</groupId>"
+ "<artifactId>build-helper-maven-plugin</artifactId>"
+ "<version>1.5</version>" + "</plugin>";
private static final String PLUGIN_XML_WITH_DEPENDENCY = "<plugin>"
+ "<groupId>com.example</groupId>"
+ "<artifactId>ball-of-mud</artifactId>" + "<version>1.4</version>"
+ "<dependencies>" + "<dependency>" + "<groupId>"
+ DEPENDENCY_GROUP_ID + "</groupId>" + "<artifactId>"
+ DEPENDENCY_ARTIFACT_ID + "</artifactId>" + "<version>"
+ DEPENDENCY_VERSION + "</version>" + "</dependency>"
+ "</dependencies>" + "</plugin>";
private static final String PLUGIN_XML_WITH_EXECUTION = "<plugin>"
+ "<groupId>tv.reality</groupId>"
+ "<artifactId>view-plugin</artifactId>" + "<version>2.5</version>"
+ "<executions>" + "<execution>" + "<id>" + EXECUTION_ID + "</id>"
+ "<phase>" + EXECUTION_PHASE + "</phase>" + "<goals>" + "<goal>"
+ EXECUTION_GOAL + "</goal>" + "</goals>"
+ EXECUTION_CONFIGURATION_XML + "</execution>" + "</executions>"
+ "</plugin>";
private static final String MAXIMAL_PLUGIN_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<plugin>\n"
+ " <groupId>"
+ PLUGIN_GROUP_ID
+ "</groupId>\n"
+ " <artifactId>"
+ PLUGIN_ARTIFACT_ID
+ "</artifactId>\n"
+ " <version>"
+ PLUGIN_VERSION
+ "</version>\n"
+ PLUGIN_CONFIGURATION_XML
+ " <executions>\n"
+ EXECUTION_XML
+ " </executions>\n"
+ " <dependencies>\n"
+ DEPENDENCY_XML
+ " </dependencies>\n" + "</plugin>";
private static final String MININAL_PLUGIN_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<plugin>\n"
+ " <groupId>"
+ PLUGIN_GROUP_ID
+ "</groupId>\n"
+ " <artifactId>"
+ PLUGIN_ARTIFACT_ID
+ "</artifactId>\n"
+ " <version>" + PLUGIN_VERSION + "</version>\n" + "</plugin>";
/**
* Asserts that the given plugin returns the expected XML for its POM
* element
*
* @param plugin the plugin for which to check the XML (required)
* @param document the document in which to create the element (required)
* @param expectedXml the expected XML element; can be blank
*/
private void assertElement(final Plugin plugin, final Document document,
final String expectedXml) {
// Invoke
final Element element = plugin.getElement(document);
// Check
assertXmlEquals(expectedXml, element);
}
/**
* Asserts that the given {@link Plugin} has the given expected values
*
* @param groupId
* @param artifactId
* @param version
* @param configuration
* @param dependencies
* @param executions
* @param actual
*/
private void assertPluginEquals(final String groupId,
final String artifactId, final String version,
final Configuration configuration,
final List<Dependency> dependencies,
final List<Execution> executions, final Plugin actual) {
assertEquals(artifactId, actual.getArtifactId());
assertEquals(configuration, actual.getConfiguration());
assertEquals(dependencies, actual.getDependencies());
assertEquals(executions, actual.getExecutions());
assertEquals(groupId, actual.getGroupId());
assertEquals(groupId + ":" + artifactId + ":" + version,
actual.getSimpleDescription());
assertEquals(version, actual.getVersion());
}
/**
* Asserts that constructing a {@link Plugin} from the given XML gives rise
* to the given properties
*
* @param xml the XML from which to construct the {@link Plugin}
* @param expectedGroupId
* @param expectedArtifactId
* @param expectedVersion
* @param expectedConfiguration
* @param expectedDependencies
* @param expectedExecutions
* @throws Exception
*/
private void assertPluginFromXml(final String xml,
final String expectedGroupId, final String expectedArtifactId,
final String expectedVersion,
final Configuration expectedConfiguration,
final List<Dependency> expectedDependencies,
final List<Execution> expectedExecutions) {
// Set up
final Element pluginElement = stringToElement(xml);
// Invoke
final Plugin plugin = new Plugin(pluginElement);
// Check
assertPluginEquals(expectedGroupId, expectedArtifactId,
expectedVersion, expectedConfiguration, expectedDependencies,
expectedExecutions, plugin);
}
@Test
public void testFullConstructor() {
// Set up
final Configuration mockConfiguration = mock(Configuration.class);
final List<Dependency> mockDependencies = Arrays.asList(
mock(Dependency.class), mock(Dependency.class));
final List<Execution> mockExecutions = Arrays.asList(
mock(Execution.class), mock(Execution.class));
// Invoke
final Plugin plugin = new Plugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID,
PLUGIN_VERSION, mockConfiguration, mockDependencies,
mockExecutions);
// Check
assertPluginEquals(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID, PLUGIN_VERSION,
mockConfiguration, mockDependencies, mockExecutions, plugin);
}
@Test
public void testGetElementForMaximalPlugin() throws Exception {
// Set up
final Configuration mockPluginConfiguration = mock(Configuration.class);
when(mockPluginConfiguration.getConfiguration()).thenReturn(
stringToElement(PLUGIN_CONFIGURATION_XML));
final Document document = DOCUMENT_BUILDER.newDocument();
final Dependency mockDependency = mock(Dependency.class);
final Element dependencyElement = (Element) document.importNode(
stringToElement(DEPENDENCY_XML), true);
when(mockDependency.getElement(document)).thenReturn(dependencyElement);
final Execution mockExecution = mock(Execution.class);
final Element executionElement = (Element) document.importNode(
stringToElement(EXECUTION_XML), true);
when(mockExecution.getElement(document)).thenReturn(executionElement);
final Plugin plugin = new Plugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID,
PLUGIN_VERSION, mockPluginConfiguration,
Arrays.asList(mockDependency), Arrays.asList(mockExecution));
// Invoke and check
assertElement(plugin, document, MAXIMAL_PLUGIN_XML);
}
@Test
public void testGetElementForMinimalPlugin() {
assertElement(new Plugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID,
PLUGIN_VERSION), DOCUMENT_BUILDER.newDocument(),
MININAL_PLUGIN_XML);
}
@Test
public void testGroupArtifactVersionConstructor() {
// Invoke
final Plugin plugin = new Plugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID,
PLUGIN_VERSION);
// Check
assertPluginEquals(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID, PLUGIN_VERSION,
null, NO_DEPENDENCIES, NO_EXECUTIONS, plugin);
}
@Test
public void testXmlElementConstructorWithArtifactAndVersion()
throws Exception {
// In this case we expect the default groupId to be used
assertPluginFromXml(PLUGIN_XML_AV, Plugin.DEFAULT_GROUP_ID,
"foo-plugin", "1.6", null, NO_DEPENDENCIES, NO_EXECUTIONS);
}
@Test
public void testXmlElementConstructorWithGroupArtifactAndVersion()
throws Exception {
assertPluginFromXml(PLUGIN_XML_GAV, "org.codehaus.mojo",
"build-helper-maven-plugin", "1.5", null, NO_DEPENDENCIES,
NO_EXECUTIONS);
}
@Test
public void testXmlElementConstructorWithOneDependency() throws Exception {
final Dependency expectedDependency = new Dependency(
DEPENDENCY_GROUP_ID, DEPENDENCY_ARTIFACT_ID, DEPENDENCY_VERSION);
assertPluginFromXml(PLUGIN_XML_WITH_DEPENDENCY, "com.example",
"ball-of-mud", "1.4", null, Arrays.asList(expectedDependency),
NO_EXECUTIONS);
}
@Test
public void testXmlElementConstructorWithOneExecution() throws Exception {
final Configuration executionConfiguration = new Configuration(
stringToElement(EXECUTION_CONFIGURATION_XML));
final Execution execution = new Execution(EXECUTION_ID,
EXECUTION_PHASE, executionConfiguration, EXECUTION_GOAL);
assertPluginFromXml(PLUGIN_XML_WITH_EXECUTION, "tv.reality",
"view-plugin", "2.5", null, NO_DEPENDENCIES,
Arrays.asList(execution));
}
}