From a7a57bdc88427dad381ed294cfef9d041b07d451 Mon Sep 17 00:00:00 2001 From: Michal Duda Date: Thu, 11 Mar 2021 16:56:02 +0100 Subject: SONAR-13703 api/measures/component_tree returns an SVW qualifier for Applications --- .../server/measure/ws/ComponentTreeAction.java | 12 +++++++ .../server/measure/ws/ComponentTreeActionTest.java | 42 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) (limited to 'server') diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java index cbd139a13b7..e56d72b6770 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java @@ -374,6 +374,8 @@ public class ComponentTreeAction implements MeasuresWsAction { ComponentDto referenceComponent = referenceComponentsByUuid.get(component.getCopyResourceUuid()); if (referenceComponent != null) { wsComponent.setRefKey(referenceComponent.getKey()); + String displayQualifier = getDisplayQualifier(component, referenceComponent); + wsComponent.setQualifier(displayQualifier); } Measures.Measure.Builder measureBuilder = Measures.Measure.newBuilder(); for (Map.Entry entry : measures.entrySet()) { @@ -385,6 +387,16 @@ public class ComponentTreeAction implements MeasuresWsAction { return wsComponent; } + // https://jira.sonarsource.com/browse/SONAR-13703 - for apps that were added as a local reference to a portfolio, we want to + // show them as apps, not sub-portfolios + private static String getDisplayQualifier(ComponentDto component, ComponentDto referenceComponent) { + String qualifier = component.qualifier(); + if (qualifier.equals(Qualifiers.SUBVIEW) && referenceComponent.qualifier().equals(Qualifiers.APP)) { + return Qualifiers.APP; + } + return qualifier; + } + private ComponentTreeData load(ComponentTreeRequest wsRequest) { try (DbSession dbSession = dbClient.openSession(false)) { ComponentDto baseComponent = loadComponent(dbSession, wsRequest); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java index ace3cf74fec..26e4c6f5479 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java @@ -73,6 +73,8 @@ import static org.sonar.db.component.BranchType.PULL_REQUEST; import static org.sonar.db.component.ComponentTesting.newDirectory; import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.component.ComponentTesting.newProjectCopy; +import static org.sonar.db.component.ComponentTesting.newSubView; +import static org.sonar.db.component.ComponentTesting.newView; import static org.sonar.db.component.SnapshotTesting.newAnalysis; import static org.sonar.server.component.ws.MeasuresWsParameters.ADDITIONAL_PERIOD; import static org.sonar.server.component.ws.MeasuresWsParameters.DEPRECATED_ADDITIONAL_PERIODS; @@ -657,6 +659,46 @@ public class ComponentTreeActionTest { .containsExactlyInAnyOrder(tuple(projectCopy.getKey(), project.getKey())); } + @Test + public void portfolio_local_reference_in_portfolio() { + ComponentDto view = db.components().insertComponent(newView("VIEW1-UUID").setDbKey("Apache-Projects").setName("Apache Projects")); + ComponentDto view2 = db.components().insertPrivatePortfolio(); + ComponentDto localView = db.components().insertComponent( + newSubView(view, "SUB-VIEW-UUID", "All-Projects").setName("All projects").setCopyComponentUuid(view2.uuid())); + db.components().insertSnapshot(view); + MetricDto ncloc = insertNclocMetric(); + db.measures().insertLiveMeasure(localView, ncloc, m -> m.setValue(5d)); + + ComponentTreeWsResponse result = ws.newRequest() + .setParam(PARAM_COMPONENT, view.getKey()) + .setParam(PARAM_METRIC_KEYS, ncloc.getKey()) + .executeProtobuf(ComponentTreeWsResponse.class); + + assertThat(result.getComponentsList()) + .extracting(Component::getKey, Component::getRefKey, Component::getQualifier) + .containsExactlyInAnyOrder(tuple(localView.getKey(), view2.getKey(), "SVW")); + } + + @Test + public void application_local_reference_in_portfolio() { + ComponentDto view = db.components().insertComponent(newView("VIEW1-UUID").setDbKey("Apache-Projects").setName("Apache Projects")); + ComponentDto application = db.components().insertPrivateApplication(); + ComponentDto localView = db.components().insertComponent( + newSubView(view, "SUB-VIEW-UUID", "All-Projects").setName("All projects").setCopyComponentUuid(application.uuid())); + db.components().insertSnapshot(view); + MetricDto ncloc = insertNclocMetric(); + db.measures().insertLiveMeasure(localView, ncloc, m -> m.setValue(5d)); + + ComponentTreeWsResponse result = ws.newRequest() + .setParam(PARAM_COMPONENT, view.getKey()) + .setParam(PARAM_METRIC_KEYS, ncloc.getKey()) + .executeProtobuf(ComponentTreeWsResponse.class); + + assertThat(result.getComponentsList()) + .extracting(Component::getKey, Component::getRefKey, Component::getQualifier) + .containsExactlyInAnyOrder(tuple(localView.getKey(), application.getKey(), "APP")); + } + @Test public void project_branch_reference_from_application_branch() { MetricDto ncloc = insertNclocMetric(); -- cgit v1.2.3