From: Guillaume Jambet Date: Tue, 19 Dec 2017 15:29:18 +0000 (+0100) Subject: SONAR-10182 Clean homepage when deleting a project X-Git-Tag: 7.0-RC1~74 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7784221532f8d4c571472c8f104dcc12bb5cc36d;p=sonarqube.git SONAR-10182 Clean homepage when deleting a project --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java index dcd27b2b809..34c0f3c45b3 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java @@ -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); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java index 779a3bfdab2..5ff6de3095d 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java @@ -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()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java index 94472380e06..90776096f9b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ComponentCleanerService.java @@ -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); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java index cb60ebc8f0f..8af24654ac9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java @@ -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();