]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6236 Put back widgets on default "Issues" dashboard, based on new issue filter... 144/head
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Mon, 9 Mar 2015 17:13:19 +0000 (18:13 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Tue, 10 Mar 2015 14:49:22 +0000 (15:49 +0100)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboard.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest.java
plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml [new file with mode: 0644]
sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterDao.java
sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterMapper.java
sonar-core/src/main/resources/org/sonar/core/issue/db/IssueFilterMapper.xml
sonar-core/src/test/java/org/sonar/core/issue/db/IssueFilterDaoTest.java
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml [new file with mode: 0644]

index 295e62a67a8071dbcd3d3ffbce5d709d9929b956..32c23a27545f124f2898410914edce858c337bc3 100644 (file)
  */
 package org.sonar.plugins.core.dashboards;
 
+import com.google.common.base.Preconditions;
 import org.sonar.api.web.Dashboard;
 import org.sonar.api.web.DashboardLayout;
 import org.sonar.api.web.DashboardTemplate;
+import org.sonar.core.issue.db.IssueFilterDao;
+import org.sonar.core.issue.db.IssueFilterDto;
 
 /**
  * Issues dashboard for Sonar
@@ -30,6 +33,12 @@ import org.sonar.api.web.DashboardTemplate;
  */
 public final class ProjectIssuesDashboard extends DashboardTemplate {
 
+  private final IssueFilterDao issueFilterDao;
+
+  public ProjectIssuesDashboard(IssueFilterDao issueFilterDao) {
+    this.issueFilterDao = issueFilterDao;
+  }
+
   @Override
   public String getName() {
     return "Issues";
@@ -39,20 +48,43 @@ public final class ProjectIssuesDashboard extends DashboardTemplate {
   public Dashboard createDashboard() {
     Dashboard dashboard = Dashboard.create();
     dashboard.setLayout(DashboardLayout.TWO_COLUMNS);
-    addFirstColumn(dashboard);
-    addSecondColumn();
+
+    IssueFilterDto unresolvedIssues = getIssueFilterByName("Unresolved Issues");
+    IssueFilterDto hiddenDebt = getIssueFilterByName("False Positive and Won't Fix Issues");
+    IssueFilterDto myUnresolvedIssues = getIssueFilterByName("My Unresolved Issues");
+
+    addFirstColumn(dashboard, unresolvedIssues);
+    addSecondColumn(dashboard, unresolvedIssues, hiddenDebt, myUnresolvedIssues);
     return dashboard;
   }
 
-  private void addFirstColumn(Dashboard dashboard) {
-    // TODO: + unresolved issues by status
+  private IssueFilterDto getIssueFilterByName(String name) {
+    IssueFilterDto filter = issueFilterDao.selectProvidedFilterByName(name);
+    Preconditions.checkState(filter != null, String.format("Could not find a provided issue filter with name '%s'", name));
+    return filter;
+  }
+
+  private void addFirstColumn(Dashboard dashboard, IssueFilterDto unresolvedIssues) {
+    // Unresolved issues by status
+    dashboard.addWidget("project_issue_filter", 1)
+      .setProperty("filter", Long.toString(unresolvedIssues.getId()))
+      .setProperty("distributionAxis", "statuses");
+    // Action plans
     dashboard.addWidget("action_plans", 1);
   }
 
-  private void addSecondColumn() {
-    // TODO: + unresolved issues by assignee
-    // TODO: + my unresolved issues
-    // TODO: + false positive and won't fix issues
+  private void addSecondColumn(Dashboard dashboard, IssueFilterDto unresolvedIssues, IssueFilterDto hiddenDebt, IssueFilterDto myUnresolvedIssues) {
+    // Unresolved issues by assignee
+    dashboard.addWidget("project_issue_filter", 2)
+      .setProperty("filter", Long.toString(unresolvedIssues.getId()))
+      .setProperty("distributionAxis", "assignees");
+    // My unresolved issues
+    dashboard.addWidget("project_issue_filter", 2)
+      .setProperty("filter", Long.toString(myUnresolvedIssues.getId()));
+    // False positive and won't fix issues by resolution
+    dashboard.addWidget("project_issue_filter", 2)
+      .setProperty("filter", Long.toString(hiddenDebt.getId()))
+      .setProperty("distributionAxis", "resolutions");
   }
 
 }
index 7aa7d11bae0ff3269fabb5321876a19f436b2991..28924a132934c59875a7a5296a21bc3689715a4a 100644 (file)
 
 package org.sonar.plugins.core.dashboards;
 
+import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Test;
+import org.junit.experimental.categories.Category;
 import org.sonar.api.web.Dashboard;
 import org.sonar.api.web.DashboardLayout;
+import org.sonar.core.issue.db.IssueFilterDao;
+import org.sonar.core.persistence.DbTester;
 import org.sonar.plugins.core.CorePlugin;
+import org.sonar.test.DbTests;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+@Category(DbTests.class)
 public class ProjectIssuesDashboardTest {
 
-  ProjectIssuesDashboard template = new ProjectIssuesDashboard();
+  @ClassRule
+  public static final DbTester dbTester = new DbTester();
+
+  ProjectIssuesDashboard template;
+
+  @Before
+  public void setUp() throws Exception {
+    IssueFilterDao issueFilterDao = new IssueFilterDao(dbTester.myBatis());
+    template = new ProjectIssuesDashboard(issueFilterDao);
+  }
 
   @Test
   public void should_have_a_name() {
@@ -43,10 +59,19 @@ public class ProjectIssuesDashboardTest {
 
   @Test
   public void should_create_dashboard() {
+    dbTester.prepareDbUnit(getClass(), "filters.xml");
     Dashboard dashboard = template.createDashboard();
 
     assertThat(dashboard.getLayout()).isEqualTo(DashboardLayout.TWO_COLUMNS);
-    assertThat(dashboard.getWidgets()).hasSize(1);
+    assertThat(dashboard.getWidgets()).hasSize(5);
   }
 
+  @Test
+  public void should_provide_clean_error_message_on_failure() {
+    try {
+      template.createDashboard();
+    } catch (IllegalStateException illegalState) {
+      assertThat(illegalState).hasMessage("Could not find a provided issue filter with name 'Unresolved Issues'");
+    }
+  }
 }
diff --git a/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml
new file mode 100644 (file)
index 0000000..8ec92dd
--- /dev/null
@@ -0,0 +1,33 @@
+<dataset>
+
+  <issue_filters
+      id="1"
+      name="Unresolved Issues"
+      user_login="[null]"
+      shared="[true]"
+      description="[null]"
+      data="resolved=false"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <issue_filters
+      id="2"
+      name="False Positive and Won't Fix Issues"
+      user_login="[null]"
+      shared="[true]"
+      description="[null]"
+      data="resolutions=FALSE-POSITIVE,WONTFIX"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <issue_filters
+      id="3"
+      name="My Unresolved Issues"
+      user_login="[null]"
+      shared="[true]"
+      description="[null]"
+      data="resolved=false|assignees=__me__"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+</dataset>
index 1548dc84444d29f3b5fc030a1ff10a51ddb94dc1..a8c253e61b394d2e3f7b56e81a0e1768adc0c70b 100644 (file)
@@ -69,6 +69,15 @@ public class IssueFilterDao implements BatchComponent, ServerComponent {
     }
   }
 
+  public IssueFilterDto selectProvidedFilterByName(String name) {
+    SqlSession session = mybatis.openSession(false);
+    try {
+      return getMapper(session).selectProvidedFilterByName(name);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
   public List<IssueFilterDto> selectSharedFilters() {
     SqlSession session = mybatis.openSession(false);
     try {
index fd0479f4132ad6c7af9fed63e577b589c53b709a..b5e8eb93fac53058cf4169e7007a9ad2654d7d2b 100644 (file)
@@ -37,9 +37,12 @@ public interface IssueFilterMapper {
 
   List<IssueFilterDto> selectSharedFilters();
 
+  IssueFilterDto selectProvidedFilterByName(String name);
+
   void insert(IssueFilterDto filter);
 
   void update(IssueFilterDto filter);
 
   void delete(long id);
+
 }
index 078620f535b27fa6106cbba048afe02ec4e2c007..75e324a9e6e65c4027561fc59109a28604317e59 100644 (file)
     where filters.shared=${_true}
   </select>
 
+  <select id="selectProvidedFilterByName" parameterType="String" resultType="IssueFilter">
+    select <include refid="issueFilterColumns"/>
+    from issue_filters filters
+    where filters.user_login is null
+      and filters.shared=${_true}
+      and filters.name=#{name}
+  </select>
+
   <insert id="insert" parameterType="IssueFilter" keyColumn="id" useGeneratedKeys="true" keyProperty="id" >
     INSERT INTO issue_filters (name, user_login, shared, description, data, created_at, updated_at)
     VALUES (#{name}, #{userLogin}, #{shared}, #{description}, #{data}, #{createdAt}, #{updatedAt})
index da240bd11e0e2743ea477b057ce8871d917331b0..621246ef967ad2d7f7d0be7ab82a298ce48cd5fa 100644 (file)
@@ -77,6 +77,15 @@ public class IssueFilterDaoTest extends AbstractDaoTestCase {
     assertThat(dao.selectSharedFilters()).hasSize(1);
   }
 
+  @Test
+  public void should_select_provided_by_name() {
+    setupData("should_select_provided_by_name");
+
+    assertThat(dao.selectProvidedFilterByName("Unresolved Issues").getName()).isEqualTo("Unresolved Issues");
+    assertThat(dao.selectProvidedFilterByName("My Unresolved Issues").getName()).isEqualTo("My Unresolved Issues");
+    assertThat(dao.selectProvidedFilterByName("Unknown Filter")).isNull();
+  }
+
   @Test
   public void should_insert() {
     setupData("shared");
diff --git a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml
new file mode 100644 (file)
index 0000000..d2b7e30
--- /dev/null
@@ -0,0 +1,58 @@
+<dataset>
+
+  <!-- This one must be found -->
+  <issue_filters
+      id="1"
+      name="Unresolved Issues"
+      user_login="[null]"
+      shared="[true]"
+      description="[null]"
+      data="resolved=false"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <!-- This one must NOT be found: belongs to admin -->
+  <issue_filters
+      id="2"
+      name="Unresolved Issues"
+      user_login="admin"
+      shared="[true]"
+      description="[null]"
+      data="resolved=false"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <!-- This one must NOT be found: not shared -->
+  <issue_filters
+      id="3"
+      name="Unresolved Issues"
+      user_login="[null]"
+      shared="[false]"
+      description="[null]"
+      data="resolved=false"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <!-- This one must be found -->
+  <issue_filters
+      id="4"
+      name="My Unresolved Issues"
+      user_login="[null]"
+      shared="[true]"
+      description="[null]"
+      data="resolved=false|assignees=__me__"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+  <!-- This one must NOT be found: not shared -->
+  <issue_filters
+      id="5"
+      name="Unknown Filter"
+      user_login="[null]"
+      shared="[false]"
+      description="[null]"
+      data="resolved=false"
+      created_at="2011-04-25 01:15:00"
+      updated_at="2011-04-25 01:15:00" />
+
+</dataset>