/******************************************************************************* * Copyright (c) 2015 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are 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 * * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.test; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.springframework.ide.eclipse.boot.test.BootProjectTestHarness.bootVersionAtLeast; import static org.springframework.ide.eclipse.boot.test.BootProjectTestHarness.withStarters; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.springframework.ide.eclipse.boot.core.IMavenCoordinates; import org.springframework.ide.eclipse.boot.core.ISpringBootProject; import org.springframework.ide.eclipse.boot.core.SpringBootCore; import org.springframework.ide.eclipse.boot.core.SpringBootStarters; import org.springframework.ide.eclipse.boot.core.initializr.InitializrService; import org.springframework.ide.eclipse.boot.ui.EnableDisableBootDevtools; import org.springsource.ide.eclipse.commons.frameworks.test.util.ACondition; import org.springsource.ide.eclipse.commons.tests.util.StsTestUtil; import static org.springframework.ide.eclipse.boot.ui.EnableDisableBootDevtools.*; import java.util.List; public class EnableDisableBootDevtoolsTest { //TODO: better test coverage for EnableDisableBootDevtools private static final long MAVEN_POM_REFRESH_TIMEOUT = 3*60*1000; /** * We want the devtools enablement action not to depend on initializr service. * So lets explicitly mock it with a 'unavalailable' service. */ private InitializrService initializr = new InitializrService() { @Override public SpringBootStarters getStarters(String bootVersion) { return null; } }; private SpringBootCore springBootCore = new SpringBootCore(initializr); private BootProjectTestHarness projects = new BootProjectTestHarness(ResourcesPlugin.getWorkspace()); private EnableDisableBootDevtools delegate = new EnableDisableBootDevtools(springBootCore); private IAction action = mock(IAction.class); @Rule public AutobuildingEnablement autobuilding = new AutobuildingEnablement(true); @Before public void setUp() throws Exception { StsTestUtil.deleteAllProjects(); } @Test public void addBootDevtools() throws Exception { final ISpringBootProject project = springBootCore.project( projects.createBootWebProject("dev-starters-tester", bootVersionAtLeast("1.3.0"))); delegate.selectionChanged(action, selectionOf(project)); verify(action).setText("Add Boot Devtools"); verify(action).setEnabled(true); assertNoDependency(project.getDependencies(), SPRING_BOOT_DEVTOOLS_GID, SPRING_BOOT_DEVTOOLS_AID); delegate.run(action); new ACondition("Wait for 'devtools' starter to be added") { public boolean test() throws Exception { assertDependency(project.getDependencies(), SPRING_BOOT_DEVTOOLS_GID, SPRING_BOOT_DEVTOOLS_AID); return true; } }.waitFor(MAVEN_POM_REFRESH_TIMEOUT); } @Test public void removeBootDevtools() throws Exception { final ISpringBootProject project = springBootCore.project( projects.createBootWebProject("dev-starters-tester", bootVersionAtLeast("1.3.0"), withStarters("devtools") ) ); delegate.selectionChanged(action, selectionOf(project)); verify(action).setText("Remove Boot Devtools"); verify(action).setEnabled(true); assertDependency(project.getDependencies(), SPRING_BOOT_DEVTOOLS_GID, SPRING_BOOT_DEVTOOLS_AID); delegate.run(action); new ACondition("Wait for 'devtools' starter to be removed") { public boolean test() throws Exception { assertNoDependency(project.getDependencies(), SPRING_BOOT_DEVTOOLS_GID, SPRING_BOOT_DEVTOOLS_AID); return true; } }.waitFor(MAVEN_POM_REFRESH_TIMEOUT); } /////////////////////////////////////////////////////////////////////////////// private ISelection selectionOf(ISpringBootProject project) { return selectionOf(project.getProject()); } private ISelection selectionOf(IProject project) { return new StructuredSelection(new Object[] {project}); } private void assertDependency(List<IMavenCoordinates> dependencies, String gid, String aid) { for (IMavenCoordinates d : dependencies) { if (gid.equals(d.getGroupId()) && aid.equals(d.getArtifactId())) { return; //okay! } } fail("No dependency "+gid+":"+aid+" in "+dependencies); } private void assertNoDependency(List<IMavenCoordinates> dependencies, String gid, String aid) { for (IMavenCoordinates d : dependencies) { if (gid.equals(d.getGroupId()) && aid.equals(d.getArtifactId())) { fail("Dependency found but not expected "+gid+":"+aid+" in "+dependencies); } } } }