Skip to content

Commit

Permalink
SONAR-7287 WS api/favorites/add fails when a component is already fav…
Browse files Browse the repository at this point in the history
…orite
  • Loading branch information
teryk committed Dec 21, 2016
1 parent d24f6e9 commit 7c0c2c6
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 13 deletions.
Expand Up @@ -88,7 +88,7 @@ public long createComponent(DbSession dbSession, String key, @Nullable String br
permissionTemplateService.applyDefaultPermissionTemplate(dbSession, provisionedComponent.getKey()); permissionTemplateService.applyDefaultPermissionTemplate(dbSession, provisionedComponent.getKey());
if (Qualifiers.PROJECT.equals(provisionedComponent.qualifier()) if (Qualifiers.PROJECT.equals(provisionedComponent.qualifier())
&& permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, provisionedComponent)) { && permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, provisionedComponent)) {
favoriteUpdater.add(dbSession, provisionedComponent.getId()); favoriteUpdater.add(dbSession, provisionedComponent);
dbSession.commit(); dbSession.commit();
} }


Expand Down
Expand Up @@ -88,7 +88,7 @@ private ComponentDto createProject(DbSession dbSession, String projectKey, @Null
// "provisioning" permission is check in ComponentService // "provisioning" permission is check in ComponentService
ComponentDto project = componentService.create(dbSession, newProject); ComponentDto project = componentService.create(dbSession, newProject);
if (permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, project)) { if (permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, project)) {
favoriteUpdater.add(dbSession, project.getId()); favoriteUpdater.add(dbSession, project);
dbSession.commit(); dbSession.commit();
} }


Expand Down
Expand Up @@ -20,10 +20,12 @@


package org.sonar.server.favorite; package org.sonar.server.favorite;


import java.util.List;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.property.PropertyDto; import org.sonar.db.property.PropertyDto;
import org.sonar.db.property.PropertyQuery;
import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.user.UserSession; import org.sonar.server.user.UserSession;


Expand All @@ -43,14 +45,20 @@ public FavoriteUpdater(DbClient dbClient, UserSession userSession) {
/** /**
* Set favorite to the logged in user. If no user is logged, no action is done * 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()) { if (!userSession.isLoggedIn()) {
return; 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() dbClient.propertiesDao().saveProperty(dbSession, new PropertyDto()
.setKey(PROP_FAVORITE_KEY) .setKey(PROP_FAVORITE_KEY)
.setResourceId(componentDtoId) .setResourceId(componentDto.getId())
.setUserId(Long.valueOf(userSession.getUserId()))); .setUserId(Long.valueOf(userSession.getUserId())));
} }


Expand Down
Expand Up @@ -76,7 +76,7 @@ private Consumer<Request> addFavorite() {
userSession userSession
.checkLoggedIn() .checkLoggedIn()
.checkComponentUuidPermission(UserRole.USER, componentDto.uuid()); .checkComponentUuidPermission(UserRole.USER, componentDto.uuid());
favoriteUpdater.add(dbSession, componentDto.getId()); favoriteUpdater.add(dbSession, componentDto);
dbSession.commit(); dbSession.commit();
} }
}; };
Expand Down
Expand Up @@ -117,7 +117,7 @@ public void create_component() {
assertThat(project.qualifier()).isEqualTo(qualifier); assertThat(project.qualifier()).isEqualTo(qualifier);
assertThat(project.getId()).isEqualTo(result); assertThat(project.getId()).isEqualTo(result);
verify(permissionTemplateService).applyDefaultPermissionTemplate(any(DbSession.class), eq(componentKey)); 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) @Test(expected = BadRequestException.class)
Expand Down
Expand Up @@ -119,7 +119,7 @@ public void provision_project_if_does_not_exist() throws Exception {


verifyReportIsPersisted(TASK_UUID); verifyReportIsPersisted(TASK_UUID);
verify(permissionTemplateService).applyDefault(any(DbSession.class), eq(createdProject), anyLong()); 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>() { verify(queue).submit(argThat(new TypeSafeMatcher<CeTaskSubmit>() {
@Override @Override
protected boolean matchesSafely(CeTaskSubmit submit) { protected boolean matchesSafely(CeTaskSubmit submit) {
Expand Down
Expand Up @@ -22,21 +22,29 @@


import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.property.PropertyQuery; import org.sonar.db.property.PropertyQuery;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.tester.UserSessionRule; import org.sonar.server.tester.UserSessionRule;


import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.db.component.ComponentTesting.newProjectDto;


public class FavoriteUpdaterTest { public class FavoriteUpdaterTest {
private static final long COMPONENT_ID = 23L; 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; private static final long USER_ID = 42L;


@Rule @Rule
public UserSessionRule userSession = UserSessionRule.standalone().login().setUserId((int) USER_ID); public UserSessionRule userSession = UserSessionRule.standalone().login().setUserId((int) USER_ID);
@Rule
public ExpectedException expectedException = ExpectedException.none();


@Rule @Rule
public DbTester db = DbTester.create(System2.INSTANCE); public DbTester db = DbTester.create(System2.INSTANCE);
Expand All @@ -49,7 +57,7 @@ public class FavoriteUpdaterTest {
public void put_favorite() { public void put_favorite() {
assertNoFavorite(); assertNoFavorite();


underTest.add(dbSession, COMPONENT_ID); underTest.add(dbSession, COMPONENT);


assertFavorite(); assertFavorite();
} }
Expand All @@ -58,19 +66,20 @@ public void put_favorite() {
public void do_nothing_when_not_logged_in() { public void do_nothing_when_not_logged_in() {
userSession.anonymous(); userSession.anonymous();


underTest.add(dbSession, COMPONENT_ID); underTest.add(dbSession, COMPONENT);


assertNoFavorite(); assertNoFavorite();
} }


@Test @Test
public void put_existing_favorite() { public void fail_when_adding_existing_favorite() {
underTest.add(dbSession, COMPONENT_ID); underTest.add(dbSession, COMPONENT);
assertFavorite(); 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() { private void assertFavorite() {
Expand Down

0 comments on commit 7c0c2c6

Please sign in to comment.