diff options
author | Daniel Schwarz <daniel.schwarz@sonarsource.com> | 2017-04-27 10:59:11 +0200 |
---|---|---|
committer | Daniel Schwarz <bartfastiel@users.noreply.github.com> | 2017-04-27 17:09:58 +0200 |
commit | 6ff05382aff213ebb61152a6e0d5a157665ba450 (patch) | |
tree | 80dcc53b88092dd68c71f5710d69f1de2fcc39de | |
parent | 40d27d700c2cc36dea76e7746501e1cb6e398040 (diff) | |
download | sonarqube-6ff05382aff213ebb61152a6e0d5a157665ba450.tar.gz sonarqube-6ff05382aff213ebb61152a6e0d5a157665ba450.zip |
change RuleDeleter medium test to a WsActionTester test
5 files changed, 106 insertions, 184 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index 294a3dbde4c..c626336a8b2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -163,7 +163,6 @@ import org.sonar.server.rule.DefaultRuleFinder; import org.sonar.server.rule.DeprecatedRulesDefinitionLoader; import org.sonar.server.rule.RuleCreator; import org.sonar.server.rule.RuleDefinitionsLoader; -import org.sonar.server.rule.RuleDeleter; import org.sonar.server.rule.RuleUpdater; import org.sonar.server.rule.index.RuleIndexDefinition; import org.sonar.server.rule.index.RuleIndexer; @@ -292,7 +291,6 @@ public class PlatformLevel4 extends PlatformLevel { RulesDefinitionXmlLoader.class, RuleUpdater.class, RuleCreator.class, - RuleDeleter.class, org.sonar.server.rule.ws.UpdateAction.class, RulesWs.class, RuleWsSupport.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleDeleter.java b/server/sonar-server/src/main/java/org/sonar/server/rule/RuleDeleter.java deleted file mode 100644 index 3faab5576ca..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/RuleDeleter.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.rule; - -import org.sonar.api.rule.RuleKey; -import org.sonar.api.rule.RuleStatus; -import org.sonar.api.server.ServerSide; -import org.sonar.api.utils.System2; -import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.rule.RuleDefinitionDto; -import org.sonar.server.qualityprofile.RuleActivator; -import org.sonar.server.rule.index.RuleIndexer; - -@ServerSide -public class RuleDeleter { - - private final System2 system2; - private final RuleIndexer ruleIndexer; - private final DbClient dbClient; - private final RuleActivator ruleActivator; - - public RuleDeleter(System2 system2, RuleIndexer ruleIndexer, DbClient dbClient, RuleActivator ruleActivator) { - this.system2 = system2; - this.ruleIndexer = ruleIndexer; - this.dbClient = dbClient; - this.ruleActivator = ruleActivator; - } - - public void delete(RuleKey ruleKey) { - try (DbSession dbSession = dbClient.openSession(false)) { - RuleDefinitionDto rule = dbClient.ruleDao().selectOrFailDefinitionByKey(dbSession, ruleKey); - if (!rule.isCustomRule()) { - throw new IllegalStateException("Only custom rules can be deleted"); - } - - // For custom rule, first deactivate the rule on all profiles - if (rule.isCustomRule()) { - ruleActivator.deactivateOfAllOrganizations(dbSession, rule); - } - - rule.setStatus(RuleStatus.REMOVED); - rule.setUpdatedAt(system2.now()); - dbClient.ruleDao().update(dbSession, rule); - - dbSession.commit(); - ruleIndexer.indexRuleDefinition(ruleKey); - } - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/DeleteAction.java b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/DeleteAction.java index 25dd5a3490f..73ac35a1e35 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/ws/DeleteAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/ws/DeleteAction.java @@ -20,20 +20,32 @@ package org.sonar.server.rule.ws; import org.sonar.api.rule.RuleKey; +import org.sonar.api.rule.RuleStatus; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; -import org.sonar.server.rule.RuleDeleter; +import org.sonar.api.utils.System2; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.db.rule.RuleDefinitionDto; +import org.sonar.server.qualityprofile.RuleActivator; +import org.sonar.server.rule.index.RuleIndexer; public class DeleteAction implements RulesWsAction { public static final String PARAM_KEY = "key"; - private final RuleDeleter ruleDeleter; + private final System2 system2; + private final RuleIndexer ruleIndexer; + private final DbClient dbClient; + private final RuleActivator ruleActivator; private final RuleWsSupport ruleWsSupport; - public DeleteAction(RuleDeleter ruleDeleter, RuleWsSupport ruleWsSupport) { - this.ruleDeleter = ruleDeleter; + public DeleteAction(System2 system2, RuleIndexer ruleIndexer, DbClient dbClient, RuleActivator ruleActivator, RuleWsSupport ruleWsSupport) { + this.system2 = system2; + this.ruleIndexer = ruleIndexer; + this.dbClient = dbClient; + this.ruleActivator = ruleActivator; this.ruleWsSupport = ruleWsSupport; } @@ -58,6 +70,27 @@ public class DeleteAction implements RulesWsAction { public void handle(Request request, Response response) { ruleWsSupport.checkQProfileAdminPermission(); RuleKey key = RuleKey.parse(request.mandatoryParam(PARAM_KEY)); - ruleDeleter.delete(key); + delete(key); + } + + public void delete(RuleKey ruleKey) { + try (DbSession dbSession = dbClient.openSession(false)) { + RuleDefinitionDto rule = dbClient.ruleDao().selectOrFailDefinitionByKey(dbSession, ruleKey); + if (!rule.isCustomRule()) { + throw new IllegalStateException("Only custom rules can be deleted"); + } + + // For custom rule, first deactivate the rule on all profiles + if (rule.isCustomRule()) { + ruleActivator.deactivateOfAllOrganizations(dbSession, rule); + } + + rule.setStatus(RuleStatus.REMOVED); + rule.setUpdatedAt(system2.now()); + dbClient.ruleDao().update(dbSession, rule); + + dbSession.commit(); + ruleIndexer.indexRuleDefinition(ruleKey); + } } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleDeleterTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleDeleterTest.java deleted file mode 100644 index 42dcbc6ae4b..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleDeleterTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.rule; - -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.mockito.Mockito; -import org.sonar.api.rule.RuleStatus; -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.rule.RuleDefinitionDto; -import org.sonar.server.qualityprofile.RuleActivator; -import org.sonar.server.rule.index.RuleIndexer; -import org.sonar.server.tester.UserSessionRule; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; - -public class RuleDeleterTest { - - private static final long PAST = 10000L; - - @org.junit.Rule - public UserSessionRule userSessionRule = UserSessionRule.standalone(); - @org.junit.Rule - public DbTester dbTester = DbTester.create(); - @org.junit.Rule - public ExpectedException thrown = ExpectedException.none(); - - private DbClient dbClient = dbTester.getDbClient(); - private DbSession dbSession = dbTester.getSession(); - private RuleIndexer ruleIndexer = mock(RuleIndexer.class); - private RuleActivator ruleActivator = mock(RuleActivator.class); - private RuleDeleter deleter = new RuleDeleter(System2.INSTANCE, ruleIndexer, dbClient, ruleActivator); - - @Test - public void delete_custom_rule() { - RuleDefinitionDto templateRule = dbTester.rules().insert( - r -> r.setIsTemplate(true), - r -> r.setCreatedAt(PAST), - r -> r.setUpdatedAt(PAST) - ); - RuleDefinitionDto customRule = dbTester.rules().insert( - r -> r.setTemplateId(templateRule.getId()), - r -> r.setCreatedAt(PAST), - r -> r.setUpdatedAt(PAST) - ); - - Mockito.reset(ruleIndexer); - - // Delete custom rule - deleter.delete(customRule.getKey()); - - Mockito.verify(ruleIndexer).indexRuleDefinition(eq(customRule.getKey())); - Mockito.verifyNoMoreInteractions(ruleIndexer); - - // Verify custom rule has status REMOVED - RuleDefinitionDto customRuleReloaded = dbClient.ruleDao().selectOrFailDefinitionByKey(dbSession, customRule.getKey()); - assertThat(customRuleReloaded).isNotNull(); - assertThat(customRuleReloaded.getStatus()).isEqualTo(RuleStatus.REMOVED); - assertThat(customRuleReloaded.getUpdatedAt()).isNotEqualTo(PAST); - } - - @Test - public void fail_to_delete_if_not_custom() { - RuleDefinitionDto rule = dbTester.rules().insert(); - - thrown.expect(IllegalStateException.class); - thrown.expectMessage("Only custom rules can be deleted"); - - deleter.delete(rule.getKey()); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/DeleteActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/DeleteActionTest.java index 7b40ab3dd42..510b18ea99c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/ws/DeleteActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/ws/DeleteActionTest.java @@ -19,59 +19,110 @@ */ package org.sonar.server.rule.ws; -import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.rule.RuleKey; +import org.mockito.Mockito; +import org.sonar.api.rule.RuleStatus; +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.rule.RuleDefinitionDto; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.organization.TestDefaultOrganizationProvider; -import org.sonar.server.rule.RuleDeleter; +import org.sonar.server.qualityprofile.RuleActivator; +import org.sonar.server.rule.index.RuleIndexer; import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.ws.WsTester; +import org.sonar.server.ws.WsActionTester; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES; public class DeleteActionTest { + private static final long PAST = 10000L; - @Rule + @org.junit.Rule public UserSessionRule userSession = UserSessionRule.standalone(); - @Rule - public ExpectedException expectedException = ExpectedException.none(); + @org.junit.Rule + public DbTester dbTester = DbTester.create(); + @org.junit.Rule + public ExpectedException thrown = ExpectedException.none(); - private RuleDeleter ruleDeleter = mock(RuleDeleter.class); + private DbClient dbClient = dbTester.getDbClient(); + private DbSession dbSession = dbTester.getSession(); + private RuleIndexer ruleIndexer = mock(RuleIndexer.class); + private RuleActivator ruleActivator = mock(RuleActivator.class); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.fromUuid("ORG1"); private RuleWsSupport ruleWsSupport = new RuleWsSupport(mock(DbClient.class), userSession, defaultOrganizationProvider); - private WsTester tester = new WsTester(new RulesWs(new DeleteAction(ruleDeleter, ruleWsSupport))); + private DeleteAction underTest = new DeleteAction(System2.INSTANCE, ruleIndexer, dbClient, ruleActivator, ruleWsSupport); + private WsActionTester tester = new WsActionTester(underTest); @Test public void delete_custom_rule() throws Exception { logInAsQProfileAdministrator(); - WsTester.TestRequest request = tester.newPostRequest("api/rules", "delete").setParam("key", "squid:XPath_1402065390816"); - request.execute(); + RuleDefinitionDto templateRule = dbTester.rules().insert( + r -> r.setIsTemplate(true), + r -> r.setCreatedAt(PAST), + r -> r.setUpdatedAt(PAST)); + RuleDefinitionDto customRule = dbTester.rules().insert( + r -> r.setTemplateId(templateRule.getId()), + r -> r.setCreatedAt(PAST), + r -> r.setUpdatedAt(PAST)); - verify(ruleDeleter).delete(RuleKey.of("squid", "XPath_1402065390816")); + tester.newRequest() + .setMethod("POST") + .setParam("key", customRule.getKey().toString()) + .execute(); + + Mockito.verify(ruleIndexer).indexRuleDefinition(eq(customRule.getKey())); + Mockito.verifyNoMoreInteractions(ruleIndexer); + + // Verify custom rule has status REMOVED + RuleDefinitionDto customRuleReloaded = dbClient.ruleDao().selectOrFailDefinitionByKey(dbSession, customRule.getKey()); + assertThat(customRuleReloaded).isNotNull(); + assertThat(customRuleReloaded.getStatus()).isEqualTo(RuleStatus.REMOVED); + assertThat(customRuleReloaded.getUpdatedAt()).isNotEqualTo(PAST); } @Test public void throw_ForbiddenException_if_not_profile_administrator() throws Exception { userSession.logIn(); - expectedException.expect(ForbiddenException.class); + thrown.expect(ForbiddenException.class); - tester.newPostRequest("api/rules", "delete").execute(); + tester.newRequest() + .setMethod("POST") + .setParam("key", "anyRuleKey") + .execute(); } @Test public void throw_UnauthorizedException_if_not_logged_in() throws Exception { - expectedException.expect(UnauthorizedException.class); + thrown.expect(UnauthorizedException.class); + + tester.newRequest() + .setMethod("POST") + .setParam("key", "anyRuleKey") + .execute(); + } + + @Test + public void fail_to_delete_if_not_custom() { + logInAsQProfileAdministrator(); + RuleDefinitionDto rule = dbTester.rules().insert(); + + thrown.expect(IllegalStateException.class); + thrown.expectMessage("Only custom rules can be deleted"); - tester.newPostRequest("api/rules", "delete").execute(); + tester.newRequest() + .setMethod("POST") + .setParam("key", rule.getKey().toString()) + .execute(); } private void logInAsQProfileAdministrator() { |