Add first integration tests for merge detection

This commit is contained in:
René Pfeuffer
2020-08-06 14:40:43 +02:00
parent 072d8f15c9
commit 6f20781812
21 changed files with 1071 additions and 7 deletions

View File

@@ -0,0 +1,113 @@
/*
* MIT License
*
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.it.resource;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Links;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.Getter;
import lombok.Setter;
import sonia.scm.api.v2.resources.LinkBuilder;
import sonia.scm.api.v2.resources.ScmPathInfoStore;
import sonia.scm.plugin.Extension;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import static de.otto.edison.hal.Embedded.embeddedBuilder;
import static de.otto.edison.hal.Links.linkingTo;
/**
* Web Service Resource to support integration tests.
*/
@OpenAPIDefinition(tags = {
@Tag(name = "Integration Test", description = "Support for integration tests")
})
@Path(IntegrationTestResource.INTEGRATION_TEST_PATH_V2)
@Extension
public class IntegrationTestResource {
static final String INTEGRATION_TEST_PATH_V2 = "v2/integration-test";
private final ScmPathInfoStore scmPathInfoStore;
private final MergeDetectionHelper mergeDetectionHelper;
@Inject
public IntegrationTestResource(ScmPathInfoStore scmPathInfoStore, MergeDetectionHelper mergeDetectionHelper) {
this.scmPathInfoStore = scmPathInfoStore;
this.mergeDetectionHelper = mergeDetectionHelper;
}
@GET
@Path("")
@Produces("application/json")
public CollectionDto get() {
Links links = linkingTo()
.self(self())
.build();
Embedded embedded = embeddedBuilder()
.with("preMergeDetection", mergeDetectionHelper.getPreMergeDetections())
.with("postMergeDetection", mergeDetectionHelper.getPostMergeDetections())
.build();
return new CollectionDto(links, embedded);
}
@POST
@Path("merge-detection")
@Consumes("application/json")
public void initMergeDetection(MergeDetectionConfigurationDto mergeDetectionConfiguration) {
mergeDetectionHelper.initialize(mergeDetectionConfiguration.getTarget(), mergeDetectionConfiguration.getBranch());
}
private String self() {
LinkBuilder linkBuilder = new LinkBuilder(scmPathInfoStore.get(), IntegrationTestResource.class);
return linkBuilder.method("get").parameters().href();
}
static class CollectionDto extends HalRepresentation {
CollectionDto(Links links, Embedded embedded) {
super(links, embedded);
}
@Override
protected HalRepresentation withEmbedded(String rel, HalRepresentation embeddedItem) {
return super.withEmbedded(rel, embeddedItem);
}
}
@Getter
@Setter
static class MergeDetectionConfigurationDto {
private String target;
private String branch;
}
}

View File

@@ -0,0 +1,101 @@
/*
* MIT License
*
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.it.resource;
import com.github.legman.Subscribe;
import de.otto.edison.hal.HalRepresentation;
import lombok.AllArgsConstructor;
import lombok.Getter;
import sonia.scm.EagerSingleton;
import sonia.scm.plugin.Extension;
import sonia.scm.repository.PostReceiveRepositoryHookEvent;
import sonia.scm.repository.PreReceiveRepositoryHookEvent;
import sonia.scm.repository.RepositoryHookEvent;
import sonia.scm.repository.spi.HookMergeDetectionProvider;
import java.util.ArrayList;
import java.util.List;
@EagerSingleton
@Extension
public class MergeDetectionHelper {
private final List<ResultDto> preMergeDetections = new ArrayList<>();
private final List<ResultDto> postMergeDetections = new ArrayList<>();
private String target;
private String branch;
@Subscribe
public void handlePreReceiveEvent(PreReceiveRepositoryHookEvent event) {
if (target == null || branch == null) {
return;
}
preMergeDetections.add(createDto(event));
}
@Subscribe
public void handlePostReceiveEvent(PostReceiveRepositoryHookEvent event) {
if (target == null || branch == null) {
return;
}
postMergeDetections.add(createDto(event));
}
public ResultDto createDto(RepositoryHookEvent event) {
HookMergeDetectionProvider mergeDetectionProvider = event.getContext().getMergeDetectionProvider();
boolean merged = mergeDetectionProvider.branchesMerged(target, branch);
return new ResultDto(
event.getClass().getSimpleName(),
event.getRepository().getNamespace(),
event.getRepository().getName(),
merged
);
}
void initialize(String target, String branch) {
this.target = target;
this.branch = branch;
preMergeDetections.clear();
postMergeDetections.clear();
}
public List<ResultDto> getPreMergeDetections() {
return preMergeDetections;
}
public List<ResultDto> getPostMergeDetections() {
return postMergeDetections;
}
@Getter
@AllArgsConstructor
static class ResultDto extends HalRepresentation {
private String type;
private String namespace;
private String name;
private boolean merged;
}
}