package de.is24.maven; import com.google.common.base.Optional; import de.is24.deadcode4j.junit.LoggingRule; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException; import org.apache.maven.artifact.repository.metadata.Versioning; import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.LegacySupport; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.ReflectionUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.Arrays; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyListOf; import static org.mockito.Mockito.*; public final class An_UpdateChecker { @Rule public final LoggingRule enableLogging = new LoggingRule(); private UpdateChecker objectUnderTest; private RepositoryMetadataManager repositoryMetadataManager; private MavenSession mavenSession; private Optional<ArtifactVersion> result; private static ArtifactVersion version(String version) { return new DefaultArtifactVersion(version); } @Before public void setUp() throws Exception { objectUnderTest = new UpdateChecker(); repositoryMetadataManager = mock(RepositoryMetadataManager.class); mavenSession = mock(MavenSession.class); when(mavenSession.getCurrentProject()).thenReturn(new MavenProject()); LegacySupport legacySupport = mock(LegacySupport.class); when(legacySupport.getSession()).thenReturn(mavenSession); ReflectionUtils.setVariableValueInObject(objectUnderTest, "legacySupport", legacySupport); ReflectionUtils.setVariableValueInObject(objectUnderTest, "repositoryMetadataManager", repositoryMetadataManager); } @Test public void returnsTheMostRecentVersion() { givenOnlineMode(); givenAvailableVersions("1", "10.0", "42", "42.22.9", "42.23"); whenCheckingForUpdate(); assertThat(result.isPresent(), is(true)); assertThat(result.get(), is(equalTo(version("42.23")))); } @Test public void returnsNothingIfLatestVersionIsRunning() { givenOnlineMode(); givenAvailableVersions("1", "10.0", "22", "22.9", "23"); whenCheckingForUpdate(); thenNothingIsReturned(); } @Test public void ignoresSnapshotVersions() { givenOnlineMode(); givenAvailableVersions("23", "24-SNAPSHOT"); whenCheckingForUpdate(); thenNothingIsReturned(); } @Test public void returnsNothingIfInOfflineMode() { givenOfflineMode(); givenAvailableVersions("1", "10.0", "42", "42.22.9", "42.23"); whenCheckingForUpdate(); thenNothingIsReturned(); } @Test public void returnsNothingIfExceptionOccurs() { givenOnlineMode(); whenCheckingForUpdate(); thenNothingIsReturned(); } private void givenOnlineMode() { when(mavenSession.isOffline()).thenReturn(false); } private void givenOfflineMode() { when(mavenSession.isOffline()).thenReturn(true); } private void givenAvailableVersions(final String... availableVersions) { try { doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { RepositoryMetadata repositoryMetadata = (RepositoryMetadata) invocation.getArguments()[0]; Versioning versioning = new Versioning(); versioning.setVersions(Arrays.asList(availableVersions)); repositoryMetadata.getMetadata().setVersioning(versioning); return null; } }).when(repositoryMetadataManager).resolve(any(RepositoryMetadata.class), anyListOf(ArtifactRepository.class), any(ArtifactRepository.class)); } catch (RepositoryMetadataResolutionException e) { throw new RuntimeException(e); } } private void whenCheckingForUpdate() { PluginDescriptor pluginDescriptor = new PluginDescriptor(); pluginDescriptor.setPluginArtifact(new DefaultArtifact("de.is24", "junit", "23", null, "maven-plugin", "", null)); MojoDescriptor mojoDescriptor = new MojoDescriptor(); mojoDescriptor.setPluginDescriptor(pluginDescriptor); result = objectUnderTest.checkForUpdate(new MojoExecution(mojoDescriptor)); } private void thenNothingIsReturned() { assertThat(result.isPresent(), is(false)); } }