From c8963a8ab011c419062226e9b745aa0242b0f5d3 Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Thu, 29 Jun 2017 15:51:28 +0200 Subject: [PATCH] SONAR-9482 Add IT for WS api/qualityprofiles/show --- .../main/java/org/sonar/xoo/XooPlugin.java | 4 + .../org/sonar/xoo/rule/Xoo2BasicProfile.java | 4 +- .../sonar/xoo/rule/Xoo2SonarWayProfile.java | 40 +++++++++ .../org/sonar/xoo/rule/XooBasicProfile.java | 1 + .../sonar/xoo/rule/XooSonarWayProfile.java | 41 +++++++++ .../java/org/sonar/xoo/XooPluginTest.java | 4 +- .../org/sonarqube/tests/Category6Suite.java | 8 +- .../BuiltInQualityProfilesTest.java | 10 ++- .../qualityProfile/QualityProfilesWsTest.java | 89 +++++++++++++++++++ 9 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2SonarWayProfile.java create mode 100644 plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooSonarWayProfile.java create mode 100644 tests/src/test/java/org/sonarqube/tests/qualityProfile/QualityProfilesWsTest.java diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java index eee749572be..a61386c233f 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/XooPlugin.java @@ -58,12 +58,14 @@ import org.sonar.xoo.rule.OneVulnerabilityIssuePerModuleSensor; import org.sonar.xoo.rule.RandomAccessSensor; import org.sonar.xoo.rule.SaveDataTwiceSensor; import org.sonar.xoo.rule.Xoo2BasicProfile; +import org.sonar.xoo.rule.Xoo2SonarWayProfile; import org.sonar.xoo.rule.XooBasicProfile; import org.sonar.xoo.rule.XooEmptyProfile; import org.sonar.xoo.rule.XooFakeExporter; import org.sonar.xoo.rule.XooFakeImporter; import org.sonar.xoo.rule.XooFakeImporterWithMessages; import org.sonar.xoo.rule.XooRulesDefinition; +import org.sonar.xoo.rule.XooSonarWayProfile; import org.sonar.xoo.scm.XooBlameCommand; import org.sonar.xoo.scm.XooScmProvider; import org.sonar.xoo.test.CoveragePerTestSensor; @@ -92,7 +94,9 @@ public class XooPlugin implements Plugin { Xoo.class, Xoo2.class, XooRulesDefinition.class, + XooSonarWayProfile.class, XooBasicProfile.class, + Xoo2SonarWayProfile.class, Xoo2BasicProfile.class, XooEmptyProfile.class, diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2BasicProfile.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2BasicProfile.java index ae25fddc95e..901bb18dfb1 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2BasicProfile.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2BasicProfile.java @@ -19,19 +19,19 @@ */ package org.sonar.xoo.rule; -import org.sonar.xoo.Xoo2; - import org.sonar.api.profiles.ProfileDefinition; import org.sonar.api.profiles.RulesProfile; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RulePriority; import org.sonar.api.utils.ValidationMessages; +import org.sonar.xoo.Xoo2; public class Xoo2BasicProfile extends ProfileDefinition { @Override public RulesProfile createProfile(ValidationMessages messages) { RulesProfile profile = RulesProfile.create("Basic", Xoo2.KEY); + profile.setDefaultProfile(true); // so UGLY profile.activateRule(Rule.create(XooRulesDefinition.XOO2_REPOSITORY, HasTagSensor.RULE_KEY), RulePriority.MAJOR); diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2SonarWayProfile.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2SonarWayProfile.java new file mode 100644 index 00000000000..c4688905dfa --- /dev/null +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/Xoo2SonarWayProfile.java @@ -0,0 +1,40 @@ +/* + * 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.xoo.rule; + +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.rules.Rule; +import org.sonar.api.rules.RulePriority; +import org.sonar.api.utils.ValidationMessages; +import org.sonar.xoo.Xoo2; + +public class Xoo2SonarWayProfile extends ProfileDefinition { + + @Override + public RulesProfile createProfile(ValidationMessages messages) { + RulesProfile profile = RulesProfile.create("Sonar way", Xoo2.KEY); + + profile.activateRule(Rule.create(XooRulesDefinition.XOO2_REPOSITORY, HasTagSensor.RULE_KEY), RulePriority.MAJOR); + profile.activateRule(Rule.create(XooRulesDefinition.XOO2_REPOSITORY, OneIssuePerLineSensor.RULE_KEY), RulePriority.MINOR); + + return profile; + } +} diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooBasicProfile.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooBasicProfile.java index a1fdf3dc313..22c9ac75b30 100644 --- a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooBasicProfile.java +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooBasicProfile.java @@ -31,6 +31,7 @@ public class XooBasicProfile extends ProfileDefinition { @Override public RulesProfile createProfile(ValidationMessages validation) { final RulesProfile profile = RulesProfile.create("Basic", Xoo.KEY); + profile.setDefaultProfile(true); profile.activateRule(Rule.create(XooRulesDefinition.XOO_REPOSITORY, HasTagSensor.RULE_KEY), RulePriority.MAJOR); diff --git a/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooSonarWayProfile.java b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooSonarWayProfile.java new file mode 100644 index 00000000000..47317c926c7 --- /dev/null +++ b/plugins/sonar-xoo-plugin/src/main/java/org/sonar/xoo/rule/XooSonarWayProfile.java @@ -0,0 +1,41 @@ +/* + * 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.xoo.rule; + +import org.sonar.api.profiles.ProfileDefinition; +import org.sonar.api.profiles.RulesProfile; +import org.sonar.api.rules.Rule; +import org.sonar.api.rules.RulePriority; +import org.sonar.api.utils.ValidationMessages; +import org.sonar.xoo.Xoo; + +public class XooSonarWayProfile extends ProfileDefinition { + + @Override + public RulesProfile createProfile(ValidationMessages validation) { + final RulesProfile profile = RulesProfile.create("Sonar way", Xoo.KEY); + + profile.activateRule(Rule.create(XooRulesDefinition.XOO_REPOSITORY, HasTagSensor.RULE_KEY), RulePriority.MAJOR); + profile.activateRule(Rule.create(XooRulesDefinition.XOO_REPOSITORY, OneIssuePerLineSensor.RULE_KEY), RulePriority.INFO); + profile.activateRule(Rule.create(XooRulesDefinition.XOO_REPOSITORY, OneIssuePerFileSensor.RULE_KEY), RulePriority.CRITICAL); + + return profile; + } +} diff --git a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java index 7bfcd00d4ea..94fdc279df1 100644 --- a/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java +++ b/plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/XooPluginTest.java @@ -36,7 +36,7 @@ public class XooPluginTest { SonarRuntime runtime = SonarRuntimeImpl.forSonarLint(Version.parse("5.4")); Plugin.Context context = new Plugin.Context(runtime); new XooPlugin().define(context); - assertThat(context.getExtensions()).hasSize(44).doesNotContain(CpdTokenizerSensor.class); + assertThat(context.getExtensions()).hasSize(46).doesNotContain(CpdTokenizerSensor.class); } @Test @@ -44,6 +44,6 @@ public class XooPluginTest { SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse("5.5"), SonarQubeSide.SCANNER); Plugin.Context context = new Plugin.Context(runtime); new XooPlugin().define(context); - assertThat(context.getExtensions()).hasSize(47).contains(CpdTokenizerSensor.class); + assertThat(context.getExtensions()).hasSize(49).contains(CpdTokenizerSensor.class); } } diff --git a/tests/src/test/java/org/sonarqube/tests/Category6Suite.java b/tests/src/test/java/org/sonarqube/tests/Category6Suite.java index 96983945555..7ba1461f702 100644 --- a/tests/src/test/java/org/sonarqube/tests/Category6Suite.java +++ b/tests/src/test/java/org/sonarqube/tests/Category6Suite.java @@ -20,6 +20,9 @@ package org.sonarqube.tests; import com.sonar.orchestrator.Orchestrator; +import org.junit.ClassRule; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; import org.sonarqube.tests.issue.IssueTagsTest; import org.sonarqube.tests.issue.OrganizationIssueAssignTest; import org.sonarqube.tests.organization.BillingTest; @@ -33,11 +36,9 @@ import org.sonarqube.tests.projectSearch.SearchProjectsTest; import org.sonarqube.tests.qualityProfile.BuiltInQualityProfilesTest; import org.sonarqube.tests.qualityProfile.CustomQualityProfilesTest; import org.sonarqube.tests.qualityProfile.OrganizationQualityProfilesUiTest; +import org.sonarqube.tests.qualityProfile.QualityProfilesWsTest; import org.sonarqube.tests.ui.OrganizationUiExtensionsTest; import org.sonarqube.tests.user.OrganizationIdentityProviderTest; -import org.junit.ClassRule; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; import static util.ItUtils.pluginArtifact; import static util.ItUtils.xooPlugin; @@ -57,6 +58,7 @@ import static util.ItUtils.xooPlugin; OrganizationUiExtensionsTest.class, PersonalOrganizationTest.class, BuiltInQualityProfilesTest.class, + QualityProfilesWsTest.class, CustomQualityProfilesTest.class, BillingTest.class, IssueTagsTest.class, diff --git a/tests/src/test/java/org/sonarqube/tests/qualityProfile/BuiltInQualityProfilesTest.java b/tests/src/test/java/org/sonarqube/tests/qualityProfile/BuiltInQualityProfilesTest.java index 82719d800f3..286b412d1fa 100644 --- a/tests/src/test/java/org/sonarqube/tests/qualityProfile/BuiltInQualityProfilesTest.java +++ b/tests/src/test/java/org/sonarqube/tests/qualityProfile/BuiltInQualityProfilesTest.java @@ -20,11 +20,11 @@ package org.sonarqube.tests.qualityProfile; import com.sonar.orchestrator.Orchestrator; -import org.sonarqube.tests.Category6Suite; import java.util.function.Predicate; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; +import org.sonarqube.tests.Category6Suite; import org.sonarqube.tests.Session; import org.sonarqube.tests.Tester; import org.sonarqube.ws.Organizations.Organization; @@ -61,8 +61,10 @@ public class BuiltInQualityProfilesTest { .extracting(QualityProfile::getName, QualityProfile::getLanguage, QualityProfile::getIsBuiltIn, QualityProfile::getIsDefault) .containsExactlyInAnyOrder( tuple("Basic", "xoo", true, true), + tuple("Sonar way", "xoo", true, false), tuple("empty", "xoo", true, false), - tuple("Basic", "xoo2", true, true)); + tuple("Basic", "xoo2", true, true), + tuple("Sonar way", "xoo2", true, false)); } @Test @@ -73,8 +75,10 @@ public class BuiltInQualityProfilesTest { .extracting(QualityProfile::getOrganization, QualityProfile::getName, QualityProfile::getLanguage, QualityProfile::getIsBuiltIn, QualityProfile::getIsDefault) .containsExactlyInAnyOrder( tuple("default-organization", "Basic", "xoo", true, true), + tuple("default-organization", "Sonar way", "xoo", true, false), tuple("default-organization", "empty", "xoo", true, false), - tuple("default-organization", "Basic", "xoo2", true, true)); + tuple("default-organization", "Basic", "xoo2", true, true), + tuple("default-organization", "Sonar way", "xoo2", true, false)); } @Test diff --git a/tests/src/test/java/org/sonarqube/tests/qualityProfile/QualityProfilesWsTest.java b/tests/src/test/java/org/sonarqube/tests/qualityProfile/QualityProfilesWsTest.java new file mode 100644 index 00000000000..8cef4efa64c --- /dev/null +++ b/tests/src/test/java/org/sonarqube/tests/qualityProfile/QualityProfilesWsTest.java @@ -0,0 +1,89 @@ +/* + * 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.sonarqube.tests.qualityProfile; + +import com.sonar.orchestrator.Orchestrator; +import java.util.function.Predicate; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.sonarqube.tests.Category6Suite; +import org.sonarqube.tests.Tester; +import org.sonarqube.ws.Organizations.Organization; +import org.sonarqube.ws.QualityProfiles.CreateWsResponse; +import org.sonarqube.ws.QualityProfiles.SearchWsResponse; +import org.sonarqube.ws.QualityProfiles.ShowResponse; +import org.sonarqube.ws.QualityProfiles.ShowResponse.CompareToSonarWay; +import org.sonarqube.ws.QualityProfiles.ShowResponse.QualityProfile; +import org.sonarqube.ws.client.qualityprofile.SearchWsRequest; +import org.sonarqube.ws.client.qualityprofile.ShowRequest; + +import static org.assertj.core.api.Assertions.assertThat; + +public class QualityProfilesWsTest { + private static final String RULE_ONE_BUG_PER_LINE = "xoo:OneBugIssuePerLine"; + private static final String RULE_ONE_ISSUE_PER_LINE = "xoo:OneIssuePerLine"; + + @ClassRule + public static Orchestrator orchestrator = Category6Suite.ORCHESTRATOR; + + @Rule + public Tester tester = new Tester(orchestrator); + + @Test + public void show() { + Organization org = tester.organizations().generate(); + CreateWsResponse.QualityProfile xooProfile = tester.qProfiles().createXooProfile(org); + tester.qProfiles().activateRule(xooProfile, RULE_ONE_BUG_PER_LINE); + tester.qProfiles().activateRule(xooProfile, RULE_ONE_ISSUE_PER_LINE); + + ShowResponse result = tester.qProfiles().service().show(new ShowRequest().setProfile(xooProfile.getKey())); + + assertThat(result.getProfile()) + .extracting(QualityProfile::getName, QualityProfile::getLanguage, QualityProfile::getIsBuiltIn, QualityProfile::getIsDefault, + QualityProfile::getActiveRuleCount, QualityProfile::getActiveDeprecatedRuleCount) + .containsExactly(xooProfile.getName(), xooProfile.getLanguage(), false, false, 2L, 0L); + } + + @Test + public void show_with_sonar_way_comparison() { + Organization org = tester.organizations().generate(); + CreateWsResponse.QualityProfile xooProfile = tester.qProfiles().createXooProfile(org); + tester.qProfiles().activateRule(xooProfile, RULE_ONE_BUG_PER_LINE); + tester.qProfiles().activateRule(xooProfile, RULE_ONE_ISSUE_PER_LINE); + SearchWsResponse.QualityProfile sonarWay = getProfile(org, p -> "Sonar way".equals(p.getName()) && "xoo".equals(p.getLanguage()) && p.getIsBuiltIn()); + + CompareToSonarWay result = tester.qProfiles().service().show(new ShowRequest() + .setProfile(xooProfile.getKey()) + .setCompareToSonarWay(true)).getCompareToSonarWay(); + + assertThat(result) + .extracting(CompareToSonarWay::getProfile, CompareToSonarWay::getProfileName, CompareToSonarWay::getMissingRuleCount) + .containsExactly(sonarWay.getKey(), sonarWay.getName(), 2L); + } + + private SearchWsResponse.QualityProfile getProfile(Organization organization, Predicate filter) { + return tester.qProfiles().service().search(new SearchWsRequest() + .setOrganizationKey(organization.getKey())).getProfilesList() + .stream() + .filter(filter) + .findAny().orElseThrow(IllegalStateException::new); + } +} -- 2.39.5