package org.carlspring.strongbox.controllers; import org.carlspring.strongbox.configuration.ConfigurationManager; import org.carlspring.strongbox.controllers.context.IntegrationTest; import org.carlspring.strongbox.resource.ConfigurationResourceResolver; import org.carlspring.strongbox.rest.common.RestAssuredBaseTest; import org.carlspring.strongbox.storage.Storage; import org.carlspring.strongbox.storage.repository.Repository; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.xml.bind.JAXBException; import java.io.File; import java.io.IOException; import java.util.LinkedHashSet; import java.util.Set; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static com.jayway.restassured.module.mockmvc.RestAssuredMockMvc.given; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author Martin Todorov * @author Alex Oreshkevich */ @IntegrationTest @RunWith(SpringJUnit4ClassRunner.class) public class TrashControllerUndeleteTest extends RestAssuredBaseTest { private static final File BASEDIR = new File(ConfigurationResourceResolver.getVaultDirectory()).getAbsoluteFile(); private static final String REPOSITORY_WITH_TRASH = "tcut-releases-with-trash"; private static final String REPOSITORY_RELEASES = "tcut-releases"; private static final String REPOSITORY_WITH_TRASH_BASEDIR = BASEDIR.getAbsolutePath() + "/storages/" + STORAGE0 + "/" + REPOSITORY_WITH_TRASH; @Inject private ConfigurationManager configurationManager; private static boolean initialized = false; @BeforeClass public static void cleanUp() throws Exception { cleanUp(getRepositoriesToClean()); } @PostConstruct public void initialize() throws Exception { super.init(); if (initialized) { return; } initialized = true; Storage storage = configurationManager.getConfiguration().getStorage(STORAGE0); // Notes: // - Used by testForceDeleteArtifactNotAllowed() // - Forced deletions are not allowed // - Has enabled trash Repository repositoryWithTrash = new Repository(REPOSITORY_WITH_TRASH); repositoryWithTrash.setStorage(storage); repositoryWithTrash.setAllowsForceDeletion(false); repositoryWithTrash.setTrashEnabled(true); repositoryWithTrash.setIndexingEnabled(true); createRepository(repositoryWithTrash); // Notes: // - Used by testForceDeleteArtifactAllowed() // - Forced deletions are allowed Repository repositoryReleases = new Repository(REPOSITORY_RELEASES); repositoryReleases.setStorage(storage); repositoryReleases.setAllowsForceDeletion(false); repositoryReleases.setIndexingEnabled(true); createRepository(repositoryReleases); } @Before public void setUp() throws Exception { generateArtifact(getRepositoryBasedir(STORAGE0, REPOSITORY_WITH_TRASH).getAbsolutePath(), "org.carlspring.strongbox.undelete:test-artifact-undelete", new String[] { "1.0", "1.1" }); generateArtifact(getRepositoryBasedir(STORAGE0, REPOSITORY_RELEASES).getAbsolutePath(), "org.carlspring.strongbox.undelete:test-artifact-undelete", new String[] { "2.0" }); // Delete the artifact (this one should get placed under the .trash) client.delete(STORAGE0, REPOSITORY_WITH_TRASH, "org/carlspring/strongbox/undelete/test-artifact-undelete/1.0/test-artifact-undelete-1.0.jar"); client.delete(STORAGE0, REPOSITORY_WITH_TRASH, "org/carlspring/strongbox/undelete/test-artifact-undelete/1.1/test-artifact-undelete-1.1.jar"); // Delete the artifact (this one shouldn't get placed under the .trash) client.delete(STORAGE0, REPOSITORY_RELEASES, "org/carlspring/strongbox/undelete/test-artifact-undelete/2.0/test-artifact-undelete-2.0.jar"); } @PreDestroy public void removeRepositories() throws IOException, JAXBException { removeRepositories(getRepositoriesToClean()); } public static Set<Repository> getRepositoriesToClean() { Set<Repository> repositories = new LinkedHashSet<>(); repositories.add(createRepositoryMock(STORAGE0, REPOSITORY_WITH_TRASH)); repositories.add(createRepositoryMock(STORAGE0, REPOSITORY_RELEASES)); return repositories; } @Test public void testUndeleteArtifactFromTrashForRepository() throws Exception { assertFalse(indexContainsArtifact(STORAGE0, REPOSITORY_WITH_TRASH, "+g:org.carlspring.strongbox.undelete " + "+a:test-artifact-undelete " + "+v:1.0 " + "+p:jar")); String url = getContextBaseUrl() + "/trash/" + STORAGE0 + "/" + REPOSITORY_WITH_TRASH + "/org/carlspring/strongbox/undelete/test-artifact-undelete/1.0/test-artifact-undelete-1.0.jar"; given().contentType(MediaType.TEXT_PLAIN_VALUE) .when() .post(url) .peek() .then() .statusCode(200); final File artifactFileRestoredFromTrash = new File(REPOSITORY_WITH_TRASH_BASEDIR + "/" + "org/carlspring/strongbox/undelete/test-artifact-undelete/1.0/" + "test-artifact-undelete-1.0.jar").getAbsoluteFile(); final File artifactFileInTrash = new File(REPOSITORY_WITH_TRASH_BASEDIR + "/.trash/" + "org/carlspring/strongbox/undelete/test-artifact-undelete/1.0/" + "test-artifact-undelete-1.0.jar").getAbsoluteFile(); assertFalse("Failed to undelete trash for repository '" + REPOSITORY_WITH_TRASH + "'!", artifactFileInTrash.exists()); assertTrue("Failed to undelete trash for repository '" + REPOSITORY_WITH_TRASH + "'!", artifactFileRestoredFromTrash.exists()); assertIndexContainsArtifact(STORAGE0, REPOSITORY_WITH_TRASH, "+g:org.carlspring.strongbox.undelete +a:test-artifact-undelete +v:1.0 +p:jar"); } @Test public void testUndeleteArtifactsForAllRepositories() throws Exception { assertFalse(indexContainsArtifact(STORAGE0, REPOSITORY_WITH_TRASH, "+g:org.carlspring.strongbox.undelete " + "+a:test-artifact-undelete " + "+v:1.1 " + "+p:jar")); final File artifactFileInTrash = new File(REPOSITORY_WITH_TRASH_BASEDIR + "/.trash/" + "org/carlspring/strongbox/undelete/test-artifact-undelete/1.1/" + "test-artifact-undelete-1.1.jar").getAbsoluteFile(); assertTrue("Failed to undelete trash for repository '" + REPOSITORY_WITH_TRASH + "'!", artifactFileInTrash.getParentFile().exists()); String url = getContextBaseUrl() + "/trash"; given().contentType(MediaType.TEXT_PLAIN_VALUE) .when() .post(url) .peek() .then() .statusCode(200); final File artifactFileRestoredFromTrash = new File(REPOSITORY_WITH_TRASH_BASEDIR + "/" + "org/carlspring/strongbox/undelete/test-artifact-undelete/1.1/" + "test-artifact-undelete-1.1.jar").getAbsoluteFile(); assertFalse("Failed to undelete trash for repository '" + REPOSITORY_WITH_TRASH + "'!", artifactFileInTrash.exists()); assertTrue("Failed to undelete trash for repository '" + REPOSITORY_WITH_TRASH + "' (" + artifactFileRestoredFromTrash.getAbsolutePath() + " does not exist)!", artifactFileRestoredFromTrash.exists()); assertIndexContainsArtifact(STORAGE0, REPOSITORY_WITH_TRASH, "+g:org.carlspring.strongbox.undelete " + "+a:test-artifact-undelete " + "+v:1.1 " + "+p:jar"); } }