]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5209 Show tests that cover a line
authorStas Vilchik <vilchiks@gmail.com>
Tue, 27 May 2014 07:54:19 +0000 (13:54 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Tue, 27 May 2014 07:54:27 +0000 (13:54 +0600)
sonar-server/src/main/coffee/component-viewer/coverage-popup.coffee
sonar-server/src/main/coffee/component-viewer/source.coffee
sonar-server/src/main/hbs/component-viewer/coveragePopup.hbs
sonar-server/src/main/hbs/component-viewer/source.hbs
sonar-server/src/main/hbs/component-viewer/workspace.hbs
sonar-server/src/main/js/common/handlebars-extensions.js
sonar-server/src/main/less/component-viewer.less

index 63d38c8b7024b7fb6acb9cbb4c4077c4c7d0d4c5..b4dcd2a703a4a6a8ac3bc88eb9ebf2c8b9a1fed8 100644 (file)
@@ -21,29 +21,13 @@ define [
 
     goToFile: (e) ->
       key = $(e.currentTarget).data 'key'
-      test = $(e.currentTarget).data 'test'
-      @options.main.addTransition key, 'coverage', [
-        {
-          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
-          name: 'forbidDuplicatedType'
-          subname: 'ResourceTypeTreeTest.java'
-          active: test == 'forbidDuplicatedType'
-        }
-        {
-          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java'
-          name: 'forbidNullRelation'
-          subname: 'ResourceTypeTreeTest.java'
-          active: test == 'forbidNullRelation'
-        }
-        {
-          key: 'org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java'
-          name: 'fail_on_duplicated_qualifier'
-          subname: 'ResourceTypeTest.java'
-          active: test == 'fail_on_duplicated_qualifier'
-        }
-      ], [
-        {
-          key: key,
-          name: test
-        }
-      ]
+      @options.main.addTransition key, 'coverage'
+
+
+    serializeData: ->
+      files = @model.get 'files'
+      tests = _.groupBy @model.get('tests'), '_ref'
+      testFiles = _.map tests, (testSet, fileRef) ->
+        file: files[fileRef]
+        tests: testSet
+      testFiles: testFiles
\ No newline at end of file
index a69c2db557c05eefa75fc7395bed5481f6ca7096..fee9b6f419ec06e70ed6ba59c43b2f63003a181c 100644 (file)
@@ -19,6 +19,8 @@ define [
 
   $ = jQuery
 
+  API_COVERAGE_TESTS = "#{baseUrl}/api/tests/testable"
+
 
   class SourceView extends Marionette.ItemView
     template: Templates['source']
@@ -117,10 +119,13 @@ define [
     showCoveragePopup: (e) ->
       e.stopPropagation()
       $('body').click()
-      popup = new CoveragePopupView
-        triggerEl: $(e.currentTarget)
-        main: @options.main
-      popup.render()
+      line = $(e.currentTarget).closest('.row').data 'line-number'
+      $.get API_COVERAGE_TESTS, key: @options.main.component.get('key'), line: line, (data) =>
+        popup = new CoveragePopupView
+          model: new Backbone.Model data
+          triggerEl: $(e.currentTarget)
+          main: @options.main
+        popup.render()
 
 
     showDuplicationPopup: (e) ->
index e6058cb6abd3d72ea2c509709eca48a729e51a0c..cddc28fd1e9070cb95ca4f3f1394e70176c6247b 100644 (file)
@@ -1,44 +1,18 @@
-<div class="component-viewer-popup-section">
-  <div class="component-viewer-popup-section-title">
-    ResourceTypeTreeTest.java
+{{#each testFiles}}
+  <div class="component-viewer-popup-section">
+    <a class="component-viewer-popup-test-file link-action" data-key="{{file.key}}" title="{{file.longName}}">
+      {{file.longName}}
+    </a>
+    <ul class="component-viewer-popup-list">
+      {{#each tests}}
+        <li class="component-viewer-popup-test" title="{{name}}">
+          <i class="component-viewer-popup-test-status {{alertIconClass status}}"></i>
+          <span class="component-viewer-popup-test-name">{{name}}</span>
+          <span class="component-viewer-popup-test-duration">{{durationInMs}}ms</span>
+        </li>
+      {{/each}}
+    </ul>
   </div>
-  <ul class="component-viewer-popup-list">
-    <li>
-      <a class="component-viewer-popup-test"
-         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
-         data-test="forbidDuplicatedType">
-        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
-        <span class="component-viewer-popup-test-name">forbidDuplicatedType</span>
-        <span class="component-viewer-popup-test-duration">216ms</span>
-      </a>
-    </li>
-    <li>
-      <a class="component-viewer-popup-test"
-         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTreeTest.java"
-         data-test="forbidNullRelation">
-        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
-        <span class="component-viewer-popup-test-name">forbidNullRelation</span>
-        <span class="component-viewer-popup-test-duration">216ms</span>
-      </a>
-    </li>
-  </ul>
-</div>
-
-<div class="component-viewer-popup-section">
-  <div class="component-viewer-popup-section-title">
-    ResourceTypesTest.java
-  </div>
-  <ul class="component-viewer-popup-list">
-    <li>
-      <a class="component-viewer-popup-test"
-         data-key="org.codehaus.sonar:sonar-plugin-api:src/test/java/org/sonar/api/resources/ResourceTypeTest.java"
-         data-test="fail_on_duplicated_qualifier">
-        <i class="component-viewer-popup-test-status icon-alert-ok"></i>
-        <span class="component-viewer-popup-test-name">fail_on_duplicated_qualifier</span>
-        <span class="component-viewer-popup-test-duration">115ms</span>
-      </a>
-    </li>
-  </ul>
-</div>
+{{/each}}
 
 <div class="component-viewer-popup-arrow"></div>
\ No newline at end of file
index 8260193e0e53a6e9da38e918bc19e4ab8826fc3c..7842b324c2a14009089105c0d33fdeedec701482 100644 (file)
         {{/if}}
 
         {{#if ../../settings.coverage}}
-          <td class="stat coverage-tests {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
+          <td class="stat {{#if coverage}}coverage-{{#if coverage.covered}}green{{else}}red{{/if}}{{/if}}">
             {{#if coverage}}
-              <span title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">{{coverage.testCases}}</span>
+              <span class="coverage-tests" title="{{tp 'coverage_viewer.line_covered_by_x_tests' coverage.testCases}}">
+                {{coverage.testCases}}
+              </span>
             {{/if}}
           </td>
 
-          <td class="stat coverage-branches {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
+          <td class="stat {{#if coverage}}{{#if coverage.branchCoverageStatus}}coverage-{{coverage.branchCoverageStatus}}{{/if}}{{/if}}">
             {{#if coverage}}
               {{#if coverage.branches}}
-                <span title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
+                <span class="coverage-branches" title="{{tp 'coverage_viewer.x_covered_branches' coverage.coveredBranches}}">
                   {{coverage.coveredBranches}}/{{coverage.branches}}
                 </span>
               {{/if}}
index f409ed28d5e9ffaf7c91267018c01262bd7a700a..3b9e7a2b863355a45c94e1e660c2f45422bbaa29 100644 (file)
@@ -1,26 +1,27 @@
-<button class="button-clean component-viewer-workspace-toggle js-toggle-workspace">
-  {{#if settings.workspace}}
-    <i class="icon-double-chevron-left"></i>
-  {{else}}
-    <i class="icon-double-chevron-right"></i>
-  {{/if}}
+<div class="component-viewer-workspace-container">
+  <button class="button-clean component-viewer-workspace-toggle js-toggle-workspace">
+    {{#if settings.workspace}}
+      <i class="icon-double-chevron-left"></i>
+    {{else}}
+      <i class="icon-double-chevron-right"></i>
+    {{/if}}
+  </button>
 
-</button>
-
-<ul class="component-viewer-workspace-list">
-  {{#eachReverse workspace}}
-    <li class="component-viewer-workspace-item">
-      {{qualifierIcon component.qualifier}} <a data-key="{{key}}">{{component.name}}</a>
-      {{#if options}}
-        <ul class="component-viewer-workspace-options">
-          {{#each options}}
-            <li class="component-viewer-workspace-option {{#if active}}active{{/if}}">
-              <a data-workspace-key="{{../key}}" data-key="{{key}}">{{name}}</a>
-              {{#if subname}}<div class="subtitle">{{subname}}</div>{{/if}}
-            </li>
-          {{/each}}
-        </ul>
-      {{/if}}
-    </li>
-  {{/eachReverse}}
-</ul>
\ No newline at end of file
+  <ul class="component-viewer-workspace-list">
+    {{#eachReverse workspace}}
+      <li class="component-viewer-workspace-item">
+        {{qualifierIcon component.q}} <a data-key="{{key}}">{{component.name}}</a>
+        {{#if options}}
+          <ul class="component-viewer-workspace-options">
+            {{#each options}}
+              <li class="component-viewer-workspace-option {{#if active}}active{{/if}}">
+                <a data-workspace-key="{{../key}}" data-key="{{key}}">{{name}}</a>
+                {{#if subname}}<div class="subtitle">{{subname}}</div>{{/if}}
+              </li>
+            {{/each}}
+          </ul>
+        {{/if}}
+      </li>
+    {{/eachReverse}}
+  </ul>
+</div>
\ No newline at end of file
index 59ca2b3d9a1f81ba970a58fbf263a20e23ead1e4..26ab8daf9f4b7a6b65c4d545948ee11412c414ad 100644 (file)
@@ -25,6 +25,10 @@ define(['handlebars', 'moment'], function (Handlebars, moment) {
 
   var defaultActions = ['comment', 'assign', 'assign_to_me', 'plan', 'set_severity'];
 
+  Handlebars.registerHelper('log', function(variable) {
+    console.log(variable);
+  });
+
   Handlebars.registerHelper('capitalize', function(string) {
     return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
   });
@@ -41,6 +45,12 @@ define(['handlebars', 'moment'], function (Handlebars, moment) {
     );
   });
 
+  Handlebars.registerHelper('alertIconClass', function(alert) {
+    return new Handlebars.SafeString(
+        'icon-alert-' + alert.toLowerCase()
+    );
+  });
+
   Handlebars.registerHelper('qualifierIcon', function(qualifier) {
     return new Handlebars.SafeString(
         qualifier ? '<i class="icon-qualifier-' + qualifier.toLowerCase() + '"></i>': ''
index dbd06913cd255bebe8caf55740400edfe7122808..8b15965f168f93d34559b398d4a0f8961820feac 100644 (file)
@@ -38,6 +38,8 @@
   a:hover { text-decoration: underline; }
 }
 
+.component-viewer-workspace-container { position: relative; }
+
 .component-viewer-workspace-list {
   display: none;
   width: @workspaceWidth;
@@ -77,7 +79,7 @@
 
 .component-viewer-workspace-toggle {
   position: absolute;
-  top: 0; right: 0;
+  top: 0; right: -30px;
   .size(30px, 30px);
   .trans;
 
   }
 }
 
-.component-viewer-popup-section + .component-viewer-popup-section {
-  margin-top: 10px;
+.component-viewer-popup-section {
+  width: 300px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
-.component-viewer-popup-section-title {
-  color: #777;
-  font-size: @smallFontSize;
+.component-viewer-popup-section + .component-viewer-popup-section {
+  margin-top: 10px;
 }
 
 .component-viewer-popup-list {
 .component-viewer-popup-test {
   position: relative;
   display: block;
-  height: 24px;
-  line-height: 24px;
+  height: 16px;
+  line-height: 16px;
+}
 
-  &:hover {
-    .component-viewer-popup-test-name { text-decoration: underline; }
-  }
+.component-viewer-popup-test-file {
 }
 
 .component-viewer-popup-test-name {
   display: block;
-  width: 240px;
   border-left: 20px solid transparent;
   border-right: 44px solid transparent;
   .box-sizing(border-box);
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
 .component-viewer-popup-test-status {
   position: absolute;
-  top: 0; left: 0;
-  line-height: 24px;
+  top: 0; left: 0
 }
 
 .component-viewer-popup-test-duration {