]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10182 Clean homepage when deleting a project
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Tue, 19 Dec 2017 15:29:18 +0000 (16:29 +0100)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Tue, 2 Jan 2018 09:38:10 +0000 (10:38 +0100)
server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java
server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java
server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java

index dcd27b2b809468a05973e510d93f7bde51490824..34c0f3c45b30712bf721790a8a792d1076d6c8ad 100644 (file)
@@ -35,6 +35,7 @@ import org.sonar.api.utils.System2;
 import org.sonar.db.Dao;
 import org.sonar.db.DbSession;
 import org.sonar.db.RowNotFoundException;
+import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
 
 import static org.sonar.db.DatabaseUtils.executeLargeInputs;
@@ -126,6 +127,10 @@ public class UserDao implements Dao {
     mapper(dbSession).clearHomepage("ORGANIZATION", organization.getUuid(), system2.now());
   }
 
+  public void cleanHomepage(DbSession dbSession, ComponentDto project) {
+    mapper(dbSession).clearHomepage("PROJECT", project.uuid(), system2.now());
+  }
+
   @CheckForNull
   public UserDto selectByLogin(DbSession session, String login) {
     return mapper(session).selectByLogin(login);
index 779a3bfdab227efe384c1503c48c9db9ee63f836..5ff6de3095d65dfc8589883cfcd0110df9c71881 100644 (file)
@@ -34,6 +34,7 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.RowNotFoundException;
+import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
 
 import static java.util.Arrays.asList;
@@ -418,7 +419,7 @@ public class UserDaoTest {
   }
 
   @Test
-  public void clean_users_homepage() {
+  public void clean_users_homepage_when_deleting_organization() {
 
     UserDto userUnderTest = newUserDto().setHomepageType("ORGANIZATION").setHomepageValue("dummy-organization-UUID");
     underTest.insert(session, userUnderTest);
@@ -441,6 +442,30 @@ public class UserDaoTest {
     assertThat(untouchedUserReloaded.getHomepageValue()).isEqualTo(untouchedUser.getHomepageValue());
   }
 
+  @Test
+  public void clean_users_homepage_when_deleting_project() {
+
+    UserDto userUnderTest = newUserDto().setHomepageType("PROJECT").setHomepageValue("dummy-project-UUID");
+    underTest.insert(session, userUnderTest);
+
+    UserDto untouchedUser = newUserDto().setHomepageType("PROJECT").setHomepageValue("not-so-dummy-project-UUID");
+    underTest.insert(session, untouchedUser);
+
+    session.commit();
+
+    underTest.cleanHomepage(session, new ComponentDto().setUuid("dummy-project-UUID"));
+
+    UserDto userWithAHomepageReloaded = underTest.selectUserById(session, userUnderTest.getId());
+    assertThat(userWithAHomepageReloaded.getUpdatedAt()).isEqualTo(NOW);
+    assertThat(userWithAHomepageReloaded.getHomepageType()).isNull();
+    assertThat(userWithAHomepageReloaded.getHomepageValue()).isNull();
+
+    UserDto untouchedUserReloaded = underTest.selectUserById(session, untouchedUser.getId());
+    assertThat(untouchedUserReloaded.getUpdatedAt()).isEqualTo(untouchedUser.getUpdatedAt());
+    assertThat(untouchedUserReloaded.getHomepageType()).isEqualTo(untouchedUser.getHomepageType());
+    assertThat(untouchedUserReloaded.getHomepageValue()).isEqualTo(untouchedUser.getHomepageValue());
+  }
+
   @Test
   public void does_not_fail_to_deactivate_missing_user() {
     underTest.deactivateUser(session, UserTesting.newUserDto());
index 94472380e0685cadc4fb104668f4d8df886820eb..90776096f9b59fe72f19c587386c7a3059a74327 100644 (file)
@@ -61,6 +61,7 @@ public class ComponentCleanerService {
   public void delete(DbSession dbSession, ComponentDto project) {
     checkArgument(!hasNotProjectScope(project) && !isNotDeletable(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted");
     dbClient.purgeDao().deleteProject(dbSession, project.uuid());
+    dbClient.userDao().cleanHomepage(dbSession, project);
     projectIndexers.commitAndIndex(dbSession, singletonList(project), ProjectIndexer.Cause.PROJECT_DELETION);
   }
 
index cb60ebc8f0ffca8e5e784635730a53f079afc47d..8af24654ac92883367b4dcbd4b1508569b8a382d 100644 (file)
@@ -31,8 +31,10 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDbTester;
 import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ResourceTypesRule;
+import org.sonar.db.user.UserDto;
 import org.sonar.server.component.ComponentCleanerService;
-import org.sonar.server.component.TestComponentFinder;
+import org.sonar.server.es.TestProjectIndexers;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.exceptions.UnauthorizedException;
@@ -43,7 +45,11 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.sonar.api.resources.Qualifiers.PROJECT;
+import static org.sonar.api.web.UserRole.ADMIN;
 import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
+import static org.sonar.db.user.UserTesting.newUserDto;
+import static org.sonar.server.component.TestComponentFinder.from;
 import static org.sonarqube.ws.client.project.ProjectsWsParameters.CONTROLLER;
 import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT;
 import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT_ID;
@@ -61,17 +67,22 @@ public class DeleteActionTest {
   @Rule
   public ExpectedException expectedException = ExpectedException.none();
 
+
   private WsTester ws;
   private DbClient dbClient = db.getDbClient();
+  private DbSession dbSession = db.getSession();
   private ComponentDbTester componentDbTester = new ComponentDbTester(db);
   private ComponentCleanerService componentCleanerService = mock(ComponentCleanerService.class);
 
+
+
+
   @Before
   public void setUp() {
     ws = new WsTester(new ProjectsWs(
       new DeleteAction(
         componentCleanerService,
-          TestComponentFinder.from(db),
+        from(db),
         dbClient,
         userSessionRule)));
   }
@@ -106,7 +117,7 @@ public class DeleteActionTest {
   @Test
   public void project_administrator_deletes_the_project_by_uuid() throws Exception {
     ComponentDto project = componentDbTester.insertPrivateProject();
-    userSessionRule.logIn().addProjectPermission(UserRole.ADMIN, project);
+    userSessionRule.logIn().addProjectPermission(ADMIN, project);
 
     call(newRequest().setParam(PARAM_PROJECT_ID, project.uuid()));
 
@@ -116,13 +127,36 @@ public class DeleteActionTest {
   @Test
   public void project_administrator_deletes_the_project_by_key() throws Exception {
     ComponentDto project = componentDbTester.insertPrivateProject();
-    userSessionRule.logIn().addProjectPermission(UserRole.ADMIN, project);
+    userSessionRule.logIn().addProjectPermission(ADMIN, project);
 
     call(newRequest().setParam(PARAM_PROJECT, project.getDbKey()));
 
     assertThat(verifyDeletedKey()).isEqualTo(project.getDbKey());
   }
 
+  @Test
+  public void project_deletion_also_ensure_that_homepage_on_this_project_if_it_exists_is_cleared() throws Exception {
+
+    ComponentDto project = componentDbTester.insertPrivateProject();
+    UserDto insert = dbClient.userDao().insert(dbSession,
+      newUserDto().setHomepageType("PROJECT").setHomepageValue(project.uuid()));
+    dbSession.commit();
+
+    userSessionRule.logIn().addProjectPermission(ADMIN, project);
+
+    new WsTester(new ProjectsWs(
+      new DeleteAction(
+        new ComponentCleanerService(dbClient, new ResourceTypesRule().setAllQualifiers(PROJECT),
+          new TestProjectIndexers()), from(db), dbClient, userSessionRule)))
+          .newPostRequest(CONTROLLER, ACTION)
+          .setParam(PARAM_PROJECT, project.getDbKey())
+          .execute();
+
+    UserDto userReloaded = dbClient.userDao().selectUserById(dbSession, insert.getId());
+    assertThat(userReloaded.getHomepageType()).isNull();
+    assertThat(userReloaded.getHomepageValue()).isNull();
+  }
+
   @Test
   public void return_403_if_not_project_admin_nor_org_admin() throws Exception {
     ComponentDto project = componentDbTester.insertPrivateProject();