From: Julien Lancelot Date: Wed, 14 Feb 2018 16:30:03 +0000 (+0100) Subject: SONAR-10423 Add branch parameter in homepage of api/users WS X-Git-Tag: 7.5~1590 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=dfbb661fe6369a5e93da1dc04c4f5947b625dcd8;p=sonarqube.git SONAR-10423 Add branch parameter in homepage of api/users WS --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java index 788d85c86d1..588af51c919 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java @@ -107,7 +107,7 @@ public class CurrentAction implements UsersWsAction { .addAllGroups(groups) .addAllScmAccounts(user.getScmAccountsAsList()) .setPermissions(Permissions.newBuilder().addAllGlobal(getGlobalPermissions()).build()) - .setHomepage(findHomepageFor(dbSession, user)) + .setHomepage(buildHomepage(dbSession, user)) .setShowOnboardingTutorial(!user.isOnboarded()); setNullable(emptyToNull(user.getEmail()), builder::setEmail); setNullable(emptyToNull(user.getEmail()), u -> builder.setAvatar(avatarResolver.create(user))); @@ -124,7 +124,7 @@ public class CurrentAction implements UsersWsAction { .collect(toList()); } - private CurrentWsResponse.Homepage findHomepageFor(DbSession dbSession, UserDto user) { + private CurrentWsResponse.Homepage buildHomepage(DbSession dbSession, UserDto user) { String homepageType = user.getHomepageType(); if (homepageType == null) { return defaultHomepage(); @@ -143,6 +143,7 @@ public class CurrentAction implements UsersWsAction { throw new IllegalStateException(format("Unknown component '%s' for homepageParameter", homepageParameter)); }); homepage.setComponent(component.getKey()); + setNullable(component.getBranch(), homepage::setBranch); return; } if (ORGANIZATION.toString().equals(homepageType)) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java index a47dd3e9da5..d802cd6bcc3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java @@ -41,6 +41,7 @@ import static org.sonar.server.user.ws.HomepageType.ORGANIZATION; import static org.sonar.server.user.ws.HomepageType.PROJECT; import static org.sonar.server.user.ws.HomepageType.keys; import static org.sonar.server.user.ws.HomepageType.valueOf; +import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; public class SetHomepageAction implements UsersWsAction { @@ -50,6 +51,7 @@ public class SetHomepageAction implements UsersWsAction { private static final String PARAM_TYPE = "type"; private static final String PARAM_ORGANIZATION = "organization"; private static final String PARAM_COMPONENT = "component"; + private static final String PARAM_BRANCH = "branch"; private final UserSession userSession; private final DbClient dbClient; @@ -87,6 +89,12 @@ public class SetHomepageAction implements UsersWsAction { .setSince("7.1") .setDescription("Project key. It should only be used when parameter '%s' is set to '%s'", PARAM_TYPE, PROJECT) .setExampleValue(KEY_PROJECT_EXAMPLE_001); + + action.createParam(PARAM_BRANCH) + .setDescription("Branch key. It can only be used when parameter '%s' is set to '%s'", PARAM_TYPE, PROJECT) + .setExampleValue(KEY_BRANCH_EXAMPLE_001) + .setInternal(true) + .setSince("7.1"); } @Override @@ -97,7 +105,7 @@ public class SetHomepageAction implements UsersWsAction { String organizationParameter = request.param(PARAM_ORGANIZATION); try (DbSession dbSession = dbClient.openSession(false)) { - String parameter = getHomepageParameter(dbSession, type, componentParameter, organizationParameter); + String parameter = getHomepageParameter(dbSession, type, componentParameter, request.param(PARAM_BRANCH), organizationParameter); UserDto user = dbClient.userDao().selectActiveUserByLogin(dbSession, userSession.getLogin()); checkState(user != null, "User login '%s' cannot be found", userSession.getLogin()); @@ -112,11 +120,12 @@ public class SetHomepageAction implements UsersWsAction { } @CheckForNull - private String getHomepageParameter(DbSession dbSession, HomepageType type, @Nullable String componentParameter, @Nullable String organizationParameter) { + private String getHomepageParameter(DbSession dbSession, HomepageType type, @Nullable String componentParameter, @Nullable String branchParameter, + @Nullable String organizationParameter) { switch (type) { case PROJECT: checkArgument(isNotBlank(componentParameter), "Type %s requires a parameter '%s'", type.name(), PARAM_COMPONENT); - return componentFinder.getByKey(dbSession, componentParameter).uuid(); + return componentFinder.getByKeyAndOptionalBranch(dbSession, componentParameter, branchParameter).uuid(); case ORGANIZATION: checkArgument(isNotBlank(organizationParameter), "Type %s requires a parameter '%s'", type.name(), PARAM_ORGANIZATION); return dbClient.organizationDao().selectByKey(dbSession, organizationParameter) diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java index ad90b5f8443..8d58daa38a5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java @@ -26,6 +26,7 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentDto; import org.sonar.db.user.UserDto; import org.sonar.server.issue.ws.AvatarResolverImpl; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -66,8 +67,7 @@ public class CurrentActionTest { .setExternalIdentity("obiwan") .setExternalIdentityProvider("sonarqube") .setScmAccounts(newArrayList("obiwan:github", "obiwan:bitbucket")) - .setOnboarded(false) - .setHomepageType("MY_PROJECTS")); + .setOnboarded(false)); userSessionRule.logIn("obiwan.kenobi"); CurrentWsResponse response = call(); @@ -78,11 +78,6 @@ public class CurrentActionTest { CurrentWsResponse::getExternalIdentity, CurrentWsResponse::getExternalProvider, CurrentWsResponse::getScmAccountsList, CurrentWsResponse::getShowOnboardingTutorial) .containsExactly(true, "obiwan.kenobi", "Obiwan Kenobi", "obiwan.kenobi@starwars.com", "f5aa64437a1821ffe8b563099d506aef", true, "obiwan", "sonarqube", newArrayList("obiwan:github", "obiwan:bitbucket"), true); - - assertThat(response.getHomepage()).isNotNull(); - assertThat(response.getHomepage()).extracting(CurrentWsResponse.Homepage::getType) - .containsExactly(MY_PROJECTS); - } @Test @@ -149,6 +144,45 @@ public class CurrentActionTest { assertThat(response.getPermissions().getGlobalList()).containsOnly("profileadmin", "scan"); } + @Test + public void return_homepage_when_set_to_MY_PROJECTS() { + UserDto user = db.users().insertUser(u -> u.setHomepageType("MY_PROJECTS")); + userSessionRule.logIn(user); + + CurrentWsResponse response = call(); + + assertThat(response.getHomepage()) + .extracting(CurrentWsResponse.Homepage::getType) + .containsExactly(MY_PROJECTS); + } + + @Test + public void return_homepage_when_set_to_a_project() { + ComponentDto project = db.components().insertPrivateProject(); + UserDto user = db.users().insertUser(u -> u.setHomepageType("PROJECT").setHomepageParameter(project.uuid())); + userSessionRule.logIn(user); + + CurrentWsResponse response = call(); + + assertThat(response.getHomepage()) + .extracting(CurrentWsResponse.Homepage::getType, CurrentWsResponse.Homepage::getComponent) + .containsExactly(CurrentWsResponse.HomepageType.PROJECT, project.getKey()); + } + + @Test + public void return_homepage_when_set_to_a_branch() { + ComponentDto project = db.components().insertMainBranch(); + ComponentDto branch = db.components().insertProjectBranch(project); + UserDto user = db.users().insertUser(u -> u.setHomepageType("PROJECT").setHomepageParameter(branch.uuid())); + userSessionRule.logIn(user); + + CurrentWsResponse response = call(); + + assertThat(response.getHomepage()) + .extracting(CurrentWsResponse.Homepage::getType, CurrentWsResponse.Homepage::getComponent, CurrentWsResponse.Homepage::getBranch) + .containsExactly(CurrentWsResponse.HomepageType.PROJECT, branch.getKey(), branch.getBranch()); + } + @Test public void fail_with_ISE_when_user_login_in_db_does_not_exist() { db.users().insertUser(usert -> usert.setLogin("another")); @@ -199,7 +233,7 @@ public class CurrentActionTest { db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Jedi")), obiwan); db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Rebel")), obiwan); - db.components().insertPublicProject(u->u.setUuid("UUID-of-the-death-star"), u->u.setDbKey("death-star-key")); + db.components().insertPublicProject(u -> u.setUuid("UUID-of-the-death-star"), u -> u.setDbKey("death-star-key")); String response = ws.newRequest().execute().getInput(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java index 5c649cd27d5..aca3fd2a672 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java @@ -25,7 +25,6 @@ import org.junit.rules.ExpectedException; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.user.UserDto; @@ -37,7 +36,6 @@ import org.sonar.server.ws.WsActionTester; import static org.apache.http.HttpStatus.SC_NO_CONTENT; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; public class SetHomepageActionTest { @@ -64,7 +62,7 @@ public class SetHomepageActionTest { assertThat(action.description()).isEqualTo("Set homepage of current user.
Requires authentication."); assertThat(action.responseExample()).isNull(); assertThat(action.handler()).isSameAs(underTest); - assertThat(action.params()).hasSize(3); + assertThat(action.params()).hasSize(4); WebService.Param typeParam = action.param("type"); assertThat(typeParam.isRequired()).isTrue(); @@ -76,6 +74,12 @@ public class SetHomepageActionTest { assertThat(componentParam.description()).isEqualTo("Project key. It should only be used when parameter 'type' is set to 'PROJECT'"); assertThat(componentParam.since()).isEqualTo("7.1"); + WebService.Param branchParam = action.param("branch"); + assertThat(branchParam.isRequired()).isFalse(); + assertThat(branchParam.isInternal()).isTrue(); + assertThat(branchParam.description()).isEqualTo("Branch key. It can only be used when parameter 'type' is set to 'PROJECT'"); + assertThat(branchParam.since()).isEqualTo("7.1"); + WebService.Param organizationParam = action.param("organization"); assertThat(organizationParam.isRequired()).isFalse(); assertThat(organizationParam.description()).isEqualTo("Organization key. It should only be used when parameter 'type' is set to 'ORGANIZATION'"); @@ -85,7 +89,7 @@ public class SetHomepageActionTest { @Test public void set_project_homepage() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = new ComponentDbTester(db).insertComponent(newPrivateProjectDto(organization)); + ComponentDto project = db.components().insertPrivateProject(organization); UserDto user = db.users().insertUser(); userSession.logIn(user); @@ -102,6 +106,27 @@ public class SetHomepageActionTest { assertThat(actual.getHomepageParameter()).isEqualTo(project.uuid()); } + @Test + public void set_branch_homepage() { + OrganizationDto organization = db.organizations().insert(); + ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto branch = db.components().insertProjectBranch(project); + UserDto user = db.users().insertUser(); + userSession.logIn(user); + + ws.newRequest() + .setMethod("POST") + .setParam("type", "PROJECT") + .setParam("component", branch.getKey()) + .setParam("branch", branch.getBranch()) + .execute(); + + UserDto actual = db.getDbClient().userDao().selectByLogin(db.getSession(), user.getLogin()); + assertThat(actual).isNotNull(); + assertThat(actual.getHomepageType()).isEqualTo("PROJECT"); + assertThat(actual.getHomepageParameter()).isEqualTo(branch.uuid()); + } + @Test public void set_organization_homepage() { OrganizationDto organization = db.organizations().insert(); diff --git a/sonar-ws/src/main/protobuf/ws-users.proto b/sonar-ws/src/main/protobuf/ws-users.proto index 35243f08a2f..e949f00b351 100644 --- a/sonar-ws/src/main/protobuf/ws-users.proto +++ b/sonar-ws/src/main/protobuf/ws-users.proto @@ -125,5 +125,6 @@ message CurrentWsResponse { optional HomepageType type = 1; optional string component = 2; optional string organization = 3; + optional string branch = 4; } }