Add unit tests for FilesystemDeleteHandler Change-Id: I6016003bc8938e6389e17cb96bd5a439f803b4c0
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java new file mode 100644 index 0000000..21880c5 --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/fs/FilesystemDeleteHandlerTest.java
@@ -0,0 +1,115 @@ +// Copyright (C) 2018 The Android Open Source Project +// +// 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 com.googlesource.gerrit.plugins.deleteproject.fs; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.when; + +import com.google.gerrit.extensions.events.ProjectDeletedListener; +import com.google.gerrit.extensions.registration.DynamicSet; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.git.GitRepositoryManager; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.Repository; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class FilesystemDeleteHandlerTest { + + @Mock private GitRepositoryManager repoManager; + @Mock private ProjectDeletedListener projectDeleteListener; + + @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); + + private DynamicSet<ProjectDeletedListener> deletedListener; + private FilesystemDeleteHandler fsDeleteHandler; + private Path basePath; + + @Before + public void setUp() throws Exception { + basePath = tempFolder.newFolder().toPath().resolve("base"); + deletedListener = new DynamicSet<>(); + deletedListener.add(projectDeleteListener); + } + + @Test + public void shouldDeleteRepository() throws Exception { + String repoName = "testRepo"; + Repository repository = createRepository(repoName); + Project.NameKey nameKey = new Project.NameKey(repoName); + Project project = new Project(nameKey); + when(repoManager.openRepository(nameKey)).thenReturn(repository); + fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener); + fsDeleteHandler.delete(project, false); + assertThat(repository.getDirectory().exists()).isFalse(); + } + + @Test + public void shouldDeleteEmptyParentFolders() throws Exception { + String repoName = "a/b/c"; + Repository repository = createRepository(repoName); + Project.NameKey nameKey = new Project.NameKey(repoName); + Project project = new Project(nameKey); + when(repoManager.openRepository(nameKey)).thenReturn(repository); + fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener); + fsDeleteHandler.delete(project, false); + assertThat(repository.getDirectory().exists()).isFalse(); + } + + @Test + public void shouldKeepCommonFolders() throws Exception { + String repoToDeleteName = "a/b/c/d"; + Repository repoToDelete = createRepository(repoToDeleteName); + + String repoToKeepName = "a/b/e"; + Repository repoToKeep = createRepository(repoToKeepName); + + Project.NameKey nameKey = new Project.NameKey(repoToDeleteName); + Project project = new Project(nameKey); + when(repoManager.openRepository(nameKey)).thenReturn(repoToDelete); + fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener); + fsDeleteHandler.delete(project, false); + assertThat(repoToDelete.getDirectory().exists()).isFalse(); + assertThat(repoToKeep.getDirectory().exists()).isTrue(); + } + + @Test + public void shouldPreserveRepository() throws Exception { + String repoName = "preservedRepo"; + Repository repository = createRepository(repoName); + Project.NameKey nameKey = new Project.NameKey(repoName); + Project project = new Project(nameKey); + when(repoManager.openRepository(nameKey)).thenReturn(repository); + fsDeleteHandler = new FilesystemDeleteHandler(repoManager, deletedListener); + fsDeleteHandler.delete(project, true); + assertThat(repository.getDirectory().exists()).isTrue(); + } + + private FileRepository createRepository(String repoName) throws IOException { + Path repoPath = Files.createDirectories(basePath.resolve(repoName)); + Repository repository = new FileRepository(repoPath.toFile()); + repository.create(true); + return (FileRepository) repository; + } +}