]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10423 Add branch parameter in homepage of api/users WS
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 14 Feb 2018 16:30:03 +0000 (17:30 +0100)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Fri, 2 Mar 2018 12:17:32 +0000 (13:17 +0100)
server/sonar-server/src/main/java/org/sonar/server/user/ws/CurrentAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java
sonar-ws/src/main/protobuf/ws-users.proto

index 788d85c86d1fb1a40e4c265050835c2b7123b31f..588af51c919f816d41f196ce0c2a1e7274e6cb23 100644 (file)
@@ -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)) {
index a47dd3e9da5b80d380b685832a3353f380214830..d802cd6bcc3dfdbc2eec42725ee83efbf6b0b26a 100644 (file)
@@ -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)
index ad90b5f84436f172627f07977d40deabef3beecf..8d58daa38a5353748e0089c0f9d48d2ed456072a 100644 (file)
@@ -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();
 
index 5c649cd27d5be6a9e3c1cfa943f5ab1054f7311d..aca3fd2a672e00e580dbc687a8ee5f3bcba4ed8a 100644 (file)
@@ -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.<br> 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();
index 35243f08a2ff37c31d65693c4236a7417c663bc0..e949f00b35155ccec0dfa0b1831102433617176f 100644 (file)
@@ -125,5 +125,6 @@ message CurrentWsResponse {
     optional HomepageType type = 1;
     optional string component = 2;
     optional string organization = 3;
+    optional string branch = 4;
   }
 }