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_WITHOUT_VERSION_WITH_DEPENDENCY = "<plugin>" + "<groupId>com.example</groupId>" + "<artifactId>ball-of-mud</artifactId>" + "<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(expected = IllegalArgumentException.class) // public void testXmlElementConstructorWithoutVersionWithOneDependency() throws Exception { // final Dependency expectedDependency = new Dependency( // DEPENDENCY_GROUP_ID, DEPENDENCY_ARTIFACT_ID, DEPENDENCY_VERSION); // assertPluginFromXml(PLUGIN_WITHOUT_VERSION_WITH_DEPENDENCY, "com.example", // "ball-of-mud", "", 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)); } }