diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-12-05 18:09:49 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-12-06 11:48:59 +0100 |
commit | 79770fa02e75061a58db0b772f7afa1e4d224c79 (patch) | |
tree | fd746f1c2dc2e3a73d35b4b84f68d0ebf2740cc7 /server | |
parent | 8ec53d2ec4a53d29bc8406173e7b6051d58a0950 (diff) | |
download | sonarqube-79770fa02e75061a58db0b772f7afa1e4d224c79.tar.gz sonarqube-79770fa02e75061a58db0b772f7afa1e4d224c79.zip |
SONAR-8450 Return quality gate in api/navigation/component WS
Diffstat (limited to 'server')
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 + } +} |