From 1a1cf6f989c0957160a71c78b83053a453dfba68 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Mon, 6 Aug 2018 11:55:40 +0200 Subject: [PATCH] SONAR-11039 Fix api/navigation/component to return ALM infos on branches --- .../sonar/server/ui/ws/ComponentAction.java | 16 +++++++-- .../server/ui/ws/ComponentActionTest.java | 34 +++++++++++++++++-- .../return_alm_infos_on_branch.json | 10 ++++++ .../return_alm_infos_on_module.json | 8 +++++ .../return_alm_infos_on_project.json | 9 +++++ .../return_component_info_with_alm.json | 16 --------- 6 files changed, 71 insertions(+), 22 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_branch.json create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_module.json create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_project.json delete mode 100644 server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java index b526c287961..e67b014dc30 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/ws/ComponentAction.java @@ -145,7 +145,9 @@ public class ComponentAction implements NavigationWsAction { String branch = request.param(PARAM_BRANCH); String pullRequest = request.param(PARAM_PULL_REQUEST); ComponentDto component = componentFinder.getByKeyAndOptionalBranchOrPullRequest(session, componentKey, branch, pullRequest); - ComponentDto project = component.getMainBranchProjectUuid() == null ? component : componentFinder.getByUuid(session, component.getMainBranchProjectUuid()); + ComponentDto rootProjectOrBranch = getRootProjectOrBranch(component, session); + ComponentDto rootProject = rootProjectOrBranch.getMainBranchProjectUuid() == null ? rootProjectOrBranch + : componentFinder.getByUuid(session, rootProjectOrBranch.getMainBranchProjectUuid()); if (!userSession.hasComponentPermission(USER, component) && !userSession.hasComponentPermission(ADMIN, component) && !userSession.isSystemAdministrator()) { @@ -157,9 +159,9 @@ public class ComponentAction implements NavigationWsAction { JsonWriter json = response.newJsonWriter(); json.beginObject(); writeComponent(json, session, component, org, analysis.orElse(null)); - writeAlmDetails(json, session, component); + writeAlmDetails(json, session, rootProject); writeProfiles(json, session, component); - writeQualityGate(json, session, org, project); + writeQualityGate(json, session, org, rootProject); if (userSession.hasComponentPermission(ADMIN, component) || userSession.hasPermission(ADMINISTER_QUALITY_PROFILES, org) || userSession.hasPermission(ADMINISTER_QUALITY_GATES, org)) { @@ -170,6 +172,14 @@ public class ComponentAction implements NavigationWsAction { } } + private ComponentDto getRootProjectOrBranch(ComponentDto component, DbSession session) { + if (!component.isRootProject()) { + return dbClient.componentDao().selectOrFailByUuid(session, component.projectUuid()); + } else { + return component; + } + } + private void writeAlmDetails(JsonWriter json, DbSession session, ComponentDto component) { Optional bindingOpt = dbClient.projectAlmBindingsDao().selectByProjectUuid(session, component.uuid()); bindingOpt.ifPresent(b -> json.prop("almId", b.getAlmId()) diff --git a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java index 4465e76135b..6c190302f17 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java @@ -35,6 +35,7 @@ import org.sonar.api.web.page.Page; import org.sonar.api.web.page.Page.Qualifier; import org.sonar.api.web.page.PageDefinition; import org.sonar.core.component.DefaultResourceTypes; +import org.sonar.core.extension.CoreExtensionRepository; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; import org.sonar.db.DbClient; @@ -55,7 +56,6 @@ 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.core.extension.CoreExtensionRepository; import org.sonar.server.organization.BillingValidations; import org.sonar.server.organization.BillingValidationsProxy; import org.sonar.server.qualitygate.QualityGateFinder; @@ -589,14 +589,42 @@ public class ComponentActionTest { } @Test - public void return_component_alm_info() { + public void return_alm_info_on_project() { + ComponentDto project = insertOrganizationAndProject(); + dbClient.projectAlmBindingsDao().insertOrUpdate(db.getSession(), ALM.BITBUCKETCLOUD, "{123456789}", project.uuid(), null, "http://bitbucket.org/foo/bar"); + db.getSession().commit(); + userSession.addProjectPermission(UserRole.USER, project); + init(); + + executeAndVerify(project.getDbKey(), "return_alm_infos_on_project.json"); + } + + @Test + public void return_alm_info_on_module() { ComponentDto project = insertOrganizationAndProject(); + ComponentDto module = componentDbTester.insertComponent(newModuleDto("bcde", project).setDbKey("palap").setName("Palap")); dbClient.projectAlmBindingsDao().insertOrUpdate(db.getSession(), ALM.BITBUCKETCLOUD, "{123456789}", project.uuid(), null, "http://bitbucket.org/foo/bar"); db.getSession().commit(); userSession.addProjectPermission(UserRole.USER, project); init(); - executeAndVerify(project.getDbKey(), "return_component_info_with_alm.json"); + executeAndVerify(module.getDbKey(), "return_alm_infos_on_module.json"); + } + + @Test + public void return_alm_info_on_branch() { + ComponentDto project = insertOrganizationAndProject(); + ComponentDto branch = componentDbTester.insertProjectBranch(project, b -> b.setKey("feature1").setUuid("xyz")); + dbClient.projectAlmBindingsDao().insertOrUpdate(db.getSession(), ALM.BITBUCKETCLOUD, "{123456789}", project.uuid(), null, "http://bitbucket.org/foo/bar"); + db.getSession().commit(); + userSession.addProjectPermission(UserRole.USER, project); + init(); + + verify(ws.newRequest() + .setParam("componentKey", project.getDbKey()) + .setParam("branch", branch.getBranch()) + .execute() + .getInput(), "return_alm_infos_on_branch.json"); } private ComponentDto insertOrganizationAndProject() { diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_branch.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_branch.json new file mode 100644 index 00000000000..968b1094a5c --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_branch.json @@ -0,0 +1,10 @@ +{ + "organization": "my-org", + "key": "polop", + "id": "xyz", + "branch": "feature1", + "name": "Polop", + "description": "test project", + "almId": "bitbucketcloud", + "almRepoUrl": "http://bitbucket.org/foo/bar" +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_module.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_module.json new file mode 100644 index 00000000000..0078c9f13c4 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_module.json @@ -0,0 +1,8 @@ +{ + "organization": "my-org", + "key": "palap", + "id": "bcde", + "name": "Palap", + "almId": "bitbucketcloud", + "almRepoUrl": "http://bitbucket.org/foo/bar" +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_project.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_project.json new file mode 100644 index 00000000000..6ac04350a84 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_alm_infos_on_project.json @@ -0,0 +1,9 @@ +{ + "organization": "my-org", + "key": "polop", + "id": "abcd", + "name": "Polop", + "description": "test project", + "almId": "bitbucketcloud", + "almRepoUrl": "http://bitbucket.org/foo/bar" +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json b/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json deleted file mode 100644 index e28c5cfb2a0..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/ui/ws/ComponentActionTest/return_component_info_with_alm.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "organization": "my-org", - "key": "polop", - "id": "abcd", - "name": "Polop", - "description": "test project", - "almId": "bitbucketcloud", - "almRepoUrl": "http://bitbucket.org/foo/bar", - "breadcrumbs": [ - { - "key": "polop", - "name": "Polop", - "qualifier": "TRK" - } - ] -} -- 2.39.5