]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-10587 do not not return external issues in batch/issues
authorGuillaume Jambet <guillaume.jambet@sonarsource.com>
Fri, 13 Apr 2018 13:46:09 +0000 (15:46 +0200)
committerSonarTech <sonartech@sonarsource.com>
Thu, 26 Apr 2018 18:20:51 +0000 (20:20 +0200)
server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDao.java
server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java
server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java
server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java

index 482857eecfbdf452369b44aa976c302b8e6810fa..61b10d7fd4af1348447ba8f451714d6d9ca67a47 100644 (file)
@@ -61,11 +61,11 @@ public class IssueDao implements Dao {
     return mapper(session).selectComponentUuidsOfOpenIssuesForProjectUuid(projectUuid);
   }
 
-  public void scrollNonClosedByComponentUuid(DbSession dbSession, String componentUuid, ResultHandler<IssueDto> handler) {
+  public void scrollNonClosedByComponentUuidExcludingExternals(DbSession dbSession, String componentUuid, ResultHandler<IssueDto> handler) {
     mapper(dbSession).scrollNonClosedByComponentUuid(componentUuid, handler);
   }
 
-  public void scrollNonClosedByModuleOrProject(DbSession dbSession, ComponentDto module, ResultHandler<IssueDto> handler) {
+  public void scrollNonClosedByModuleOrProjectExcludingExternals(DbSession dbSession, ComponentDto module, ResultHandler<IssueDto> handler) {
     String likeModuleUuidPath = buildLikeValue(module.moduleUuidPath(), WildcardPosition.AFTER);
     mapper(dbSession).scrollNonClosedByModuleOrProject(module.projectUuid(), likeModuleUuidPath, handler);
   }
index 5f2e0f482cbb4840077f00d861457319185af188..1716b6af4acfa9ea702990a7cf3869495462e5e8 100644 (file)
     inner join projects p on p.uuid=i.component_uuid
     inner join projects root on root.uuid=i.project_uuid
     where
+    r.is_external = 'false' and
     i.component_uuid = #{componentUuid,jdbcType=VARCHAR} and
     i.status &lt;&gt; 'CLOSED'
   </select>
     inner join projects p on p.uuid = i.component_uuid
     inner join projects root on root.uuid = i.project_uuid
     where
+    r.is_external = 'false' and
     i.project_uuid = #{projectUuid, jdbcType=VARCHAR} and
     p.module_uuid_path like  #{likeModuleUuidPath, jdbcType=VARCHAR} escape '/' and
     i.status &lt;&gt; 'CLOSED'
index a96d88a90314616af9239306f72da8d2a2ec9fba..a6f5219347cda2046f1099c67cb050be0a9078f3 100644 (file)
@@ -133,16 +133,19 @@ public class IssueDaoTest {
     IssueDto closedIssueOnFile = db.issues().insert(rule, project, file, i -> i.setStatus("CLOSED").setResolution("FIXED"));
     IssueDto openIssueOnProject = db.issues().insert(rule, project, project, i -> i.setStatus("OPEN").setResolution(null));
 
+    RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true));
+    IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL"));
+
     Accumulator accumulator = new Accumulator();
-    underTest.scrollNonClosedByComponentUuid(db.getSession(), file.uuid(), accumulator);
+    underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), file.uuid(), accumulator);
     accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile);
 
     accumulator.clear();
-    underTest.scrollNonClosedByComponentUuid(db.getSession(), project.uuid(), accumulator);
+    underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), project.uuid(), accumulator);
     accumulator.assertThatContainsOnly(openIssueOnProject);
 
     accumulator.clear();
-    underTest.scrollNonClosedByComponentUuid(db.getSession(), "does_not_exist", accumulator);
+    underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), "does_not_exist", accumulator);
     assertThat(accumulator.list).isEmpty();
   }
 
@@ -160,17 +163,20 @@ public class IssueDaoTest {
     IssueDto openIssueOnProject = db.issues().insert(rule, project, project, i -> i.setStatus("OPEN").setResolution(null));
     IssueDto openIssueOnAnotherProject = db.issues().insert(rule, anotherProject, anotherProject, i -> i.setStatus("OPEN").setResolution(null));
 
+    RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true));
+    IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL"));
+
     Accumulator accumulator = new Accumulator();
-    underTest.scrollNonClosedByModuleOrProject(db.getSession(), project, accumulator);
+    underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), project, accumulator);
     accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile, openIssueOnModule, openIssueOnProject);
 
     accumulator.clear();
-    underTest.scrollNonClosedByModuleOrProject(db.getSession(), module, accumulator);
+    underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), module, accumulator);
     accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile, openIssueOnModule);
 
     accumulator.clear();
     ComponentDto notPersisted = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization());
-    underTest.scrollNonClosedByModuleOrProject(db.getSession(), notPersisted, accumulator);
+    underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), notPersisted, accumulator);
     assertThat(accumulator.list).isEmpty();
   }
 
index 018797fed5431e8a543d51a00602c51ad7a989b7..9b805f9258f72d4bc0f6422b16d5fc949ce539b2 100644 (file)
@@ -102,10 +102,10 @@ public class IssuesAction implements BatchWsAction {
       };
       switch (component.scope()) {
         case Scopes.PROJECT:
-          dbClient.issueDao().scrollNonClosedByModuleOrProject(dbSession, component, handler);
+          dbClient.issueDao().scrollNonClosedByModuleOrProjectExcludingExternals(dbSession, component, handler);
           break;
         case Scopes.FILE:
-          dbClient.issueDao().scrollNonClosedByComponentUuid(dbSession, component.uuid(), handler);
+          dbClient.issueDao().scrollNonClosedByComponentUuidExcludingExternals(dbSession, component.uuid(), handler);
           break;
         default:
           // only projects, modules and files are supported. Other types of components are not allowed.
index d30962a7bcab6b04562474b17ce91a3768560687..06dfddf00d9ed9b7367452f654f135da44f89c13 100644 (file)
@@ -159,6 +159,30 @@ public class IssuesActionTest {
     }
   }
 
+  @Test
+  public void does_not_return_issues_from_external_rules() {
+    RuleDefinitionDto rule = db.rules().insert();
+    ComponentDto project = db.components().insertPrivateProject();
+    ComponentDto module = db.components().insertComponent(newModuleDto(project));
+    ComponentDto file = db.components().insertComponent(newFileDto(module, null));
+    IssueDto issueOnProject = db.issues().insert(rule, project, project, i -> i.setKee("ON_PROJECT"));
+    IssueDto issueOnModule = db.issues().insert(rule, project, module, i -> i.setKee("ON_MODULE"));
+    IssueDto issueOnFile = db.issues().insert(rule, project, file, i -> i.setKee("ON_FILE"));
+
+    RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true));
+    IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL"));
+
+    addPermissionTo(project);
+    try (CloseableIterator<ServerIssue> result = callStream(project.getKey(), null)) {
+      assertThat(result)
+        .extracting(ServerIssue::getKey, ServerIssue::getModuleKey)
+        .containsExactlyInAnyOrder(
+          tuple(issueOnFile.getKey(), module.getKey()),
+          tuple(issueOnModule.getKey(), module.getKey()),
+          tuple(issueOnProject.getKey(), project.getKey()));
+    }
+  }
+
   @Test
   public void return_issues_of_module() {
     RuleDefinitionDto rule = db.rules().insert();