From 0b70c6227cc0495378ce7b234035cbba4cdf3483 Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Mon, 3 Sep 2018 15:36:09 +0200 Subject: [PATCH 1/6] Added integration test --- .../java/sonia/scm/it/RepositoryAccessITCase.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java index a9139f18c8..ce3453f4af 100644 --- a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java @@ -16,8 +16,8 @@ import java.io.IOException; import java.util.Collection; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; import static java.lang.Thread.sleep; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertNotNull; import static sonia.scm.it.RestUtil.given; @@ -98,6 +98,7 @@ public class RepositoryAccessITCase { .statusCode(HttpStatus.SC_OK) .extract() .path("files.find{it.name=='a.txt'}._links.self.href"); + given() .when() .get(rootContentUrl) @@ -112,7 +113,15 @@ public class RepositoryAccessITCase { .statusCode(HttpStatus.SC_OK) .extract() .path("files.find{it.name=='subfolder'}._links.self.href"); - String subfolderContentUrl= given() + String selfOfSubfolderUrl = given() + .when() + .get(subfolderSourceUrl) + .then() + .statusCode(HttpStatus.SC_OK) + .extract() + .path("_links.self.href"); + assertThat(subfolderSourceUrl).isEqualTo(selfOfSubfolderUrl); + String subfolderContentUrl = given() .when() .get(subfolderSourceUrl) .then() From d7e319a856a8efaf68987bdbe80fc2186213f428 Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Mon, 3 Sep 2018 16:22:07 +0200 Subject: [PATCH 2/6] Fixes self-links in sources --- .../BrowserResultToBrowserResultDtoMapper.java | 11 +++++++---- .../scm/api/v2/resources/SourceRootResource.java | 2 +- .../BrowserResultToBrowserResultDtoMapperTest.java | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java index 7abb1ae69b..a334283b4b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java @@ -17,7 +17,7 @@ public class BrowserResultToBrowserResultDtoMapper { @Inject private ResourceLinks resourceLinks; - public BrowserResultDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName) { + public BrowserResultDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName, String path) { BrowserResultDto browserResultDto = new BrowserResultDto(); browserResultDto.setTag(browserResult.getTag()); @@ -30,7 +30,7 @@ public class BrowserResultToBrowserResultDtoMapper { } browserResultDto.setFiles(fileObjectDtoList); - this.addLinks(browserResult, browserResultDto, namespaceAndName); + this.addLinks(browserResult, browserResultDto, namespaceAndName, path); return browserResultDto; } @@ -38,11 +38,14 @@ public class BrowserResultToBrowserResultDtoMapper { return fileObjectToFileObjectDtoMapper.map(fileObject, namespaceAndName, revision); } - private void addLinks(BrowserResult browserResult, BrowserResultDto dto, NamespaceAndName namespaceAndName) { + private void addLinks(BrowserResult browserResult, BrowserResultDto dto, NamespaceAndName namespaceAndName, String path) { + if (path.equals("/")) { + path = ""; + } if (browserResult.getRevision() == null) { dto.add(Links.linkingTo().self(resourceLinks.source().selfWithoutRevision(namespaceAndName.getNamespace(), namespaceAndName.getName())).build()); } else { - dto.add(Links.linkingTo().self(resourceLinks.source().self(namespaceAndName.getNamespace(), namespaceAndName.getName(), browserResult.getRevision())).build()); + dto.add(Links.linkingTo().self(resourceLinks.source().sourceWithPath(namespaceAndName.getNamespace(), namespaceAndName.getName(), browserResult.getRevision(), path)).build()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index fe12f69ecc..32a4105c46 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -61,7 +61,7 @@ public class SourceRootResource { BrowserResult browserResult = browseCommand.getBrowserResult(); if (browserResult != null) { - return Response.ok(browserResultToBrowserResultDtoMapper.map(browserResult, namespaceAndName)).build(); + return Response.ok(browserResultToBrowserResultDtoMapper.map(browserResult, namespaceAndName, path)).build(); } else { return Response.status(Response.Status.NOT_FOUND).build(); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java index bb7dadb566..f0e4c7e0d5 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java @@ -71,7 +71,7 @@ public class BrowserResultToBrowserResultDtoMapperTest { public void shouldMapAttributesCorrectly() { BrowserResult browserResult = createBrowserResult(); - BrowserResultDto dto = mapper.map(browserResult, new NamespaceAndName("foo", "bar")); + BrowserResultDto dto = mapper.map(browserResult, new NamespaceAndName("foo", "bar"), "path"); assertEqualAttributes(browserResult, dto); } @@ -81,12 +81,22 @@ public class BrowserResultToBrowserResultDtoMapperTest { BrowserResult browserResult = createBrowserResult(); NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar"); - BrowserResultDto dto = mapper.map(browserResult, namespaceAndName); + BrowserResultDto dto = mapper.map(browserResult, namespaceAndName, "path"); verify(fileObjectToFileObjectDtoMapper).map(fileObject1, namespaceAndName, "Revision"); verify(fileObjectToFileObjectDtoMapper).map(fileObject2, namespaceAndName, "Revision"); } + @Test + public void shouldSetLinksCorrectly() { + BrowserResult browserResult = createBrowserResult(); + NamespaceAndName namespaceAndName = new NamespaceAndName("foo", "bar"); + + BrowserResultDto dto = mapper.map(browserResult, namespaceAndName, "path"); + + assertThat(dto.getLinks().getLinkBy("self").get().getHref()).contains("path"); + } + private BrowserResult createBrowserResult() { BrowserResult browserResult = new BrowserResult(); browserResult.setTag("Tag"); From e79041140f68e16e91248f694e38705438955cb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 5 Sep 2018 15:17:49 +0200 Subject: [PATCH 3/6] Remove tags and branches from browse result and embed files --- .../sonia/scm/it/RepositoryAccessITCase.java | 6 +++--- .../api/v2/resources/BrowserResultDto.java | 20 +++---------------- ...BrowserResultToBrowserResultDtoMapper.java | 4 ---- .../FileObjectToFileObjectDtoMapper.java | 10 ++-------- .../scm/api/v2/resources/ResourceLinks.java | 13 ++++++------ ...serResultToBrowserResultDtoMapperTest.java | 8 ++++---- .../v2/resources/SourceRootResourceTest.java | 4 ---- 7 files changed, 19 insertions(+), 46 deletions(-) diff --git a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java index ce3453f4af..6184cc73e4 100644 --- a/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/RepositoryAccessITCase.java @@ -97,7 +97,7 @@ public class RepositoryAccessITCase { .then() .statusCode(HttpStatus.SC_OK) .extract() - .path("files.find{it.name=='a.txt'}._links.self.href"); + .path("_embedded.files.find{it.name=='a.txt'}._links.self.href"); given() .when() @@ -112,7 +112,7 @@ public class RepositoryAccessITCase { .then() .statusCode(HttpStatus.SC_OK) .extract() - .path("files.find{it.name=='subfolder'}._links.self.href"); + .path("_embedded.files.find{it.name=='subfolder'}._links.self.href"); String selfOfSubfolderUrl = given() .when() .get(subfolderSourceUrl) @@ -127,7 +127,7 @@ public class RepositoryAccessITCase { .then() .statusCode(HttpStatus.SC_OK) .extract() - .path("files[0]._links.self.href"); + .path("_embedded.files[0]._links.self.href"); given() .when() .get(subfolderContentUrl) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java index b8ffd7ff26..2b49f18fa1 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultDto.java @@ -6,18 +6,13 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.util.Iterator; import java.util.List; @Getter @Setter @NoArgsConstructor -public class BrowserResultDto extends HalRepresentation implements Iterable { +public class BrowserResultDto extends HalRepresentation { private String revision; - private String tag; - private String branch; - // REVIEW files nicht embedded? - private List files; @Override @SuppressWarnings("squid:S1185") // We want to have this method available in this package @@ -25,16 +20,7 @@ public class BrowserResultDto extends HalRepresentation implements Iterable iterator() { - Iterator it = null; - - if (files != null) - { - it = files.iterator(); - } - - return it; + public void setFiles(List files) { + this.withEmbedded("files", files); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java index a334283b4b..6ea6a11a2e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java @@ -20,8 +20,6 @@ public class BrowserResultToBrowserResultDtoMapper { public BrowserResultDto map(BrowserResult browserResult, NamespaceAndName namespaceAndName, String path) { BrowserResultDto browserResultDto = new BrowserResultDto(); - browserResultDto.setTag(browserResult.getTag()); - browserResultDto.setBranch(browserResult.getBranch()); browserResultDto.setRevision(browserResult.getRevision()); List fileObjectDtoList = new ArrayList<>(); @@ -48,6 +46,4 @@ public class BrowserResultToBrowserResultDtoMapper { dto.add(Links.linkingTo().self(resourceLinks.source().sourceWithPath(namespaceAndName.getNamespace(), namespaceAndName.getName(), browserResult.getRevision(), path)).build()); } } - - } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java index bc814c7e0c..fdcc5c56ca 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileObjectToFileObjectDtoMapper.java @@ -10,7 +10,6 @@ import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.SubRepository; import javax.inject.Inject; -import java.net.URI; @Mapper public abstract class FileObjectToFileObjectDtoMapper extends BaseMapper { @@ -27,19 +26,14 @@ public abstract class FileObjectToFileObjectDtoMapper extends BaseMapper Date: Wed, 5 Sep 2018 17:01:13 +0200 Subject: [PATCH 4/6] Fail for missing revision --- .../api/v2/resources/BrowserResultToBrowserResultDtoMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java index 6ea6a11a2e..c877cb0647 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapper.java @@ -41,7 +41,7 @@ public class BrowserResultToBrowserResultDtoMapper { path = ""; } if (browserResult.getRevision() == null) { - dto.add(Links.linkingTo().self(resourceLinks.source().selfWithoutRevision(namespaceAndName.getNamespace(), namespaceAndName.getName())).build()); + throw new IllegalStateException("missing revision in browser result for repository " + namespaceAndName + " and path " + path); } else { dto.add(Links.linkingTo().self(resourceLinks.source().sourceWithPath(namespaceAndName.getNamespace(), namespaceAndName.getName(), browserResult.getRevision(), path)).build()); } From a2182da8fa83f09132350cd96f89f6229d7e9c50 Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Thu, 6 Sep 2018 11:56:09 +0200 Subject: [PATCH 5/6] Made ArgumentMatchers in test match more specifically --- .../resources/BrowserResultToBrowserResultDtoMapperTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java index f11f631ccf..528418a187 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BrowserResultToBrowserResultDtoMapperTest.java @@ -19,6 +19,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -63,7 +64,8 @@ public class BrowserResultToBrowserResultDtoMapperTest { fileObject2.setDescription("description of file object 2"); fileObject2.setDirectory(true); - when(fileObjectToFileObjectDtoMapper.map(any(), any(), any())).thenReturn(new FileObjectDto()); + when(fileObjectToFileObjectDtoMapper.map(any(FileObject.class), any(NamespaceAndName.class), anyString())) + .thenReturn(new FileObjectDto()); } @After From dbde9181f2a643b80a166c535e83e8a71fd9eea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 6 Sep 2018 11:33:33 +0000 Subject: [PATCH 6/6] Close branch feature/self_link_bug