]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7287 WS api/favorites/add fails when a component is already favorite
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 21 Dec 2016 16:39:18 +0000 (17:39 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Wed, 21 Dec 2016 16:53:01 +0000 (17:53 +0100)
server/sonar-server/src/main/java/org/sonar/server/component/DefaultRubyComponentService.java
server/sonar-server/src/main/java/org/sonar/server/computation/queue/ReportSubmitter.java
server/sonar-server/src/main/java/org/sonar/server/favorite/FavoriteUpdater.java
server/sonar-server/src/main/java/org/sonar/server/favorite/ws/AddAction.java
server/sonar-server/src/test/java/org/sonar/server/component/DefaultRubyComponentServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/queue/ReportSubmitterTest.java
server/sonar-server/src/test/java/org/sonar/server/favorite/FavoriteUpdaterTest.java

index c031791764035fcecf5797074b8ccbe7f3247d1e..9d3ac588b4089e1e962ea95940f574afbb6aeffb 100644 (file)
@@ -88,7 +88,7 @@ public class DefaultRubyComponentService implements RubyComponentService {
     permissionTemplateService.applyDefaultPermissionTemplate(dbSession, provisionedComponent.getKey());
     if (Qualifiers.PROJECT.equals(provisionedComponent.qualifier())
       && permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, provisionedComponent)) {
-      favoriteUpdater.add(dbSession, provisionedComponent.getId());
+      favoriteUpdater.add(dbSession, provisionedComponent);
       dbSession.commit();
     }
 
index fcc65c09da4fe73cf1325d22debc72607b8f0b38..0fda8c44569068f2f74a559c0030f87a7ed9af2b 100644 (file)
@@ -88,7 +88,7 @@ public class ReportSubmitter {
     // "provisioning" permission is check in ComponentService
     ComponentDto project = componentService.create(dbSession, newProject);
     if (permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, project)) {
-      favoriteUpdater.add(dbSession, project.getId());
+      favoriteUpdater.add(dbSession, project);
       dbSession.commit();
     }
 
index 067ca40bdb8637f9cd1e6790dd361e57f2cac159..6851a9aeb8b5672ee9202e13df86c4aea5108b28 100644 (file)
 
 package org.sonar.server.favorite;
 
+import java.util.List;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.property.PropertyDto;
+import org.sonar.db.property.PropertyQuery;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.user.UserSession;
 
@@ -43,14 +45,20 @@ public class FavoriteUpdater {
   /**
    * Set favorite to the logged in user. If no user is logged, no action is done
    */
-  public void add(DbSession dbSession, long componentDtoId) {
+  public void add(DbSession dbSession, ComponentDto componentDto) {
     if (!userSession.isLoggedIn()) {
       return;
     }
 
+    List<PropertyDto> existingFavoriteOnComponent = dbClient.propertiesDao().selectByQuery(PropertyQuery.builder()
+      .setKey(PROP_FAVORITE_KEY)
+      .setUserId(userSession.getUserId())
+      .setComponentId(componentDto.getId())
+      .build(), dbSession);
+    checkRequest(existingFavoriteOnComponent.isEmpty(), "Component '%s' is already a favorite", componentDto.getKey());
     dbClient.propertiesDao().saveProperty(dbSession, new PropertyDto()
       .setKey(PROP_FAVORITE_KEY)
-      .setResourceId(componentDtoId)
+      .setResourceId(componentDto.getId())
       .setUserId(Long.valueOf(userSession.getUserId())));
   }
 
index a834320a05fc5cf7a6087960525aa5678255958b..271df58b3fa7850ee9e8772d66349015725c3f16 100644 (file)
@@ -76,7 +76,7 @@ public class AddAction implements FavoritesWsAction {
         userSession
           .checkLoggedIn()
           .checkComponentUuidPermission(UserRole.USER, componentDto.uuid());
-        favoriteUpdater.add(dbSession, componentDto.getId());
+        favoriteUpdater.add(dbSession, componentDto);
         dbSession.commit();
       }
     };
index d4c44bc4961f2a43eb8fcb91283f077b3a6adcde..a558c7b0783b6d36f3fec157b8dcbc4c3766276e 100644 (file)
@@ -117,7 +117,7 @@ public class DefaultRubyComponentServiceTest {
     assertThat(project.qualifier()).isEqualTo(qualifier);
     assertThat(project.getId()).isEqualTo(result);
     verify(permissionTemplateService).applyDefaultPermissionTemplate(any(DbSession.class), eq(componentKey));
-    verify(favoriteUpdater).add(any(DbSession.class), eq(project.getId()));
+    verify(favoriteUpdater).add(any(DbSession.class), eq(project));
   }
 
   @Test(expected = BadRequestException.class)
index 5953cf80bb93036a7321b31e5c87b4ec64f6ee0c..ef5839bb0b0b866c0b95dcc74281fb2cf4b651f5 100644 (file)
@@ -119,7 +119,7 @@ public class ReportSubmitterTest {
 
     verifyReportIsPersisted(TASK_UUID);
     verify(permissionTemplateService).applyDefault(any(DbSession.class), eq(createdProject), anyLong());
-    verify(favoriteUpdater).add(any(DbSession.class), eq(createdProject.getId()));
+    verify(favoriteUpdater).add(any(DbSession.class), eq(createdProject));
     verify(queue).submit(argThat(new TypeSafeMatcher<CeTaskSubmit>() {
       @Override
       protected boolean matchesSafely(CeTaskSubmit submit) {
index 74560b17558c5325916392c86cfc25e422c9dfdb..b7cff48b1768641c32c18ebaea2c6fcea519822a 100644 (file)
@@ -22,21 +22,29 @@ package org.sonar.server.favorite;
 
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.sonar.api.utils.System2;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDto;
 import org.sonar.db.property.PropertyQuery;
+import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.tester.UserSessionRule;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.db.component.ComponentTesting.newProjectDto;
 
 public class FavoriteUpdaterTest {
   private static final long COMPONENT_ID = 23L;
+  private static final String COMPONENT_KEY = "K1";
+  private static final ComponentDto COMPONENT = newProjectDto().setId(COMPONENT_ID).setKey(COMPONENT_KEY);
   private static final long USER_ID = 42L;
 
   @Rule
   public UserSessionRule userSession = UserSessionRule.standalone().login().setUserId((int) USER_ID);
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
 
   @Rule
   public DbTester db = DbTester.create(System2.INSTANCE);
@@ -49,7 +57,7 @@ public class FavoriteUpdaterTest {
   public void put_favorite() {
     assertNoFavorite();
 
-    underTest.add(dbSession, COMPONENT_ID);
+    underTest.add(dbSession, COMPONENT);
 
     assertFavorite();
   }
@@ -58,19 +66,20 @@ public class FavoriteUpdaterTest {
   public void do_nothing_when_not_logged_in() {
     userSession.anonymous();
 
-    underTest.add(dbSession, COMPONENT_ID);
+    underTest.add(dbSession, COMPONENT);
 
     assertNoFavorite();
   }
 
   @Test
-  public void put_existing_favorite() {
-    underTest.add(dbSession, COMPONENT_ID);
+  public void fail_when_adding_existing_favorite() {
+    underTest.add(dbSession, COMPONENT);
     assertFavorite();
 
-    underTest.add(dbSession, COMPONENT_ID);
+    expectedException.expect(BadRequestException.class);
+    expectedException.expectMessage("Component 'K1' is already a favorite");
 
-    assertFavorite();
+    underTest.add(dbSession, COMPONENT);
   }
 
   private void assertFavorite() {