mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-10-28 00:56:10 +01:00
Add first integration tests for merge detection
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user