From 277f4ed0a860f676d7fbaf239da723e0ae6f34f6 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 28 Jan 2013 17:14:45 +0100 Subject: [PATCH] SONAR-4092 Use new Test API to display tests data --- .../resources/org/sonar/l10n/core.properties | 1 + .../plugins/core/web/tests_viewer.html.erb | 87 +++++++++++++++---- .../java/org/sonar/server/ui/JRubyFacade.java | 30 ++++--- 3 files changed, 88 insertions(+), 30 deletions(-) diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties index 21c9021108d..1ec039bb182 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -1170,6 +1170,7 @@ test_viewer.unit_test_name=Unit test name test_viewer.skipped=skipped test_viewer.expand=expand test_viewer.collapse=collapse +test_viewer.covered_lines=Covered Lines #------------------------------------------------------------------------------ diff --git a/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/web/tests_viewer.html.erb b/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/web/tests_viewer.html.erb index af3909f8a61..b043a58fa10 100644 --- a/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/web/tests_viewer.html.erb +++ b/plugins/sonar-core-plugin/src/main/resources/org/sonar/plugins/core/web/tests_viewer.html.erb @@ -9,7 +9,7 @@ tests = measure('tests') tests_display = tests ? format_measure(tests) : "-" skipped_tests = measure('skipped_tests') - if !skipped_tests.nil? + if skipped_tests tests_display = tests_display + " (+" + format_measure(skipped_tests) + " " + message('test_viewer.skipped') + ")" end %> @@ -29,49 +29,98 @@ -<% test_data = measure('test_data') %> -<% if test_data %> - +<% + test_cases = [] + has_covered_lines = false + + test_data = measure('test_data') + if test_data + blocks = REXML::Document.new test_data.data + blocks.elements.each("tests-details/testcase") do |block| + test_case = {} + test_case[:name] = block.attributes['name'] + test_case[:status] = block.attributes['status'] + test_case[:time] = block.attributes['time'] + + error = block.elements['error'] + block_message = !error.nil? ? error : nil + failure = block.elements['failure'] + block_message = !failure.nil? ? failure : block_message + test_case[:message] = block_message.attributes['message'] if block_message + test_case[:stack_trace] = block_message.first.to_s if test_case[:message] + test_cases << test_case + end + else + # New Test API + test_plan = controller.java_facade.getTestPlan(@snapshot.id) + if test_plan + test_plan.testCases().each do |test| + test_case = {} + test_case[:name] = test.name() + test_case[:status] = test.status() + test_case[:time] = test.durationInMs() + test_case[:covered_lines] = 0 + if test.coveredBlocks() + has_covered_lines = true + test.coveredBlocks().each do |covered_block| + test_case[:covered_lines] += covered_block.lines().size + end + end + if test.status() != 'ok' + test_case[:message] = '' + test_case[:message] = test.message() if test.message() + test_case[:stack_trace] = test.stackTrace() + end + test_cases << test_case + end + end + end +%> +<% if !test_cases.empty? %> +
+ <% if has_covered_lines %> + + <% end %> <% - index = 0 - blocks = REXML::Document.new test_data.data - blocks.elements.each("tests-details/testcase") do |block| + test_cases.each_with_index do |test_case, index| %> - <% index = index+1 %> " id="testdata_<%= index -%>" display="table-row"> <% - status = block.attributes['status'] + status = test_case[:status] case status + when 'ok' + icon_url = ApplicationController.root_context + "/images/levels/ok.png" when 'failure' icon_url = ApplicationController.root_context + "/images/warning.png" + when 'error' + icon_url = ApplicationController.root_context + "/images/levels/error.png" when 'skipped' icon_url = ApplicationController.root_context + "/images/levels/none.png" else icon_url = ApplicationController.root_context + "/images/levels/" + status + ".png" end - error = block.elements['error'] - block_message = !error.nil? ? error : nil - failure = block.elements['failure'] - block_message = !failure.nil? ? failure : block_message %> - + + <% if has_covered_lines %> + + <% end %> diff --git a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java index 154f832d36b..91ad3935e97 100644 --- a/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java +++ b/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java @@ -20,7 +20,6 @@ package org.sonar.server.ui; import com.google.common.collect.ListMultimap; -import com.google.common.collect.Lists; import org.slf4j.LoggerFactory; import org.sonar.api.CoreProperties; import org.sonar.api.config.License; @@ -37,6 +36,7 @@ import org.sonar.api.resources.ResourceType; import org.sonar.api.resources.ResourceTypes; import org.sonar.api.rules.RulePriority; import org.sonar.api.rules.RuleRepository; +import org.sonar.api.test.TestPlan; import org.sonar.api.utils.ValidationMessages; import org.sonar.api.web.Footer; import org.sonar.api.web.NavigationSection; @@ -47,6 +47,7 @@ import org.sonar.api.workflow.Review; import org.sonar.api.workflow.internal.DefaultReview; import org.sonar.api.workflow.internal.DefaultWorkflowContext; import org.sonar.api.workflow.screen.Screen; +import org.sonar.core.component.PerspectiveLoaders; import org.sonar.core.i18n.RuleI18nManager; import org.sonar.core.measure.MeasureFilterEngine; import org.sonar.core.measure.MeasureFilterResult; @@ -86,6 +87,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static com.google.common.collect.Lists.newArrayList; + public final class JRubyFacade { private static final JRubyFacade SINGLETON = new JRubyFacade(); @@ -95,6 +98,10 @@ public final class JRubyFacade { return SINGLETON; } + public static String markdownToHtml(String input) { + return Markdown.convertToHtml(input); + } + private T get(Class componentType) { return getContainer().getComponentByType(componentType); } @@ -128,7 +135,7 @@ public final class JRubyFacade { } public List getQualifiersWithProperty(final String propertyKey) { - List qualifiers = Lists.newArrayList(); + List qualifiers = newArrayList(); for (ResourceType type : getResourceTypes()) { if (type.getBooleanProperty(propertyKey) == Boolean.TRUE) { qualifiers.add(type.getQualifier()); @@ -205,10 +212,6 @@ public final class JRubyFacade { } } - public static String markdownToHtml(String input) { - return Markdown.convertToHtml(input); - } - public List> getWidgets(String resourceScope, String resourceQualifier, String resourceLanguage, Object[] availableMeasures) { return get(Views.class).getWidgets(resourceScope, resourceQualifier, resourceLanguage, (String[]) availableMeasures); } @@ -319,7 +322,7 @@ public final class JRubyFacade { public void ruleSeverityChanged(int parentProfileId, int activeRuleId, int oldSeverityId, int newSeverityId, String userName) { getProfilesManager().ruleSeverityChanged(parentProfileId, activeRuleId, RulePriority.values()[oldSeverityId], - RulePriority.values()[newSeverityId], userName); + RulePriority.values()[newSeverityId], userName); } public void ruleDeactivated(int parentProfileId, int deactivatedRuleId, String userName) { @@ -515,10 +518,10 @@ public final class JRubyFacade { // notifier is null when creating the administrator in the migration script 011. if (notifier != null) { notifier.onNewUser(NewUserHandler.Context.builder() - .setLogin(fields.get("login")) - .setName(fields.get("name")) - .setEmail(fields.get("email")) - .build()); + .setLogin(fields.get("login")) + .setName(fields.get("name")) + .setEmail(fields.get("email")) + .build()); } } @@ -537,4 +540,9 @@ public final class JRubyFacade { public String getPeriodAbbreviation(int periodIndex) { return get(Periods.class).abbreviation(periodIndex); } + + public TestPlan getTestPlan(long snapshotId) { + return (TestPlan) get(PerspectiveLoaders.class).as(snapshotId, "testplan"); + } + } -- 2.39.5
  <%= message('test_viewer.duration') -%><%= message('test_viewer.covered_lines') -%><%= message('test_viewer.unit_test_name') -%>
<%= block.attributes['time'] -%> ms<%= test_case[:time] -%> ms<%= number_with_precision(test_case[:covered_lines], :precision => 0) -%> - <% name = block.attributes['name'] %> - <% if !block_message.nil? %> + <% name = test_case[:name] %> + <% if test_case[:message] %> <%= name -%> <% else %> @@ -79,13 +128,13 @@ <% end %> - <% if !block_message.nil? %> + <% if test_case[:message] %> <% end %>