diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java index f370f2de5a..723dc91b38 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java @@ -50,6 +50,9 @@ import javax.ws.rs.core.Response; import java.io.IOException; import java.util.Optional; +import static sonia.scm.ContextEntry.ContextBuilder.entity; +import static sonia.scm.NotFoundException.notFound; + @Slf4j public class ChangesetRootResource { @@ -150,25 +153,11 @@ public class ChangesetRootResource { try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) { Repository repository = repositoryService.getRepository(); RepositoryPermissions.read(repository).check(); - ChangesetPagingResult changesets = repositoryService.getLogCommand() - .setStartChangeset(id) - .setEndChangeset(id) - .getChangesets(); - - if (changesets == null || changesets.getChangesets() == null || changesets.getChangesets().isEmpty()) { - return Response.status(Response.Status.NOT_FOUND).build(); + Changeset changeset = repositoryService.getLogCommand().getChangeset(id); + if (changeset == null) { + throw notFound(entity(Changeset.class, id).in(repository)); } - Optional changeset = changesets - .getChangesets() - .stream() - .filter(c -> c.getId().startsWith(id)) - .findFirst(); - - if (!changeset.isPresent()) { - return Response.status(Response.Status.NOT_FOUND).build(); - } - - return Response.ok(changesetToChangesetDtoMapper.map(changeset.get(), repository)).build(); + return Response.ok(changesetToChangesetDtoMapper.map(changeset, repository)).build(); } } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java index 18298c83ff..55ad6871c7 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java @@ -25,6 +25,7 @@ package sonia.scm.api.v2.resources; +import com.google.inject.util.Providers; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; @@ -175,20 +176,18 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { String authorName = "name"; String authorEmail = "em@i.l"; String commit = "my branch commit"; - ChangesetPagingResult changesetPagingResult = mock(ChangesetPagingResult.class); - List changesetList = Lists.newArrayList(new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit)); - when(changesetPagingResult.getChangesets()).thenReturn(changesetList); - when(changesetPagingResult.getTotal()).thenReturn(1); - when(logCommandBuilder.setEndChangeset(anyString())).thenReturn(logCommandBuilder); - when(logCommandBuilder.setStartChangeset(anyString())).thenReturn(logCommandBuilder); - when(logCommandBuilder.getChangesets()).thenReturn(changesetPagingResult); + + when(logCommandBuilder.getChangeset(id)).thenReturn( + new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit) + ); + MockHttpRequest request = MockHttpRequest .get(CHANGESET_URL + id) .accept(VndMediaType.CHANGESET); MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); + assertEquals(200, response.getStatus()); - log.info("Response :{}", response.getContentAsString()); assertTrue(response.getContentAsString().contains(String.format("\"id\":\"%s\"", id))); assertTrue(response.getContentAsString().contains(String.format("\"name\":\"%s\"", authorName))); assertTrue(response.getContentAsString().contains(String.format("\"mail\":\"%s\"", authorEmail))); @@ -196,30 +195,15 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { } @Test - public void shouldGetChangeSetForShortenedCommitId() throws Exception { - String id = "revision_123"; - Instant creationDate = Instant.now(); - String authorName = "name"; - String authorEmail = "em@i.l"; - String commit = "my branch commit"; - ChangesetPagingResult changesetPagingResult = mock(ChangesetPagingResult.class); - List changesetList = Lists.newArrayList(new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit)); - when(changesetPagingResult.getChangesets()).thenReturn(changesetList); - when(changesetPagingResult.getTotal()).thenReturn(1); - when(logCommandBuilder.setEndChangeset(anyString())).thenReturn(logCommandBuilder); - when(logCommandBuilder.setStartChangeset(anyString())).thenReturn(logCommandBuilder); - when(logCommandBuilder.getChangesets()).thenReturn(changesetPagingResult); + public void shouldReturnNotFoundForNonExistingChangeset() throws Exception { MockHttpRequest request = MockHttpRequest - .get(CHANGESET_URL + "rev") + .get(CHANGESET_URL + "abcd") .accept(VndMediaType.CHANGESET); + MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); - assertEquals(200, response.getStatus()); - log.info("Response :{}", response.getContentAsString()); - assertTrue(response.getContentAsString().contains(String.format("\"id\":\"%s\"", id))); - assertTrue(response.getContentAsString().contains(String.format("\"name\":\"%s\"", authorName))); - assertTrue(response.getContentAsString().contains(String.format("\"mail\":\"%s\"", authorEmail))); - assertTrue(response.getContentAsString().contains(String.format("\"description\":\"%s\"", commit))); + + assertEquals(404, response.getStatus()); } }