aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2016-12-05 18:09:49 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2016-12-06 11:48:59 +0100
commit79770fa02e75061a58db0b772f7afa1e4d224c79 (patch)
treefd746f1c2dc2e3a73d35b4b84f68d0ebf2740cc7 /server
parent8ec53d2ec4a53d29bc8406173e7b6051d58a0950 (diff)
downloadsonarqube-79770fa02e75061a58db0b772f7afa1e4d224c79.tar.gz
sonarqube-79770fa02e75061a58db0b772f7afa1e4d224c79.zip
SONAR-8450 Return quality gate in api/navigation/component WS
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java48
-rw-r--r--server/sonar-server/src/main/resources/org/sonar/server/ui/ws/example-component.json5
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java43
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_default_quality_gate.json6
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_quality_gate.json6
5 files changed, 96 insertions, 12 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java
index 953acd1a905..c19c8367b3e 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentNavigationAction.java
@@ -26,6 +26,9 @@ import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.sonar.api.i18n.I18n;
import org.sonar.api.resources.Qualifiers;
@@ -43,13 +46,17 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.SnapshotDto;
+import org.sonar.db.measure.MeasureDto;
import org.sonar.db.measure.MeasureQuery;
import org.sonar.db.property.PropertyDto;
import org.sonar.db.property.PropertyQuery;
+import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.ce.ws.ActivityAction;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.qualitygate.QualityGateFinder;
import org.sonar.server.qualityprofile.QPMeasureData;
+import org.sonar.server.qualityprofile.QualityProfile;
import org.sonar.server.ui.ViewProxy;
import org.sonar.server.ui.Views;
import org.sonar.server.user.UserSession;
@@ -77,15 +84,17 @@ public class ComponentNavigationAction implements NavigationWsAction {
private final ResourceTypes resourceTypes;
private final UserSession userSession;
private final ComponentFinder componentFinder;
+ private final QualityGateFinder qualityGateFinder;
public ComponentNavigationAction(DbClient dbClient, Views views, I18n i18n, ResourceTypes resourceTypes, UserSession userSession,
- ComponentFinder componentFinder) {
+ ComponentFinder componentFinder, QualityGateFinder qualityGateFinder) {
this.dbClient = dbClient;
this.views = views;
this.i18n = i18n;
this.resourceTypes = resourceTypes;
this.userSession = userSession;
this.componentFinder = componentFinder;
+ this.qualityGateFinder = qualityGateFinder;
}
@Override
@@ -117,6 +126,7 @@ public class ComponentNavigationAction implements NavigationWsAction {
json.beginObject();
writeComponent(json, session, component, analysis.orElse(null));
writeProfiles(json, session, component);
+ writeQualityGate(json, session, component);
if (userSession.hasComponentUuidPermission(ADMIN, component.projectUuid()) || userSession.hasPermission(QUALITY_PROFILE_ADMIN)) {
writeConfiguration(json, component);
}
@@ -154,16 +164,38 @@ public class ComponentNavigationAction implements NavigationWsAction {
private void writeProfiles(JsonWriter json, DbSession session, ComponentDto component) {
json.name("qualityProfiles").beginArray();
- dbClient.measureDao().selectSingle(session, MeasureQuery.builder().setComponentUuid(component.projectUuid()).setMetricKey(QUALITY_PROFILES_KEY).build()).ifPresent(
- measureDto -> QPMeasureData.fromJson(measureDto.getData()).getProfiles().forEach(
- profile -> json.beginObject()
- .prop("key", profile.getQpKey())
- .prop("name", profile.getQpName())
- .prop("language", profile.getLanguageKey())
- .endObject()));
+ dbClient.measureDao().selectSingle(session, MeasureQuery.builder().setComponentUuid(component.projectUuid()).setMetricKey(QUALITY_PROFILES_KEY).build())
+ .ifPresent(dbMeasure -> Stream.of(dbMeasure)
+ .flatMap(toQualityProfiles())
+ .forEach(writeToJson(json)));
json.endArray();
}
+ private static Consumer<QualityProfile> writeToJson(JsonWriter json) {
+ return profile -> json.beginObject()
+ .prop("key", profile.getQpKey())
+ .prop("name", profile.getQpName())
+ .prop("language", profile.getLanguageKey())
+ .endObject();
+ }
+
+ private static Function<MeasureDto, Stream<QualityProfile>> toQualityProfiles() {
+ return dbMeasure -> QPMeasureData.fromJson(dbMeasure.getData()).getProfiles().stream();
+ }
+
+ private void writeQualityGate(JsonWriter json, DbSession session, ComponentDto component) {
+ Optional<QualityGateFinder.QualityGateData> qualityGateData = qualityGateFinder.getQualityGate(session, component.getId());
+ if (!qualityGateData.isPresent()) {
+ return;
+ }
+ QualityGateDto qualityGateDto = qualityGateData.get().getQualityGate();
+ json.name("qualityGate").beginObject()
+ .prop("key", qualityGateDto.getId())
+ .prop("name", qualityGateDto.getName())
+ .prop("isDefault", qualityGateData.get().isDefault())
+ .endObject();
+ }
+
private void writeExtensions(JsonWriter json, ComponentDto component, List<ViewProxy<Page>> pages) {
json.name("extensions").beginArray();
for (ViewProxy<Page> page : pages) {
diff --git a/server/sonar-server/src/main/resources/org/sonar/server/ui/ws/example-component.json b/server/sonar-server/src/main/resources/org/sonar/server/ui/ws/example-component.json
index 797ea206a78..12d968f09a0 100644
--- a/server/sonar-server/src/main/resources/org/sonar/server/ui/ws/example-component.json
+++ b/server/sonar-server/src/main/resources/org/sonar/server/ui/ws/example-component.json
@@ -26,6 +26,11 @@
"url": "/plugins/resource/2865?page=my-resource-plugin"
}
],
+ "qualityGate": {
+ "key": "qg",
+ "name": "Sonar way",
+ "isDefault": false
+ },
"configuration": {
"showSettings": true,
"showQualityProfiles": true,
diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java
index 463dbd1c4bf..f2c597f8d80 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentNavigationActionTest.java
@@ -48,11 +48,13 @@ import org.sonar.db.component.SnapshotDto;
import org.sonar.db.metric.MetricDto;
import org.sonar.db.property.PropertyDbTester;
import org.sonar.db.property.PropertyDto;
+import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.db.user.UserDbTester;
import org.sonar.db.user.UserDto;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.qualitygate.QualityGateFinder;
import org.sonar.server.qualityprofile.QPMeasureData;
import org.sonar.server.qualityprofile.QualityProfile;
import org.sonar.server.tester.UserSessionRule;
@@ -60,6 +62,7 @@ import org.sonar.server.ui.Views;
import org.sonar.server.ws.WsActionTester;
import static java.util.Locale.ENGLISH;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
@@ -94,10 +97,10 @@ public class ComponentNavigationActionTest {
@Rule
public UserSessionRule userSessionRule = UserSessionRule.standalone();
- private ComponentDbTester componentDbTester = new ComponentDbTester(dbTester);
- private UserDbTester userDbTester = new UserDbTester(dbTester);
- private PropertyDbTester propertyDbTester = new PropertyDbTester(dbTester);
private DbClient dbClient = dbTester.getDbClient();
+ private ComponentDbTester componentDbTester = dbTester.components();
+ private UserDbTester userDbTester = dbTester.users();
+ private PropertyDbTester propertyDbTester = new PropertyDbTester(dbTester);
private I18n i18n = mock(I18n.class);
@@ -192,6 +195,37 @@ public class ComponentNavigationActionTest {
}
@Test
+ public void return_quality_gate_defined_on_project() throws Exception {
+ init();
+ componentDbTester.insertComponent(PROJECT);
+ QualityGateDto qualityGateDto = dbTester.qualityGates().insertQualityGate("Sonar way");
+ dbTester.qualityGates().associateProjectToQualityGate(PROJECT, qualityGateDto);
+ userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT.uuid());
+
+ executeAndVerify(PROJECT.key(), "return_quality_gate.json");
+ }
+
+ @Test
+ public void return_default_quality_gate() throws Exception {
+ init();
+ componentDbTester.insertComponent(PROJECT);
+ dbTester.qualityGates().createDefaultQualityGate("Sonar way");
+ userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT.uuid());
+
+ executeAndVerify(PROJECT.key(), "return_default_quality_gate.json");
+ }
+
+ @Test
+ public void return_no_quality_gate_when_not_defined_on_project_and_no_default_one() throws Exception {
+ init();
+ componentDbTester.insertComponent(PROJECT);
+ userSessionRule.addProjectUuidPermissions(UserRole.USER, PROJECT.uuid());
+
+ String json = execute(PROJECT.key());
+ assertThat(json).doesNotContain("qualityGate");
+ }
+
+ @Test
public void return_extensions() throws Exception {
init(createViews());
componentDbTester.insertProjectAndSnapshot(PROJECT);
@@ -324,7 +358,8 @@ public class ComponentNavigationActionTest {
}
private void init(View... views) {
- ws = new WsActionTester(new ComponentNavigationAction(dbClient, new Views(userSessionRule, views), i18n, resourceTypes, userSessionRule, new ComponentFinder(dbClient)));
+ ws = new WsActionTester(new ComponentNavigationAction(dbClient, new Views(userSessionRule, views), i18n, resourceTypes, userSessionRule, new ComponentFinder(dbClient),
+ new QualityGateFinder(dbClient)));
}
private String execute(String componentKey) {
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_default_quality_gate.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_default_quality_gate.json
new file mode 100644
index 00000000000..e721b5c6c3b
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_default_quality_gate.json
@@ -0,0 +1,6 @@
+{
+ "qualityGate": {
+ "name": "Sonar way",
+ "isDefault": true
+ }
+}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_quality_gate.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_quality_gate.json
new file mode 100644
index 00000000000..6a016b82507
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentNavigationActionTest/return_quality_gate.json
@@ -0,0 +1,6 @@
+{
+ "qualityGate": {
+ "name": "Sonar way",
+ "isDefault": false
+ }
+}