mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-10 07:25:44 +01:00
remove mergeResource and move dryRun to review-plugin
This commit is contained in:
@@ -214,6 +214,12 @@
|
|||||||
<artifactId>shiro-unit</artifactId>
|
<artifactId>shiro-unit</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate</groupId>
|
||||||
|
<artifactId>hibernate-validator</artifactId>
|
||||||
|
<version>5.3.6.Final</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
request.setBranchToMerge("mergeable");
|
request.setBranchToMerge("mergeable");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
@@ -90,6 +91,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
request.setBranchToMerge("empty_merge");
|
request.setBranchToMerge("empty_merge");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
@@ -111,6 +113,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
request.setBranchToMerge("mergeable");
|
request.setBranchToMerge("mergeable");
|
||||||
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
|
|
||||||
@@ -134,6 +137,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
request.setBranchToMerge("mergeable");
|
request.setBranchToMerge("mergeable");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
||||||
request.setMessageTemplate("simple");
|
request.setMessageTemplate("simple");
|
||||||
|
|
||||||
@@ -154,6 +158,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setBranchToMerge("test-branch");
|
request.setBranchToMerge("test-branch");
|
||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
|
|
||||||
@@ -175,6 +180,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setTargetBranch("master");
|
request.setTargetBranch("master");
|
||||||
request.setBranchToMerge("mergeable");
|
request.setBranchToMerge("mergeable");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
|
|
||||||
@@ -194,6 +200,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
|
||||||
request.setTargetBranch("mergeable");
|
request.setTargetBranch("mergeable");
|
||||||
request.setBranchToMerge("master");
|
request.setBranchToMerge("master");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
|
|
||||||
MergeCommandResult mergeCommandResult = command.merge(request);
|
MergeCommandResult mergeCommandResult = command.merge(request);
|
||||||
|
|
||||||
@@ -316,6 +323,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
request.setTargetBranch("mergeable");
|
request.setTargetBranch("mergeable");
|
||||||
request.setBranchToMerge("not_existing");
|
request.setBranchToMerge("not_existing");
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
|
|
||||||
command.merge(request);
|
command.merge(request);
|
||||||
}
|
}
|
||||||
@@ -324,6 +332,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
public void shouldHandleNotExistingTargetBranchInMerge() {
|
public void shouldHandleNotExistingTargetBranchInMerge() {
|
||||||
GitMergeCommand command = createCommand();
|
GitMergeCommand command = createCommand();
|
||||||
MergeCommandRequest request = new MergeCommandRequest();
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setMergeStrategy(MergeStrategy.MERGE_COMMIT);
|
||||||
request.setTargetBranch("not_existing");
|
request.setTargetBranch("not_existing");
|
||||||
request.setBranchToMerge("master");
|
request.setBranchToMerge("master");
|
||||||
|
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
package sonia.scm.api.v2.resources;
|
|
||||||
|
|
||||||
import com.webcohesion.enunciate.metadata.rs.ResponseCode;
|
|
||||||
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.http.HttpStatus;
|
|
||||||
import sonia.scm.ConcurrentModificationException;
|
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
|
||||||
import sonia.scm.repository.RepositoryPermissions;
|
|
||||||
import sonia.scm.repository.api.MergeCommandBuilder;
|
|
||||||
import sonia.scm.repository.api.MergeCommandResult;
|
|
||||||
import sonia.scm.repository.api.MergeDryRunCommandResult;
|
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
|
||||||
import sonia.scm.web.VndMediaType;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
import javax.validation.Valid;
|
|
||||||
import javax.ws.rs.Consumes;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Produces;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class MergeResource {
|
|
||||||
|
|
||||||
private final RepositoryServiceFactory serviceFactory;
|
|
||||||
private final MergeResultToDtoMapper mapper;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public MergeResource(RepositoryServiceFactory serviceFactory, MergeResultToDtoMapper mapper) {
|
|
||||||
this.serviceFactory = serviceFactory;
|
|
||||||
this.mapper = mapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Path("")
|
|
||||||
@Produces(VndMediaType.MERGE_RESULT)
|
|
||||||
@Consumes(VndMediaType.MERGE_COMMAND)
|
|
||||||
@StatusCodes({
|
|
||||||
@ResponseCode(code = 204, condition = "merge has been executed successfully"),
|
|
||||||
@ResponseCode(code = 401, condition = "not authenticated / invalid credentials"),
|
|
||||||
@ResponseCode(code = 403, condition = "not authorized, the current user does not have the privilege to write the repository"),
|
|
||||||
@ResponseCode(code = 409, condition = "The branches could not be merged automatically due to conflicts (conflicting files will be returned)"),
|
|
||||||
@ResponseCode(code = 500, condition = "internal server error")
|
|
||||||
})
|
|
||||||
public Response merge(@PathParam("namespace") String namespace, @PathParam("name") String name, @Valid MergeCommandDto mergeCommand) {
|
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, name);
|
|
||||||
log.info("Merge in Repository {}/{} from {} to {}", namespace, name, mergeCommand.getSourceRevision(), mergeCommand.getTargetRevision());
|
|
||||||
try (RepositoryService repositoryService = serviceFactory.create(namespaceAndName)) {
|
|
||||||
RepositoryPermissions.push(repositoryService.getRepository()).check();
|
|
||||||
MergeCommandResult mergeCommandResult = createMergeCommand(mergeCommand, repositoryService).executeMerge();
|
|
||||||
if (mergeCommandResult.isSuccess()) {
|
|
||||||
return Response.noContent().build();
|
|
||||||
} else {
|
|
||||||
return Response.status(HttpStatus.SC_CONFLICT).entity(mapper.map(mergeCommandResult)).build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Path("dry-run/")
|
|
||||||
@StatusCodes({
|
|
||||||
@ResponseCode(code = 204, condition = "merge can be done automatically"),
|
|
||||||
@ResponseCode(code = 401, condition = "not authenticated / invalid credentials"),
|
|
||||||
@ResponseCode(code = 409, condition = "The branches can not be merged automatically due to conflicts"),
|
|
||||||
@ResponseCode(code = 500, condition = "internal server error")
|
|
||||||
})
|
|
||||||
public Response dryRun(@PathParam("namespace") String namespace, @PathParam("name") String name, @Valid MergeCommandDto mergeCommand) {
|
|
||||||
|
|
||||||
NamespaceAndName namespaceAndName = new NamespaceAndName(namespace, name);
|
|
||||||
log.info("Merge in Repository {}/{} from {} to {}", namespace, name, mergeCommand.getSourceRevision(), mergeCommand.getTargetRevision());
|
|
||||||
try (RepositoryService repositoryService = serviceFactory.create(namespaceAndName)) {
|
|
||||||
if (RepositoryPermissions.push(repositoryService.getRepository()).isPermitted()) {
|
|
||||||
MergeDryRunCommandResult mergeCommandResult = createMergeCommand(mergeCommand, repositoryService).dryRun();
|
|
||||||
if (mergeCommandResult.isMergeable()) {
|
|
||||||
return Response.noContent().build();
|
|
||||||
} else {
|
|
||||||
throw new ConcurrentModificationException("revision", mergeCommand.getTargetRevision());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return Response.noContent().build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private MergeCommandBuilder createMergeCommand(MergeCommandDto mergeCommand, RepositoryService repositoryService) {
|
|
||||||
return repositoryService
|
|
||||||
.getMergeCommand()
|
|
||||||
.setBranchToMerge(mergeCommand.getSourceRevision())
|
|
||||||
.setTargetBranch(mergeCommand.getTargetRevision());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -63,12 +63,6 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper<Reposit
|
|||||||
linksBuilder.single(link("incomingChangesets", resourceLinks.incoming().changesets(repository.getNamespace(), repository.getName())));
|
linksBuilder.single(link("incomingChangesets", resourceLinks.incoming().changesets(repository.getNamespace(), repository.getName())));
|
||||||
linksBuilder.single(link("incomingDiff", resourceLinks.incoming().diff(repository.getNamespace(), repository.getName())));
|
linksBuilder.single(link("incomingDiff", resourceLinks.incoming().diff(repository.getNamespace(), repository.getName())));
|
||||||
}
|
}
|
||||||
if (repositoryService.isSupported(Command.MERGE)) {
|
|
||||||
if (RepositoryPermissions.push(repository).isPermitted()) {
|
|
||||||
linksBuilder.single(link("merge", resourceLinks.merge().merge(repository.getNamespace(), repository.getName())));
|
|
||||||
}
|
|
||||||
linksBuilder.single(link("mergeDryRun", resourceLinks.merge().dryRun(repository.getNamespace(), repository.getName())));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
linksBuilder.single(link("changesets", resourceLinks.changeset().all(repository.getNamespace(), repository.getName())));
|
linksBuilder.single(link("changesets", resourceLinks.changeset().all(repository.getNamespace(), repository.getName())));
|
||||||
linksBuilder.single(link("sources", resourceLinks.source().selfWithoutRevision(repository.getNamespace(), repository.getName())));
|
linksBuilder.single(link("sources", resourceLinks.source().selfWithoutRevision(repository.getNamespace(), repository.getName())));
|
||||||
|
|||||||
@@ -792,26 +792,6 @@ class ResourceLinks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public MergeLinks merge() {
|
|
||||||
return new MergeLinks(scmPathInfoStore.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
static class MergeLinks {
|
|
||||||
private final LinkBuilder mergeLinkBuilder;
|
|
||||||
|
|
||||||
MergeLinks(ScmPathInfo pathInfo) {
|
|
||||||
this.mergeLinkBuilder = new LinkBuilder(pathInfo, RepositoryRootResource.class, RepositoryResource.class, MergeResource.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
String merge(String namespace, String name) {
|
|
||||||
return mergeLinkBuilder.method("getRepositoryResource").parameters(namespace, name).method("merge").parameters().method("merge").parameters().href();
|
|
||||||
}
|
|
||||||
|
|
||||||
String dryRun(String namespace, String name) {
|
|
||||||
return mergeLinkBuilder.method("getRepositoryResource").parameters(namespace, name).method("merge").parameters().method("dryRun").parameters().href();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public PermissionsLinks permissions() {
|
public PermissionsLinks permissions() {
|
||||||
return new PermissionsLinks(scmPathInfoStore.get());
|
return new PermissionsLinks(scmPathInfoStore.get());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,205 +0,0 @@
|
|||||||
package sonia.scm.api.v2.resources;
|
|
||||||
|
|
||||||
import com.github.sdorra.shiro.SubjectAware;
|
|
||||||
import com.google.common.io.Resources;
|
|
||||||
import com.google.inject.util.Providers;
|
|
||||||
import org.apache.shiro.subject.PrincipalCollection;
|
|
||||||
import org.apache.shiro.subject.Subject;
|
|
||||||
import org.apache.shiro.util.ThreadContext;
|
|
||||||
import org.jboss.resteasy.core.Dispatcher;
|
|
||||||
import org.jboss.resteasy.mock.MockHttpRequest;
|
|
||||||
import org.jboss.resteasy.mock.MockHttpResponse;
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.Nested;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
|
||||||
import org.mockito.InjectMocks;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
|
||||||
import sonia.scm.repository.NamespaceAndName;
|
|
||||||
import sonia.scm.repository.Repository;
|
|
||||||
import sonia.scm.repository.api.MergeCommandBuilder;
|
|
||||||
import sonia.scm.repository.api.MergeCommandResult;
|
|
||||||
import sonia.scm.repository.api.MergeDryRunCommandResult;
|
|
||||||
import sonia.scm.repository.api.RepositoryService;
|
|
||||||
import sonia.scm.repository.api.RepositoryServiceFactory;
|
|
||||||
import sonia.scm.repository.spi.MergeCommand;
|
|
||||||
import sonia.scm.user.User;
|
|
||||||
import sonia.scm.web.VndMediaType;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
import static java.util.Arrays.asList;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.Mockito.lenient;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
import static sonia.scm.repository.RepositoryTestData.createHeartOfGold;
|
|
||||||
|
|
||||||
@ExtendWith(MockitoExtension.class)
|
|
||||||
@SubjectAware(
|
|
||||||
configuration = "classpath:sonia/scm/shiro-001.ini",
|
|
||||||
username = "trillian",
|
|
||||||
password = "secret"
|
|
||||||
)
|
|
||||||
public class MergeResourceTest extends RepositoryTestBase {
|
|
||||||
|
|
||||||
public static final String MERGE_URL = "/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/merge/";
|
|
||||||
private Repository repository = createHeartOfGold();
|
|
||||||
|
|
||||||
private Dispatcher dispatcher;
|
|
||||||
@Mock
|
|
||||||
private RepositoryServiceFactory serviceFactory;
|
|
||||||
@Mock
|
|
||||||
private RepositoryService repositoryService;
|
|
||||||
@Mock
|
|
||||||
private MergeCommand mergeCommand;
|
|
||||||
@InjectMocks
|
|
||||||
private MergeCommandBuilder mergeCommandBuilder;
|
|
||||||
private MergeResultToDtoMapperImpl mapper = new MergeResultToDtoMapperImpl();
|
|
||||||
|
|
||||||
private MergeResource mergeResource;
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void init() {
|
|
||||||
mergeResource = new MergeResource(serviceFactory, mapper);
|
|
||||||
super.mergeResource = Providers.of(mergeResource);
|
|
||||||
dispatcher = DispatcherMock.createDispatcher(getRepositoryRootResource());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldHandleIllegalInput() throws Exception {
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand_invalid.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL + "dry-run/")
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(400);
|
|
||||||
System.out.println(response.getContentAsString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nested
|
|
||||||
class ExecutingMergeCommand {
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private Subject subject;
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void initRepository() {
|
|
||||||
when(serviceFactory.create(new NamespaceAndName("space", "repo"))).thenReturn(repositoryService);
|
|
||||||
lenient().when(repositoryService.getMergeCommand()).thenReturn(mergeCommandBuilder);
|
|
||||||
when(repositoryService.getRepository()).thenReturn(repository);
|
|
||||||
|
|
||||||
ThreadContext.bind(subject);
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterEach
|
|
||||||
void tearDownShiro() {
|
|
||||||
ThreadContext.unbindSubject();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldHandleSuccessfulMerge() throws Exception {
|
|
||||||
when(mergeCommand.merge(any())).thenReturn(MergeCommandResult.success());
|
|
||||||
mockUser();
|
|
||||||
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL)
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldHandleFailedMerge() throws Exception {
|
|
||||||
when(mergeCommand.merge(any())).thenReturn(MergeCommandResult.failure(asList("file1", "file2")));
|
|
||||||
mockUser();
|
|
||||||
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL)
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(409);
|
|
||||||
assertThat(response.getContentAsString()).contains("file1", "file2");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldHandleSuccessfulDryRun() throws Exception {
|
|
||||||
when(subject.isPermitted("repository:push:" + repositoryService.getRepository().getId())).thenReturn(true);
|
|
||||||
when(mergeCommand.dryRun(any())).thenReturn(new MergeDryRunCommandResult(true));
|
|
||||||
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL + "dry-run/")
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldHandleFailedDryRun() throws Exception {
|
|
||||||
when(subject.isPermitted("repository:push:" + repositoryService.getRepository().getId())).thenReturn(true);
|
|
||||||
when(mergeCommand.dryRun(any())).thenReturn(new MergeDryRunCommandResult(false));
|
|
||||||
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL + "dry-run/")
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(409);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void shouldSkipDryRunIfSubjectHasNoPushPermission() throws Exception {
|
|
||||||
when(subject.isPermitted("repository:push:" + repositoryService.getRepository().getId())).thenReturn(false);
|
|
||||||
|
|
||||||
URL url = Resources.getResource("sonia/scm/api/v2/mergeCommand.json");
|
|
||||||
byte[] mergeCommandJson = Resources.toByteArray(url);
|
|
||||||
|
|
||||||
MockHttpRequest request = MockHttpRequest
|
|
||||||
.post(MERGE_URL + "dry-run/")
|
|
||||||
.content(mergeCommandJson)
|
|
||||||
.contentType(VndMediaType.MERGE_COMMAND);
|
|
||||||
MockHttpResponse response = new MockHttpResponse();
|
|
||||||
dispatcher.invoke(request, response);
|
|
||||||
|
|
||||||
assertThat(response.getStatus()).isEqualTo(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void mockUser() {
|
|
||||||
PrincipalCollection collection = mock(PrincipalCollection.class);
|
|
||||||
when(subject.getPrincipals()).thenReturn(collection);
|
|
||||||
when(collection.oneByType(User.class)).thenReturn(new User("dummy"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user