From f899185d2ef5cc4a3f2e6aa2bf2571a7241da0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 10 Aug 2018 09:34:32 +0200 Subject: [PATCH 1/4] Remove branch and tag hal-link from svn repository --- .../RepositoryToRepositoryDtoMapper.java | 14 ++++++++-- .../resources/RepositoryRootResourceTest.java | 5 ++++ .../RepositoryToRepositoryDtoMapperTest.java | 27 +++++++++++++++++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java index ca30a09286..f9369fcdba 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java @@ -8,6 +8,9 @@ import org.mapstruct.MappingTarget; import sonia.scm.repository.HealthCheckFailure; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermissions; +import sonia.scm.repository.api.Command; +import sonia.scm.repository.api.RepositoryService; +import sonia.scm.repository.api.RepositoryServiceFactory; import static de.otto.edison.hal.Link.link; import static de.otto.edison.hal.Links.linkingTo; @@ -19,6 +22,8 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper Date: Fri, 10 Aug 2018 08:17:10 +0000 Subject: [PATCH 2/4] Close branch feature/bugfix_branch_tag_links_svn From 8c541b8dec29cf743c0da45c34082dba9e6c10bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 10 Aug 2018 13:37:10 +0200 Subject: [PATCH 3/4] Close service resource after usage --- .../resources/RepositoryToRepositoryDtoMapper.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java index f9369fcdba..f46bc22cdf 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java @@ -38,12 +38,13 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper Date: Wed, 15 Aug 2018 11:44:20 +0200 Subject: [PATCH 4/4] Add basic integration test for interactions with repositories --- .../sonia/scm/it/RepositoryAccessITCase.java | 67 +++++++++++++++++++ .../java/sonia/scm/it/RepositoryUtil.java | 62 +++++++++++++++++ .../src/test/java/sonia/scm/it/RestUtil.java | 10 ++- 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java create mode 100644 scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java new file mode 100644 index 0000000000..a461e40dea --- /dev/null +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java @@ -0,0 +1,67 @@ +package sonia.scm.it; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.IOException; +import java.util.Collection; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeFalse; +import static sonia.scm.it.RestUtil.given; +import static sonia.scm.it.ScmTypes.availableScmTypes; + +@RunWith(Parameterized.class) +public class RepositoryAccessITCase { + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + private final String repositoryType; + private RepositoryUtil repositoryUtil; + + public RepositoryAccessITCase(String repositoryType) { + this.repositoryType = repositoryType; + } + + @Parameterized.Parameters(name = "{0}") + public static Collection createParameters() { + return availableScmTypes(); + } + + @Before + public void initClient() throws IOException { + TestData.createDefault(); + repositoryUtil = new RepositoryUtil(repositoryType, tempFolder.getRoot()); + } + + @Test + public void shouldFindBranches() throws IOException { + assumeFalse("There are no branches for SVN", repositoryType.equals("svn")); + + repositoryUtil.createAndCommitFile("a.txt", "a"); + + String branchesUrl = given() + .when() + .get(TestData.getDefaultRepositoryUrl(repositoryType)) + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .path("_links.branches.href"); + + Object branchName = given() + .when() + .get(branchesUrl) + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .path("_embedded.branches[0].name"); + + assertNotNull(branchName); + } +} diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java new file mode 100644 index 0000000000..98d4c8cdab --- /dev/null +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryUtil.java @@ -0,0 +1,62 @@ +package sonia.scm.it; + +import com.google.common.base.Charsets; +import com.google.common.io.Files; +import org.apache.http.HttpStatus; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.Person; +import sonia.scm.repository.client.api.ClientCommand; +import sonia.scm.repository.client.api.RepositoryClient; +import sonia.scm.repository.client.api.RepositoryClientFactory; +import sonia.scm.web.VndMediaType; + +import java.io.File; +import java.io.IOException; + +import static sonia.scm.it.RestUtil.ADMIN_PASSWORD; +import static sonia.scm.it.RestUtil.ADMIN_USERNAME; +import static sonia.scm.it.RestUtil.given; + +public class RepositoryUtil { + + private static final RepositoryClientFactory REPOSITORY_CLIENT_FACTORY = new RepositoryClientFactory(); + + private final RepositoryClient repositoryClient; + private final File folder; + + RepositoryUtil(String repositoryType, File folder) throws IOException { + this.repositoryClient = createRepositoryClient(repositoryType, folder); + this.folder = folder; + } + + static RepositoryClient createRepositoryClient(String repositoryType, File folder) throws IOException { + String httpProtocolUrl = given(VndMediaType.REPOSITORY) + + .when() + .get(TestData.getDefaultRepositoryUrl(repositoryType)) + + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .path("_links.httpProtocol.href"); + + + return REPOSITORY_CLIENT_FACTORY.create(repositoryType, httpProtocolUrl, ADMIN_USERNAME, ADMIN_PASSWORD, folder); + } + + void createAndCommitFile(String fileName, String content) throws IOException { + Files.write(content, new File(folder, fileName), Charsets.UTF_8); + repositoryClient.getAddCommand().add(fileName); + commit("added " + fileName); + } + + Changeset commit(String message) throws IOException { + Changeset changeset = repositoryClient.getCommitCommand().commit( + new Person("scmadmin", "scmadmin@scm-manager.org"), message + ); + if (repositoryClient.isCommandSupported(ClientCommand.PUSH)) { + repositoryClient.getPushCommand().push(); + } + return changeset; + } +} diff --git a/scm-it/src/test/java/sonia/scm/it/RestUtil.java b/scm-it/src/test/java/sonia/scm/it/RestUtil.java index 1458ab6d0b..76d2461637 100644 --- a/scm-it/src/test/java/sonia/scm/it/RestUtil.java +++ b/scm-it/src/test/java/sonia/scm/it/RestUtil.java @@ -16,10 +16,18 @@ public class RestUtil { return REST_BASE_URL.resolve(path); } + public static final String ADMIN_USERNAME = "scmadmin"; + public static final String ADMIN_PASSWORD = "scmadmin"; + public static RequestSpecification given(String mediaType) { return RestAssured.given() .contentType(mediaType) .accept(mediaType) - .auth().preemptive().basic("scmadmin", "scmadmin"); + .auth().preemptive().basic(ADMIN_USERNAME, ADMIN_PASSWORD); + } + + public static RequestSpecification given() { + return RestAssured.given() + .auth().preemptive().basic(ADMIN_USERNAME, ADMIN_PASSWORD); } }