Pārlūkot izejas kodu

SONAR-9551 WS api/project_analyses/create_event allows application

tags/6.6-RC1
Teryk Bellahsene pirms 6 gadiem
vecāks
revīzija
1eb306c7ef

+ 18
- 5
server/sonar-server/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java Parādīt failu

@@ -19,7 +19,9 @@
*/
package org.sonar.server.projectanalysis.ws;

import com.google.common.collect.ImmutableSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
import org.sonar.api.resources.Qualifiers;
@@ -57,6 +59,8 @@ import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameter
import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_NAME;

public class CreateEventAction implements ProjectAnalysesWsAction {
private static final Set<String> ALLOWED_QUALIFIERS = ImmutableSet.of(Qualifiers.PROJECT, Qualifiers.APP);

private final DbClient dbClient;
private final UuidFactory uuidFactory;
private final System2 system;
@@ -112,6 +116,8 @@ public class CreateEventAction implements ProjectAnalysesWsAction {
private CreateEventResponse doHandle(CreateEventRequest request) {
try (DbSession dbSession = dbClient.openSession(false)) {
SnapshotDto analysis = getAnalysis(dbSession, request);
ComponentDto project = getProjectOrApplication(dbSession, analysis);
checkRequest(request, project);
checkExistingDbEvents(dbSession, request, analysis);
EventDto dbEvent = insertDbEvent(dbSession, request, analysis);
return toCreateEventResponse(dbEvent);
@@ -129,14 +135,21 @@ public class CreateEventAction implements ProjectAnalysesWsAction {
}

private SnapshotDto getAnalysis(DbSession dbSession, CreateEventRequest request) {
SnapshotDto analysis = dbClient.snapshotDao().selectByUuid(dbSession, request.getAnalysis())
return dbClient.snapshotDao().selectByUuid(dbSession, request.getAnalysis())
.orElseThrow(() -> new NotFoundException(format("Analysis '%s' is not found", request.getAnalysis())));
}

private ComponentDto getProjectOrApplication(DbSession dbSession, SnapshotDto analysis) {
ComponentDto project = dbClient.componentDao().selectByUuid(dbSession, analysis.getComponentUuid()).orNull();
checkState(project != null, "Project of analysis '%s' is not found", analysis.getUuid());
userSession.checkComponentPermission(UserRole.ADMIN, project);
checkArgument(Qualifiers.PROJECT.equals(project.qualifier()) && Scopes.PROJECT.equals(project.scope()),
"An event must be created on a project");
return analysis;
checkArgument(ALLOWED_QUALIFIERS.contains(project.qualifier()) && Scopes.PROJECT.equals(project.scope()),
"An event must be created on a project or an application");
return project;
}

private void checkRequest(CreateEventRequest request, ComponentDto component) {
userSession.checkComponentPermission(UserRole.ADMIN, component);
checkArgument(EventCategory.VERSION != request.getCategory() || Qualifiers.PROJECT.equals(component.qualifier()), "A version event must be created on a project");
}

private static CreateEventRequest toAddEventRequest(Request request) {

+ 36
- 4
server/sonar-server/src/test/java/org/sonar/server/projectanalysis/ws/CreateEventActionTest.java Parādīt failu

@@ -50,6 +50,7 @@ import org.sonarqube.ws.client.projectanalysis.CreateEventRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.db.component.ComponentTesting.newApplication;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.component.ComponentTesting.newView;
import static org.sonar.db.component.SnapshotTesting.newAnalysis;
@@ -197,6 +198,22 @@ public class CreateEventActionTest {
assertThat(event.hasDescription()).isFalse();
}

@Test
public void create_event_on_application() {
ComponentDto application = ComponentTesting.newApplication(db.getDefaultOrganization());
SnapshotDto analysis = db.components().insertProjectAndSnapshot(application);
CreateEventRequest.Builder request = CreateEventRequest.builder()
.setAnalysis(analysis.getUuid())
.setCategory(OTHER)
.setName("Application Event");
logInAsProjectAdministrator(application);

CreateEventResponse result = call(request);

ProjectAnalyses.Event event = result.getEvent();
assertThat(event.getName()).isEqualTo("Application Event");
}

@Test
public void create_2_version_events_on_same_project() {
ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert());
@@ -297,18 +314,33 @@ public class CreateEventActionTest {
}

@Test
public void fail_if_create_on_other_than_a_project() {
public void fail_if_create_on_view() {
ComponentDto view = newView(db.organizations().insert());
SnapshotDto analysis = db.components().insertViewAndSnapshot(view);
CreateEventRequest.Builder request = CreateEventRequest.builder()
.setAnalysis(analysis.getUuid())
.setCategory(VERSION)
.setName("5.6.3");
.setCategory(OTHER)
.setName("View Event");
logInAsProjectAdministrator(view);

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("An event must be created on a project");
expectedException.expectMessage("An event must be created on a project or an application");

call(request);
}

@Test
public void fail_if_create_version_event_on_application() {
ComponentDto application = newApplication(db.organizations().insert());
SnapshotDto analysis = db.components().insertViewAndSnapshot(application);
CreateEventRequest.Builder request = CreateEventRequest.builder()
.setAnalysis(analysis.getUuid())
.setCategory(VERSION)
.setName("5.6.3");
logInAsProjectAdministrator(application);

expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("A version event must be created on a project");

call(request);
}

Notiek ielāde…
Atcelt
Saglabāt