/* * Copyright (C) 2014 Red Hat, Inc. and/or its affiliates. * * 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 org.jboss.errai.forge.facet.ui.command; import org.apache.maven.model.Model; import org.apache.maven.model.Profile; import org.apache.maven.model.Resource; import org.jboss.errai.forge.facet.aggregate.ErraiCdiFacet; import org.jboss.errai.forge.facet.aggregate.ErraiMessagingFacet; import org.jboss.errai.forge.facet.resource.BeansXmlFacet; import org.jboss.errai.forge.facet.resource.ErraiAppPropertiesFacet; import org.jboss.errai.forge.facet.resource.WebXmlFacet; import org.jboss.errai.forge.facet.ui.command.res.UIExecutionContextMock; import org.jboss.errai.forge.facet.ui.command.res.UIInputMock; import org.jboss.errai.forge.test.base.ForgeTest; import org.jboss.errai.forge.ui.command.CreateIntegrationTest; import org.jboss.errai.forge.util.MavenModelUtil; import org.jboss.forge.addon.dependencies.Dependency; import org.jboss.forge.addon.dependencies.builder.DependencyBuilder; import org.jboss.forge.addon.maven.projects.MavenFacet; import org.jboss.forge.addon.maven.projects.facets.MavenDependencyFacet; import org.jboss.forge.addon.projects.Project; import org.jboss.forge.addon.ui.context.UIContext; import org.jboss.forge.addon.ui.context.UIContextProvider; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.List; import static org.junit.Assert.*; public class IntegrationTestCommandTest extends ForgeTest { private Project project; private UIInputMock<String> testClassSimpleName; private UIInputMock<String> testPackageName; private UIExecutionContextMock context; private CreateIntegrationTest testableInstance; @Before public void setup() { final String testName = "IntegrationTestClass"; final String testPackage = "org.jboss.errai.forge.test"; project = createErraiTestProject(); context = new UIExecutionContextMock(); testClassSimpleName = new UIInputMock<String>(); testClassSimpleName.setValue(testName); testPackageName = new UIInputMock<String>(); testPackageName.setValue(testPackage); testableInstance = new CreateIntegrationTest(null, facetFactory, testClassSimpleName, testPackageName) { @Override protected Project getSelectedProject(UIContext context) { return project; } @Override protected Project getSelectedProject(UIContextProvider contextProvider) { return project; } }; } @Test public void checkGeneratedTestClass() throws Exception { testableInstance.execute(context); final File testFile = new File(project.getRootDirectory().getUnderlyingResourceObject(), "src/test/java/org/jboss/errai/forge/test/client/local/IntegrationTestClass.java"); assertResourceAndFileContentsSame("org/jboss/errai/forge/test/IntegrationTestClass.java", testFile); } @Test public void checkTestModuleIsAdded() throws Exception { testableInstance.execute(context); final File moduleFile = new File(project.getRootDirectory().getUnderlyingResourceObject(), "src/test/java/org/jboss/errai/forge/test/Test.gwt.xml"); assertResourceAndFileContentsSame("org/jboss/errai/forge/test/TestModule.gwt.xml", moduleFile); } @Test public void checkTestScopedDependenciesAreAdded() throws Exception { final MavenDependencyFacet depFacet = project.getFacet(MavenDependencyFacet.class); final DependencyBuilder junitDependency = DependencyBuilder.create("junit:junit"); final DependencyBuilder erraiCdiDependency = DependencyBuilder.create("org.jboss.errai:errai-cdi-client"); final DependencyBuilder gwtDevDependency = DependencyBuilder.create("com.google.gwt:gwt-dev"); final DependencyBuilder erraiCdiTestJarDependency = DependencyBuilder.create("org.jboss.errai:errai-cdi-client:::test-jar"); assertFalse(depFacet.hasDirectDependency(junitDependency)); assertFalse(depFacet.hasDirectDependency(erraiCdiDependency)); assertFalse(depFacet.hasDirectDependency(gwtDevDependency)); assertFalse(depFacet.hasDirectDependency(erraiCdiTestJarDependency)); testableInstance.execute(context); assertTrue(depFacet.hasDirectDependency(junitDependency)); assertTrue(depFacet.hasDirectDependency(erraiCdiDependency)); assertTrue(depFacet.hasDirectDependency(gwtDevDependency)); assertTrue(depFacet.hasDirectDependency(erraiCdiTestJarDependency)); } @Test public void checkTestScopedDependenciesAreOnlyAddedOnce() throws Exception { checkTestScopedDependenciesAreAdded(); final MavenDependencyFacet depFacet = project.getFacet(MavenDependencyFacet.class); final List<Dependency> dependencies = depFacet.getDependencies(); testableInstance.execute(context); assertEquals(dependencies.size(), depFacet.getDependencies().size()); } @Test public void addIntegrationTestProfile() throws Exception { final MavenFacet mavenFacet = project.getFacet(MavenFacet.class); Model pom = mavenFacet.getModel(); assertEquals(0, pom.getProfiles().size()); testableInstance.execute(context); pom = mavenFacet.getModel(); final Profile testProfile = MavenModelUtil.getProfileById("integration-test", pom.getProfiles()); assertNotNull("No integration-test profile was found.", testProfile); assertNotNull(testProfile.getBuild()); assertEquals(1, testProfile.getBuild().getPlugins().size()); assertEquals("maven-surefire-plugin", testProfile.getBuild().getPlugins().get(0).getArtifactId()); final List<org.apache.maven.model.Dependency> dependencies = testProfile.getDependencies(); assertEquals(5, dependencies.size()); hasDependency(dependencies, "org.jboss.weld.se:weld-se-core"); hasDependency(dependencies, "org.jboss.weld.servlet:weld-servlet-core"); hasDependency(dependencies, "org.mortbay.jetty:jetty"); hasDependency(dependencies, "org.mortbay.jetty:jetty-plus"); hasDependency(dependencies, "org.mortbay.jetty:jetty-naming"); } @Test public void addTestSourceDirectoryAsResourceInTestPorfile() throws Exception { testableInstance.execute(context); final MavenFacet mavenFacet = project.getFacet(MavenFacet.class); final Model pom = mavenFacet.getModel(); assertNotNull(pom.getProfiles()); final Profile testProfile = MavenModelUtil.getProfileById("integration-test", pom.getProfiles()); assertNotNull("No integration-test profile was found.", testProfile); assertNotNull(testProfile.getBuild().getTestResources()); assertEquals(2, testProfile.getBuild().getTestResources().size()); for (final Resource testResource : testProfile.getBuild().getTestResources()) { if (!testResource.getDirectory().equals("src/test/resources") && !testResource.getDirectory().equals("src/test/java")) { fail("Unexpected resource directory: " + testResource.getDirectory()); } } } @Test public void checkIntegrationTestProfileAndSurefireConfigurationOnlyRunOnce() throws Exception { addIntegrationTestProfile(); testableInstance.execute(context); final MavenFacet mavenFacet = project.getFacet(MavenFacet.class); final Model pom = mavenFacet.getModel(); final Profile testProfile = MavenModelUtil.getProfileById("integration-test", pom.getProfiles()); assertNotNull("No integration-test profile was found.", testProfile); assertEquals(1, testProfile.getBuild().getPlugins().size()); } @Test public void copyErraiAppPropertiesFromSrcMainResources() throws Exception { facetFactory.install(project, ErraiMessagingFacet.class); final ErraiAppPropertiesFacet appPropertiesFacet = project.getFacet(ErraiAppPropertiesFacet.class); final File originalAppProperties = appPropertiesFacet.getAbsoluteFilePath(); testableInstance.execute(context); final File copiedAppProperties = new File(project.getRootDirectory().getUnderlyingResourceObject(), "src/test/resources/ErraiApp.properties"); assertTrue(copiedAppProperties.exists()); try (final InputStreamReader originalStream = new InputStreamReader(new FileInputStream(originalAppProperties)); final InputStreamReader copiedStream = new InputStreamReader(new FileInputStream(copiedAppProperties))) { assertFileContentsSame(originalStream, copiedStream); } } @Test public void writeWebXml() throws Exception { facetFactory.install(project, ErraiMessagingFacet.class); final WebXmlFacet webXmlFacet = project.getFacet(WebXmlFacet.class); testableInstance.execute(context); final File copiedWebXml = new File(project.getRootDirectory().getUnderlyingResourceObject(), "war/WEB-INF/web.xml"); assertTrue(copiedWebXml.exists()); try (final InputStreamReader originalStream = new InputStreamReader( ClassLoader.getSystemResourceAsStream("org/jboss/errai/forge/test/web.xml")); final InputStreamReader copiedStream = new InputStreamReader(new FileInputStream(copiedWebXml))) { assertFileContentsSame(originalStream, copiedStream); } } @Test public void writeJettyEnvXml() throws Exception { testableInstance.execute(context); final File copiedJettyEnvXml = new File(project.getRootDirectory().getUnderlyingResourceObject(), "war/WEB-INF/jetty-env.xml"); assertTrue(copiedJettyEnvXml.exists()); try (final InputStreamReader originalStream = new InputStreamReader( ClassLoader.getSystemResourceAsStream("org/jboss/errai/forge/test/jetty-env.xml")); final InputStreamReader copiedStream = new InputStreamReader(new FileInputStream(copiedJettyEnvXml))) { assertFileContentsSame(originalStream, copiedStream); } } @Test public void copyBeansXmlFromWebInf() throws Exception { facetFactory.install(project, ErraiCdiFacet.class); final BeansXmlFacet beansXmlFacet = project.getFacet(BeansXmlFacet.class); final File originalBeansXml = beansXmlFacet.getAbsoluteFilePath(); testableInstance.execute(context); final File copiedBeansXml = new File(project.getRootDirectory().getUnderlyingResourceObject(), "war/WEB-INF/beans.xml"); assertTrue(copiedBeansXml.exists()); try (final InputStreamReader originalStream = new InputStreamReader(new FileInputStream(originalBeansXml)); final InputStreamReader copiedStream = new InputStreamReader(new FileInputStream(copiedBeansXml))) { assertFileContentsSame(originalStream, copiedStream); } } private void hasDependency(final List<org.apache.maven.model.Dependency> dependencies, final String coordinate) { for (final org.apache.maven.model.Dependency dep : dependencies) { if ((dep.getGroupId() + ":" + dep.getArtifactId()).equals(coordinate)) { return; } } fail(coordinate + " was not found in the given dependencies."); } }