package e2e; import com.github.danielflower.mavenplugins.release.AnnotatedTag; import org.apache.commons.io.FileUtils; import org.apache.maven.shared.invoker.MavenInvocationException; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; import org.junit.BeforeClass; import org.junit.Test; import scaffolding.MvnRunner; import scaffolding.TestProject; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.not; import static org.hamcrest.core.IsEqual.equalTo; import static scaffolding.ExactCountMatcher.oneOf; import static scaffolding.GitMatchers.hasCleanWorkingDirectory; import static scaffolding.GitMatchers.hasTag; public class SingleModuleTest { final String buildNumber = String.valueOf(System.currentTimeMillis()); final String expected = "1.0." + buildNumber; final TestProject testProject = TestProject.singleModuleProject(); @BeforeClass public static void installPluginToLocalRepo() throws MavenInvocationException { MvnRunner.installReleasePluginToLocalRepo(); } @Test public void canUpdateSnapshotVersionToReleaseVersionAndInstallToLocalRepo() throws Exception { List<String> outputLines = testProject.mvnRelease(buildNumber); assertThat(outputLines, oneOf(containsString("Going to release single-module " + expected))); assertThat(outputLines, oneOf(containsString("Hello from version " + expected + "!"))); MvnRunner.assertArtifactInLocalRepo("com.github.danielflower.mavenplugins.testprojects", "single-module", expected); assertThat(new File(testProject.localDir, "target/single-module-" + expected + "-package.jar").exists(), is(true)); } @Test public void theBuildNumberIsOptionalAndWillStartAt0AndThenIncrementTakingIntoAccountLocalAndRemoteTags() throws IOException, GitAPIException { testProject.mvn("releaser:release"); assertThat(testProject.local, hasTag("single-module-1.0.0")); testProject.mvn("releaser:release"); assertThat(testProject.local, hasTag("single-module-1.0.1")); AnnotatedTag.create("single-module-1.0.2", "1.0", 2).saveAtHEAD(testProject.local); testProject.mvn("releaser:release"); assertThat(testProject.local, hasTag("single-module-1.0.3")); AnnotatedTag.create("single-module-1.0.4", "1.0", 4).saveAtHEAD(testProject.origin); AnnotatedTag.create("unrelated-module-1.0.5", "1.0", 5).saveAtHEAD(testProject.origin); testProject.mvn("releaser:release"); assertThat(testProject.local, hasTag("single-module-1.0.5")); } @Test public void theLocalAndRemoteGitReposAreTaggedWithTheModuleNameAndVersion() throws IOException, InterruptedException { testProject.mvnRelease(buildNumber); String expectedTag = "single-module-" + expected; assertThat(testProject.local, hasTag(expectedTag)); assertThat(testProject.origin, hasTag(expectedTag)); } @Test public void onlyLocalGitRepoIsTaggedWithTheModuleNameAndVersionWithoutPush() throws IOException, InterruptedException { testProject.mvn("-DbuildNumber=" + buildNumber, "-Dpush=false", "releaser:release"); String expectedTag = "single-module-" + expected; assertThat(testProject.local, hasTag(expectedTag)); assertThat(testProject.origin, not(hasTag(expectedTag))); } @Test public void thePomChangesAreRevertedAfterTheRelease() throws IOException, InterruptedException { ObjectId originHeadAtStart = head(testProject.origin); ObjectId localHeadAtStart = head(testProject.local); assertThat(originHeadAtStart, equalTo(localHeadAtStart)); testProject.mvnRelease(buildNumber); assertThat(head(testProject.origin), equalTo(originHeadAtStart)); assertThat(head(testProject.local), equalTo(localHeadAtStart)); assertThat(testProject.local, hasCleanWorkingDirectory()); assertThat(FileUtils.readFileToString(new File(testProject.localDir, "pom.xml"), StandardCharsets.UTF_8), containsString("<!-- This comment is here for a test that ensures comments are not deleted -->")); } private ObjectId head(Git git) throws IOException { return git.getRepository().getRef("HEAD").getObjectId(); } }