]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10543 Add ITs
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Wed, 18 Apr 2018 11:22:47 +0000 (13:22 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 26 Apr 2018 18:20:52 +0000 (20:20 +0200)
sonar-ws/src/main/java/org/sonarqube/ws/client/rules/RulesService.java
sonar-ws/src/main/java/org/sonarqube/ws/client/rules/SearchRequest.java
tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java [new file with mode: 0644]
tests/src/test/java/org/sonarqube/tests/issue/IssueSuite.java
tests/src/test/java/util/ItUtils.java
tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml [new file with mode: 0644]

index 86375753153f5ea4119acf48bbc4c09e19a21655..298c5e136c18f560d82c489837da7fa46211142a 100644 (file)
@@ -143,6 +143,7 @@ public class RulesService extends BaseService {
         .setParam("facets", request.getFacets() == null ? null : request.getFacets().stream().collect(Collectors.joining(",")))
         .setParam("inheritance", request.getInheritance() == null ? null : request.getInheritance().stream().collect(Collectors.joining(",")))
         .setParam("is_template", request.getIsTemplate())
+        .setParam("is_external", request.getIsExternal())
         .setParam("languages", request.getLanguages() == null ? null : request.getLanguages().stream().collect(Collectors.joining(",")))
         .setParam("organization", request.getOrganization())
         .setParam("p", request.getP())
index bb97414501511d5f90c305923779789724fa3e78..38d9d4dac01c373b950f510489eba8f89faef00e 100644 (file)
@@ -39,6 +39,7 @@ public class SearchRequest {
   private List<String> f;
   private List<String> facets;
   private List<String> inheritance;
+  private String isExternal;
   private String isTemplate;
   private List<String> languages;
   private String organization;
@@ -237,6 +238,24 @@ public class SearchRequest {
   public String getIsTemplate() {
     return isTemplate;
   }
+  
+  /**
+   * Possible values:
+   * <ul>
+   *   <li>"true"</li>
+   *   <li>"false"</li>
+   *   <li>"yes"</li>
+   *   <li>"no"</li>
+   * </ul>
+   */
+  public SearchRequest setIsExternal(String isExternal) {
+    this.isExternal = isExternal;
+    return this;
+  }
+
+  public String getIsExternal() {
+    return isExternal;
+  }
 
   /**
    * Example value: "java,js"
diff --git a/tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java b/tests/src/test/java/org/sonarqube/tests/issue/ExternalIssueTest.java
new file mode 100644 (file)
index 0000000..cfa4677
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 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.issue;
+
+import com.sonar.orchestrator.build.SonarScanner;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonarqube.qa.util.Tester;
+import org.sonarqube.ws.Common.RuleScope;
+import org.sonarqube.ws.Common.RuleType;
+import org.sonarqube.ws.Common.Severity;
+import org.sonarqube.ws.Issues.Issue;
+import org.sonarqube.ws.client.issues.SearchRequest;
+import util.ItUtils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ExternalIssueTest extends AbstractIssueTest {
+  private static final String PROJECT_KEY = "project";
+
+  @Rule
+  public Tester tester = new Tester(ORCHESTRATOR);
+
+  @Before
+  public void setUp() {
+    ORCHESTRATOR.getServer().provisionProject(PROJECT_KEY, PROJECT_KEY);
+    ItUtils.restoreProfile(ORCHESTRATOR, getClass().getResource("/issue/ExternalIssueTest/no-rules.xml"));
+    ORCHESTRATOR.getServer().associateProjectToQualityProfile(PROJECT_KEY, "xoo", "no-rules");
+  }
+
+  @Test
+  public void should_import_external_issues_and_create_external_rules() {
+    noExternalRuleAndNoIssues();
+
+    SonarScanner sonarScanner = ItUtils.runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample",
+      "sonar.oneExternalIssuePerLine.activate", "true");
+    List<Issue> issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList();
+    assertThat(issuesList).hasSize(17);
+
+    assertThat(issuesList).allMatch(issue -> "external_xoo:OneExternalIssuePerLine".equals(issue.getRule()));
+    assertThat(issuesList).allMatch(issue -> "This issue is generated on each line".equals(issue.getMessage()));
+    assertThat(issuesList).allMatch(issue -> "This issue is generated on each line".equals(issue.getMessage()));
+    assertThat(issuesList).allMatch(issue -> Severity.MAJOR.equals(issue.getSeverity()));
+    assertThat(issuesList).allMatch(issue -> RuleType.CODE_SMELL.equals(issue.getType()));
+    assertThat(issuesList).allMatch(issue -> "sample:src/main/xoo/sample/Sample.xoo".equals(issue.getComponent()));
+    assertThat(issuesList).allMatch(issue -> "OPEN".equals(issue.getStatus()));
+    assertThat(issuesList).allMatch(issue -> Boolean.TRUE.equals(issue.getFromExternalRule()));
+
+    List<org.sonarqube.ws.Rules.Rule> rulesList = tester.wsClient().rules()
+      .search(new org.sonarqube.ws.client.rules.SearchRequest().setIsExternal(Boolean.toString(true))).getRulesList();
+    List<org.sonarqube.ws.Rules.Rule> externalRules = rulesList.stream().filter(rule -> rule.getIsExternal()).collect(Collectors.toList());
+
+    assertThat(externalRules).hasSize(1);
+    assertThat(externalRules.get(0).getKey()).isEqualTo("external_xoo:OneExternalIssuePerLine");
+    assertThat(externalRules.get(0).getIsTemplate()).isFalse();
+    assertThat(externalRules.get(0).getIsExternal()).isTrue();
+    assertThat(externalRules.get(0).getTags().getTagsCount()).isEqualTo(0);
+    assertThat(externalRules.get(0).getScope()).isEqualTo(RuleScope.ALL);
+
+    // second analysis, issue tracking should work
+    sonarScanner = ItUtils.runProjectAnalysis(ORCHESTRATOR, "shared/xoo-sample",
+      "sonar.oneExternalIssuePerLine.activate", "true");
+    issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList();
+    assertThat(issuesList).hasSize(17);
+  }
+
+  private void noExternalRuleAndNoIssues() {
+    List<org.sonarqube.ws.Rules.Rule> rulesList = tester.wsClient().rules()
+      .search(new org.sonarqube.ws.client.rules.SearchRequest().setIsExternal(Boolean.toString(true))).getRulesList();
+    assertThat(rulesList).noneMatch(rule -> rule.getIsExternal());
+
+    List<Issue> issuesList = tester.wsClient().issues().search(new SearchRequest()).getIssuesList();
+    assertThat(issuesList).isEmpty();
+  }
+
+}
index cc6a0097e410ccf87615d932c3c20fd5a12dc668..8afe1a764ea2225de10280209aa2c88eb532cd6e 100644 (file)
@@ -33,6 +33,7 @@ import static util.ItUtils.xooPlugin;
   AutoAssignTest.class,
   CommonRulesTest.class,
   CustomRulesTest.class,
+  ExternalIssueTest.class,
   IssueActionTest.class,
   IssueBulkChangeTest.class,
   IssueChangelogTest.class,
index 13f268a4697ac9a3d6bf192482673aeb8314d72d..189eb59a0481fefe1152d14a01d75153ab3bb816 100644 (file)
@@ -27,7 +27,7 @@ import com.google.gson.reflect.TypeToken;
 import com.sonar.orchestrator.Orchestrator;
 import com.sonar.orchestrator.OrchestratorBuilder;
 import com.sonar.orchestrator.build.BuildResult;
-import com.sonar.orchestrator.build.SonarRunner;
+import com.sonar.orchestrator.build.SonarScanner;
 import com.sonar.orchestrator.container.Server;
 import com.sonar.orchestrator.locator.FileLocation;
 import java.io.File;
@@ -253,21 +253,21 @@ public class ItUtils {
     assertThat(countExisting).isEqualTo(existingIssues);
   }
 
-  public static SonarRunner runVerboseProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) {
+  public static SonarScanner runVerboseProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) {
     return runProjectAnalysis(orchestrator, projectRelativePath, true, properties);
   }
 
-  public static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) {
+  public static SonarScanner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, String... properties) {
     return runProjectAnalysis(orchestrator, projectRelativePath, false, properties);
   }
 
-  private static SonarRunner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, boolean enableDebugLogs, String... properties) {
-    SonarRunner sonarRunner = SonarRunner.create(projectDir(projectRelativePath));
+  private static SonarScanner runProjectAnalysis(Orchestrator orchestrator, String projectRelativePath, boolean enableDebugLogs, String... properties) {
+    SonarScanner sonarScanner = SonarScanner.create(projectDir(projectRelativePath));
     ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
     for (int i = 0; i < properties.length; i += 2) {
       builder.put(properties[i], properties[i + 1]);
     }
-    SonarRunner scan = sonarRunner.setDebugLogs(enableDebugLogs).setProperties(builder.build());
+    SonarScanner scan = sonarScanner.setDebugLogs(enableDebugLogs).setProperties(builder.build());
     orchestrator.executeBuild(scan);
     return scan;
   }
diff --git a/tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml b/tests/src/test/resources/issue/ExternalIssueTest/no-rules.xml
new file mode 100644 (file)
index 0000000..5fca154
--- /dev/null
@@ -0,0 +1,6 @@
+<profile>
+  <name>no-rules</name>
+  <language>xoo</language>
+  <rules>
+  </rules>
+</profile>